@kcuf/fetcher-interceptor-login 0.2.8 → 0.3.0

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,29 @@
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 _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
+ var _const = require("../const");
10
+ /**
11
+ * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,
12
+ * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回
13
+ */
14
+ function messageListenInterceptorLogin(callback) {
15
+ function listener(e) {
16
+ if (!e.data || (0, _typeof2.default)(e.data) !== 'object') {
17
+ return;
18
+ }
19
+ if (e.data.type === _const.MESSAGE_TYPE_LOGIN_SUCCESS) {
20
+ callback(true, e.data.payload);
21
+ } else if (e.data.type === _const.MESSAGE_TYPE_LOGIN_ERROR) {
22
+ callback(false, e.data.payload);
23
+ }
24
+ }
25
+ window.addEventListener('message', listener);
26
+ return function () {
27
+ return window.removeEventListener('message', listener);
28
+ };
29
+ }
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
  }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = singletonPromise;
7
7
  var _fetcher = require("@kcuf/fetcher");
8
+ var _const = require("../const");
8
9
  function singletonPromise(fn) {
9
10
  var queue = null;
10
11
  function resolveQueue(data) {
@@ -14,6 +15,10 @@ function singletonPromise(fn) {
14
15
  });
15
16
  queue = null;
16
17
  }
18
+ window.postMessage({
19
+ type: _const.MESSAGE_TYPE_LOGIN_SUCCESS,
20
+ payload: data
21
+ }, location.origin);
17
22
  }
18
23
  function rejectQueue(err) {
19
24
  if (queue) {
@@ -22,6 +27,10 @@ function singletonPromise(fn) {
22
27
  });
23
28
  queue = null;
24
29
  }
30
+ window.postMessage({
31
+ type: _const.MESSAGE_TYPE_LOGIN_ERROR,
32
+ payload: err
33
+ }, location.origin);
25
34
  }
26
35
  return function () {
27
36
  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,23 @@
1
+ import _typeof from "@babel/runtime/helpers/typeof";
2
+ import { MESSAGE_TYPE_LOGIN_SUCCESS, MESSAGE_TYPE_LOGIN_ERROR } from '../const';
3
+ /**
4
+ * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,
5
+ * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回
6
+ */
7
+ export default function messageListenInterceptorLogin(callback) {
8
+ function listener(e) {
9
+ if (!e.data || _typeof(e.data) !== 'object') {
10
+ return;
11
+ }
12
+ if (e.data.type === MESSAGE_TYPE_LOGIN_SUCCESS) {
13
+ callback(true, e.data.payload);
14
+ } else if (e.data.type === MESSAGE_TYPE_LOGIN_ERROR) {
15
+ callback(false, e.data.payload);
16
+ }
17
+ }
18
+ window.addEventListener('message', listener);
19
+ return function () {
20
+ return window.removeEventListener('message', listener);
21
+ };
22
+ }
23
+ //# sourceMappingURL=message-listen-interceptor-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-listen-interceptor-login.js","names":["MESSAGE_TYPE_LOGIN_SUCCESS","MESSAGE_TYPE_LOGIN_ERROR","messageListenInterceptorLogin","callback","listener","e","data","_typeof","type","payload","window","addEventListener","removeEventListener"],"sources":["../../../src/helper/message-listen-interceptor-login.ts"],"sourcesContent":["import {\n MESSAGE_TYPE_LOGIN_SUCCESS,\n MESSAGE_TYPE_LOGIN_ERROR\n} from '../const';\n\ninterface IMessageEventData {\n source?: string;\n type?: string;\n payload: unknown;\n}\n\n/**\n * 通常情况下,我们不需要这个,但如果一个应用里有两个不同实例的 fetcher,两个可能同时被调用,就有可能同时触发登录,\n * 这时候就需要用它在登录动作中使用 messageListenInterceptorLogin 来自动触发登录的返回\n */\nexport default function messageListenInterceptorLogin(callback: (logged: boolean, info?: unknown) => void): () => void {\n function listener(e: MessageEvent<IMessageEventData | undefined>): void {\n if (!e.data || typeof e.data !== 'object') {\n return;\n }\n \n if (e.data.type === MESSAGE_TYPE_LOGIN_SUCCESS) {\n callback(true, e.data.payload);\n } else if (e.data.type === MESSAGE_TYPE_LOGIN_ERROR) {\n callback(false, e.data.payload);\n }\n }\n \n window.addEventListener('message', listener);\n \n return () => window.removeEventListener('message', listener);\n}\n"],"mappings":";AAAA,SACEA,0BAA0B,EAC1BC,wBAAwB,QACnB,UAAU;AAQjB;AACA;AACA;AACA;AACA,eAAe,SAASC,6BAA6BA,CAACC,QAAmD,EAAc;EACrH,SAASC,QAAQA,CAACC,CAA8C,EAAQ;IACtE,IAAI,CAACA,CAAC,CAACC,IAAI,IAAIC,OAAA,CAAOF,CAAC,CAACC,IAAI,MAAK,QAAQ,EAAE;MACzC;IACF;IAEA,IAAID,CAAC,CAACC,IAAI,CAACE,IAAI,KAAKR,0BAA0B,EAAE;MAC9CG,QAAQ,CAAC,IAAI,EAAEE,CAAC,CAACC,IAAI,CAACG,OAAO,CAAC;IAChC,CAAC,MAAM,IAAIJ,CAAC,CAACC,IAAI,CAACE,IAAI,KAAKP,wBAAwB,EAAE;MACnDE,QAAQ,CAAC,KAAK,EAAEE,CAAC,CAACC,IAAI,CAACG,OAAO,CAAC;IACjC;EACF;EAEAC,MAAM,CAACC,gBAAgB,CAAC,SAAS,EAAEP,QAAQ,CAAC;EAE5C,OAAO;IAAA,OAAMM,MAAM,CAACE,mBAAmB,CAAC,SAAS,EAAER,QAAQ,CAAC;EAAA;AAC9D","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 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["import {\n FetcherError\n} from '@kcuf/fetcher';\n\nexport interface ICreateInterceptorOptions {\n needLogin(code: string, err: FetcherError): boolean;\n doLogin(): Promise<void>;\n headerKeys?: string[];\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["import {\n FetcherError\n} from '@kcuf/fetcher';\n\nexport interface ICreateInterceptorOptions {\n needLogin(code: string, err: FetcherError): boolean;\n doLogin(): Promise<unknown>;\n headerKeys?: string[];\n}\n"],"mappings":"","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<unknown> | 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,CAAuC,EAAEC,oBAAwC;MAAA,IAAAC,WAAA;MAAA,OAAAP,mBAAA,GAAAQ,IAAA,WAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;UAAA;YAAA,IAC3IjB,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,4 +1,5 @@
1
1
  import { cloneResponseData } from '@kcuf/fetcher';
2
+ import { MESSAGE_TYPE_LOGIN_SUCCESS, MESSAGE_TYPE_LOGIN_ERROR } from '../const';
2
3
  export default function singletonPromise(fn) {
3
4
  var queue = null;
4
5
  function resolveQueue(data) {
@@ -8,6 +9,10 @@ export default function singletonPromise(fn) {
8
9
  });
9
10
  queue = null;
10
11
  }
12
+ window.postMessage({
13
+ type: MESSAGE_TYPE_LOGIN_SUCCESS,
14
+ payload: data
15
+ }, location.origin);
11
16
  }
12
17
  function rejectQueue(err) {
13
18
  if (queue) {
@@ -16,6 +21,10 @@ export default function singletonPromise(fn) {
16
21
  });
17
22
  queue = null;
18
23
  }
24
+ window.postMessage({
25
+ type: MESSAGE_TYPE_LOGIN_ERROR,
26
+ payload: err
27
+ }, location.origin);
19
28
  }
20
29
  return function () {
21
30
  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","MESSAGE_TYPE_LOGIN_SUCCESS","MESSAGE_TYPE_LOGIN_ERROR","singletonPromise","fn","queue","resolveQueue","data","forEach","v","resolve","window","postMessage","type","payload","location","origin","rejectQueue","err","reject","promise","Promise","_queue","push","length","then"],"sources":["../../../src/util/singleton-promise.ts"],"sourcesContent":["import {\n cloneResponseData\n} from '@kcuf/fetcher';\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(data: T): void {\n if (queue) {\n queue.forEach(v => {\n v.resolve(cloneResponseData(data));\n });\n \n queue = null;\n }\n \n window.postMessage({\n type: MESSAGE_TYPE_LOGIN_SUCCESS,\n payload: data\n }, location.origin);\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 window.postMessage({\n type: MESSAGE_TYPE_LOGIN_ERROR,\n payload: err\n }, location.origin);\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;AAEtB,SACEC,0BAA0B,EAC1BC,wBAAwB,QACnB,UAAU;AAOjB,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,CAACV,iBAAiB,CAACO,IAAI,CAAC,CAAC;MACpC,CAAC,CAAC;MAEFF,KAAK,GAAG,IAAI;IACd;IAEAM,MAAM,CAACC,WAAW,CAAC;MACjBC,IAAI,EAAEZ,0BAA0B;MAChCa,OAAO,EAAEP;IACX,CAAC,EAAEQ,QAAQ,CAACC,MAAM,CAAC;EACrB;EAEA,SAASC,WAAWA,CAACC,GAAU,EAAQ;IACrC,IAAIb,KAAK,EAAE;MACTA,KAAK,CAACG,OAAO,CAAC,UAAAC,CAAC,EAAI;QACjBA,CAAC,CAACU,MAAM,CAACD,GAAG,CAAC;MACf,CAAC,CAAC;MAEFb,KAAK,GAAG,IAAI;IACd;IAEAM,MAAM,CAACC,WAAW,CAAC;MACjBC,IAAI,EAAEX,wBAAwB;MAC9BY,OAAO,EAAEI;IACX,CAAC,EAAEH,QAAQ,CAACC,MAAM,CAAC;EACrB;EAEA,OAAO,YAAkB;IACvB,IAAI,CAACX,KAAK,EAAE;MACVA,KAAK,GAAG,EAAE;IACZ;IAEA,IAAMe,OAAO,GAAG,IAAIC,OAAO,CAAI,UAACX,OAAO,EAAES,MAAM,EAAK;MAAA,IAAAG,MAAA;MAClD,CAAAA,MAAA,GAAAjB,KAAK,cAAAiB,MAAA,eAALA,MAAA,CAAOC,IAAI,CAAC;QACVb,OAAO,EAAPA,OAAO;QACPS,MAAM,EAANA;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,IAAId,KAAK,CAACmB,MAAM,KAAK,CAAC,EAAE;MACtBpB,EAAE,CAAC,CAAC,CAACqB,IAAI,CAAC,UAAAlB,IAAI;QAAA,OAAID,YAAY,CAACC,IAAI,CAAC;MAAA,GAAE,UAACW,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, info?: unknown) => void): () => void;
@@ -1 +1,2 @@
1
1
  export { default } from './util/intercept';
2
+ export * from './helper';
@@ -1,6 +1,6 @@
1
1
  import { FetcherError } from '@kcuf/fetcher';
2
2
  export interface ICreateInterceptorOptions {
3
3
  needLogin(code: string, err: FetcherError): boolean;
4
- doLogin(): Promise<void>;
4
+ doLogin(): Promise<unknown>;
5
5
  headerKeys?: string[];
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kcuf/fetcher-interceptor-login",
3
- "version": "0.2.8",
3
+ "version": "0.3.0",
4
4
  "description": "Fetcher interceptor seamless login and redo request.",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -12,7 +12,7 @@
12
12
  "type": "git",
13
13
  "url": "git+https://github.com/justnewbee/kcuf.git"
14
14
  },
15
- "homepage": "https://github.com/justnewbee/kcuf/tree/master/packages-fetcher/fetcher-interceptor-login",
15
+ "homepage": "https://github.com/justnewbee/kcuf/tree/main/packages-fetcher/fetcher-interceptor-login",
16
16
  "bugs": "https://github.com/justnewbee/kcuf/issues",
17
17
  "author": {
18
18
  "name": "Jianchun Wang",
@@ -22,21 +22,21 @@
22
22
  "access": "public"
23
23
  },
24
24
  "devDependencies": {
25
- "@babel/cli": "^7.28.0",
26
- "@babel/core": "^7.28.0",
27
- "@babel/plugin-transform-runtime": "^7.28.0",
28
- "@babel/preset-env": "^7.28.0",
29
- "@babel/preset-typescript": "^7.27.1",
30
- "@vitest/coverage-v8": "^3.2.4",
31
- "fetch-mock": "^12.5.2",
32
- "jsdom": "^26.1.0",
33
- "rimraf": "^6.0.1",
34
- "typescript": "^5.8.3",
35
- "vitest": "^3.2.4",
36
- "@kcuf/ts-config": "^0.0.1"
25
+ "@babel/cli": "^7.28.6",
26
+ "@babel/core": "^7.28.6",
27
+ "@babel/plugin-transform-runtime": "^7.28.5",
28
+ "@babel/preset-env": "^7.28.6",
29
+ "@babel/preset-typescript": "^7.28.5",
30
+ "@vitest/coverage-v8": "^4.0.17",
31
+ "fetch-mock": "^12.6.0",
32
+ "jsdom": "^27.4.0",
33
+ "rimraf": "^6.1.2",
34
+ "typescript": "^5.9.3",
35
+ "vitest": "^4.0.17",
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
42
  "@kcuf/fetcher": "^0.2.9"