@next-core/easyops-runtime 0.7.24 → 0.7.26

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.
Files changed (59) hide show
  1. package/dist/cjs/analytics/analytics.js.map +1 -1
  2. package/dist/cjs/analytics/http.js.map +1 -1
  3. package/dist/cjs/analytics/index.js.map +1 -1
  4. package/dist/cjs/analytics/interfaces.js.map +1 -1
  5. package/dist/cjs/analytics/pageView.js.map +1 -1
  6. package/dist/cjs/analytics/transport.js.map +1 -1
  7. package/dist/cjs/auth-v2.js.map +1 -1
  8. package/dist/cjs/auth.js.map +1 -1
  9. package/dist/cjs/checkInstalledApps.js.map +1 -1
  10. package/dist/cjs/checkPermissions.js.map +1 -1
  11. package/dist/cjs/flowApi/CollectContracts.js.map +1 -1
  12. package/dist/cjs/flowApi/FlowApi.js.map +1 -1
  13. package/dist/cjs/flowApi/FlowApiProvider.js.map +1 -1
  14. package/dist/cjs/flowApi/index.js.map +1 -1
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/menu/computeMenuData.js.map +1 -1
  17. package/dist/cjs/menu/constants.js.map +1 -1
  18. package/dist/cjs/menu/fetchMenuById.js.map +1 -1
  19. package/dist/cjs/menu/fetchMenuTitle.js.map +1 -1
  20. package/dist/cjs/menu/getMenusOfStandaloneApp.js.map +1 -1
  21. package/dist/cjs/menu/index.js.map +1 -1
  22. package/dist/cjs/menu/interfaces.js.map +1 -1
  23. package/dist/cjs/menu/loadDynamicMenuItems.js.map +1 -1
  24. package/dist/cjs/menu/mergeMenu.js.map +1 -1
  25. package/dist/cjs/menu/reorderMenuItems.js.map +1 -1
  26. package/dist/cjs/websocket/MessageDispatcher.js +26 -26
  27. package/dist/cjs/websocket/MessageDispatcher.js.map +1 -1
  28. package/dist/cjs/websocket/MessageService.js +29 -29
  29. package/dist/cjs/websocket/MessageService.js.map +1 -1
  30. package/dist/esm/analytics/analytics.js.map +1 -1
  31. package/dist/esm/analytics/http.js.map +1 -1
  32. package/dist/esm/analytics/index.js.map +1 -1
  33. package/dist/esm/analytics/interfaces.js.map +1 -1
  34. package/dist/esm/analytics/pageView.js.map +1 -1
  35. package/dist/esm/analytics/transport.js.map +1 -1
  36. package/dist/esm/auth-v2.js.map +1 -1
  37. package/dist/esm/auth.js.map +1 -1
  38. package/dist/esm/checkInstalledApps.js.map +1 -1
  39. package/dist/esm/checkPermissions.js.map +1 -1
  40. package/dist/esm/flowApi/CollectContracts.js.map +1 -1
  41. package/dist/esm/flowApi/FlowApi.js.map +1 -1
  42. package/dist/esm/flowApi/FlowApiProvider.js.map +1 -1
  43. package/dist/esm/flowApi/index.js.map +1 -1
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/menu/computeMenuData.js.map +1 -1
  46. package/dist/esm/menu/constants.js.map +1 -1
  47. package/dist/esm/menu/fetchMenuById.js.map +1 -1
  48. package/dist/esm/menu/fetchMenuTitle.js.map +1 -1
  49. package/dist/esm/menu/getMenusOfStandaloneApp.js.map +1 -1
  50. package/dist/esm/menu/index.js.map +1 -1
  51. package/dist/esm/menu/interfaces.js.map +1 -1
  52. package/dist/esm/menu/loadDynamicMenuItems.js.map +1 -1
  53. package/dist/esm/menu/mergeMenu.js.map +1 -1
  54. package/dist/esm/menu/reorderMenuItems.js.map +1 -1
  55. package/dist/esm/websocket/MessageDispatcher.js +5 -5
  56. package/dist/esm/websocket/MessageDispatcher.js.map +1 -1
  57. package/dist/esm/websocket/MessageService.js +3 -3
  58. package/dist/esm/websocket/MessageService.js.map +1 -1
  59. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"mergeMenu.js","names":["_i18n","require","_constants","_loadDynamicMenuItems","mergeMenu","menuList","runtimeContext","helpers","mainMenu","find","menu","type","undefined","validMenuList","injectWithMenus","Map","menuWithI18n","WeakMap","i18n","menuI18nNamespace","menuId","app","appId","instanceId","Object","entries","forEach","lang","resources","addResourceBundle","set","Promise","all","map","loadDynamicMenuItems","_menu$items","items","length","injectMenuGroupId","injectingMenus","get","push","flatMap","processGroupInject","symbolMenuI18nNamespace","symbolOverrideApp","overrideApp","item","_processGroupInject","foundInjectingMenus","groupId","delete","children","concat","injectingMenu","symbolAppId"],"sources":["../../../src/menu/mergeMenu.ts"],"sourcesContent":["import { i18n } from \"@next-core/i18n\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\nimport type {\n RuntimeContext,\n MenuItemRawData,\n MenuRawData,\n RuntimeMenuItemRawData,\n RuntimeMenuRawData,\n RuntimeHelpers,\n} from \"./interfaces.js\";\nimport { loadDynamicMenuItems } from \"./loadDynamicMenuItems.js\";\n\nexport async function mergeMenu(\n menuList: MenuRawData[],\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n): Promise<RuntimeMenuRawData | undefined> {\n const mainMenu = menuList.find((menu) => menu.type !== \"inject\");\n if (!mainMenu) {\n return undefined;\n }\n const validMenuList: MenuRawData[] = [];\n const injectWithMenus = new Map<string, MenuRawData[]>();\n const menuWithI18n = new WeakMap<MenuRawData, string>();\n\n for (const menu of menuList) {\n if (menu.i18n) {\n const menuI18nNamespace = `menu/${menu.menuId}~${menu.app[0].appId}+${\n (menu as { instanceId?: string }).instanceId\n }`;\n // Support any language in `menu.i18n`.\n Object.entries(menu.i18n).forEach(([lang, resources]) => {\n i18n.addResourceBundle(lang, menuI18nNamespace, resources);\n });\n menuWithI18n.set(menu, menuI18nNamespace);\n }\n }\n\n await Promise.all(\n menuList.map((menu) =>\n loadDynamicMenuItems(menu, runtimeContext, menuWithI18n, helpers)\n )\n );\n\n for (const menu of menuList) {\n if (menu.items?.length) {\n if (menu.type === \"inject\" && menu.injectMenuGroupId) {\n let injectingMenus = injectWithMenus.get(menu.injectMenuGroupId);\n if (!injectingMenus) {\n injectingMenus = [];\n injectWithMenus.set(menu.injectMenuGroupId, injectingMenus);\n }\n injectingMenus.push(menu);\n } else {\n validMenuList.push(menu);\n }\n }\n }\n\n return {\n ...mainMenu,\n items: validMenuList.flatMap(\n (menu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(menu.items, menu, injectWithMenus, menuWithI18n)!\n ),\n [symbolMenuI18nNamespace]: menuWithI18n.get(mainMenu),\n [symbolOverrideApp]: mainMenu.overrideApp,\n };\n}\n\nfunction processGroupInject(\n items: MenuItemRawData[] | undefined,\n menu: MenuRawData,\n injectWithMenus: Map<string, MenuRawData[]>,\n menuWithI18n: WeakMap<MenuRawData, string>\n): RuntimeMenuItemRawData[] | undefined {\n return items?.map((item) => {\n const foundInjectingMenus =\n item.groupId && injectWithMenus.get(item.groupId);\n if (foundInjectingMenus) {\n // Each menu to be injected with should be injected only once.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n injectWithMenus.delete(item.groupId!);\n }\n return {\n ...item,\n children: (\n processGroupInject(\n item.children,\n menu,\n injectWithMenus,\n menuWithI18n\n ) ?? ([] as RuntimeMenuItemRawData[])\n ).concat(\n foundInjectingMenus\n ? foundInjectingMenus.flatMap(\n (injectingMenu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(\n injectingMenu.items,\n injectingMenu,\n injectWithMenus,\n menuWithI18n\n )!\n )\n : ([] as RuntimeMenuItemRawData[])\n ),\n [symbolAppId]: menu.app[0].appId,\n [symbolMenuI18nNamespace]: menuWithI18n.get(menu),\n [symbolOverrideApp]: menu.overrideApp,\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mergeMenu.js","names":["_i18n","require","_constants","_loadDynamicMenuItems","mergeMenu","menuList","runtimeContext","helpers","mainMenu","find","menu","type","undefined","validMenuList","injectWithMenus","Map","menuWithI18n","WeakMap","i18n","menuI18nNamespace","menuId","app","appId","instanceId","Object","entries","forEach","lang","resources","addResourceBundle","set","Promise","all","map","loadDynamicMenuItems","_menu$items","items","length","injectMenuGroupId","injectingMenus","get","push","flatMap","processGroupInject","symbolMenuI18nNamespace","symbolOverrideApp","overrideApp","item","_processGroupInject","foundInjectingMenus","groupId","delete","children","concat","injectingMenu","symbolAppId"],"sources":["../../../src/menu/mergeMenu.ts"],"sourcesContent":["import { i18n } from \"@next-core/i18n\";\nimport {\n symbolAppId,\n symbolMenuI18nNamespace,\n symbolOverrideApp,\n} from \"./constants.js\";\nimport type {\n RuntimeContext,\n MenuItemRawData,\n MenuRawData,\n RuntimeMenuItemRawData,\n RuntimeMenuRawData,\n RuntimeHelpers,\n} from \"./interfaces.js\";\nimport { loadDynamicMenuItems } from \"./loadDynamicMenuItems.js\";\n\nexport async function mergeMenu(\n menuList: MenuRawData[],\n runtimeContext: RuntimeContext,\n helpers: RuntimeHelpers\n): Promise<RuntimeMenuRawData | undefined> {\n const mainMenu = menuList.find((menu) => menu.type !== \"inject\");\n if (!mainMenu) {\n return undefined;\n }\n const validMenuList: MenuRawData[] = [];\n const injectWithMenus = new Map<string, MenuRawData[]>();\n const menuWithI18n = new WeakMap<MenuRawData, string>();\n\n for (const menu of menuList) {\n if (menu.i18n) {\n const menuI18nNamespace = `menu/${menu.menuId}~${menu.app[0].appId}+${\n (menu as { instanceId?: string }).instanceId\n }`;\n // Support any language in `menu.i18n`.\n Object.entries(menu.i18n).forEach(([lang, resources]) => {\n i18n.addResourceBundle(lang, menuI18nNamespace, resources);\n });\n menuWithI18n.set(menu, menuI18nNamespace);\n }\n }\n\n await Promise.all(\n menuList.map((menu) =>\n loadDynamicMenuItems(menu, runtimeContext, menuWithI18n, helpers)\n )\n );\n\n for (const menu of menuList) {\n if (menu.items?.length) {\n if (menu.type === \"inject\" && menu.injectMenuGroupId) {\n let injectingMenus = injectWithMenus.get(menu.injectMenuGroupId);\n if (!injectingMenus) {\n injectingMenus = [];\n injectWithMenus.set(menu.injectMenuGroupId, injectingMenus);\n }\n injectingMenus.push(menu);\n } else {\n validMenuList.push(menu);\n }\n }\n }\n\n return {\n ...mainMenu,\n items: validMenuList.flatMap(\n (menu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(menu.items, menu, injectWithMenus, menuWithI18n)!\n ),\n [symbolMenuI18nNamespace]: menuWithI18n.get(mainMenu),\n [symbolOverrideApp]: mainMenu.overrideApp,\n };\n}\n\nfunction processGroupInject(\n items: MenuItemRawData[] | undefined,\n menu: MenuRawData,\n injectWithMenus: Map<string, MenuRawData[]>,\n menuWithI18n: WeakMap<MenuRawData, string>\n): RuntimeMenuItemRawData[] | undefined {\n return items?.map((item) => {\n const foundInjectingMenus =\n item.groupId && injectWithMenus.get(item.groupId);\n if (foundInjectingMenus) {\n // Each menu to be injected with should be injected only once.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n injectWithMenus.delete(item.groupId!);\n }\n return {\n ...item,\n children: (\n processGroupInject(\n item.children,\n menu,\n injectWithMenus,\n menuWithI18n\n ) ?? ([] as RuntimeMenuItemRawData[])\n ).concat(\n foundInjectingMenus\n ? foundInjectingMenus.flatMap(\n (injectingMenu) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n processGroupInject(\n injectingMenu.items,\n injectingMenu,\n injectWithMenus,\n menuWithI18n\n )!\n )\n : ([] as RuntimeMenuItemRawData[])\n ),\n [symbolAppId]: menu.app[0].appId,\n [symbolMenuI18nNamespace]: menuWithI18n.get(menu),\n [symbolOverrideApp]: menu.overrideApp,\n };\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"reorderMenuItems.js","names":["_lodash","require","reorderMenu","menuData","items","reorderMenuItems","list","sortMenuItems","map","item","children","sortBy","_item$sort","sort","Infinity"],"sources":["../../../src/menu/reorderMenuItems.ts"],"sourcesContent":["import { sortBy } from \"lodash\";\nimport { MenuItemRawData, MenuRawData } from \"./interfaces.js\";\n\nexport function reorderMenu(menuData: MenuRawData): void {\n menuData.items = reorderMenuItems(menuData.items);\n}\n\nfunction reorderMenuItems(\n list: MenuItemRawData[] | undefined\n): MenuItemRawData[] {\n return sortMenuItems(list).map((item) => ({\n ...item,\n children: reorderMenuItems(item.children),\n }));\n}\n\nfunction sortMenuItems(list: MenuItemRawData[] | undefined): MenuItemRawData[] {\n return sortBy(list, (item) => item.sort ?? -Infinity);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAGO,SAASC,WAAWA,CAACC,QAAqB,EAAQ;EACvDA,QAAQ,CAACC,KAAK,GAAGC,gBAAgB,CAACF,QAAQ,CAACC,KAAK,CAAC;AACnD;AAEA,SAASC,gBAAgBA,CACvBC,IAAmC,EAChB;EACnB,OAAOC,aAAa,CAACD,IAAI,CAAC,CAACE,GAAG,CAAEC,IAAI,KAAM;IACxC,GAAGA,IAAI;IACPC,QAAQ,EAAEL,gBAAgB,CAACI,IAAI,CAACC,QAAQ;EAC1C,CAAC,CAAC,CAAC;AACL;AAEA,SAASH,aAAaA,CAACD,IAAmC,EAAqB;EAC7E,OAAO,IAAAK,cAAM,EAACL,IAAI,EAAGG,IAAI;IAAA,IAAAG,UAAA;IAAA,QAAAA,UAAA,GAAKH,IAAI,CAACI,IAAI,cAAAD,UAAA,cAAAA,UAAA,GAAI,CAACE,QAAQ;EAAA,EAAC;AACvD"}
1
+ {"version":3,"file":"reorderMenuItems.js","names":["_lodash","require","reorderMenu","menuData","items","reorderMenuItems","list","sortMenuItems","map","item","children","sortBy","_item$sort","sort","Infinity"],"sources":["../../../src/menu/reorderMenuItems.ts"],"sourcesContent":["import { sortBy } from \"lodash\";\nimport { MenuItemRawData, MenuRawData } from \"./interfaces.js\";\n\nexport function reorderMenu(menuData: MenuRawData): void {\n menuData.items = reorderMenuItems(menuData.items);\n}\n\nfunction reorderMenuItems(\n list: MenuItemRawData[] | undefined\n): MenuItemRawData[] {\n return sortMenuItems(list).map((item) => ({\n ...item,\n children: reorderMenuItems(item.children),\n }));\n}\n\nfunction sortMenuItems(list: MenuItemRawData[] | undefined): MenuItemRawData[] {\n return sortBy(list, (item) => item.sort ?? -Infinity);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAGO,SAASC,WAAWA,CAACC,QAAqB,EAAQ;EACvDA,QAAQ,CAACC,KAAK,GAAGC,gBAAgB,CAACF,QAAQ,CAACC,KAAK,CAAC;AACnD;AAEA,SAASC,gBAAgBA,CACvBC,IAAmC,EAChB;EACnB,OAAOC,aAAa,CAACD,IAAI,CAAC,CAACE,GAAG,CAAEC,IAAI,KAAM;IACxC,GAAGA,IAAI;IACPC,QAAQ,EAAEL,gBAAgB,CAACI,IAAI,CAACC,QAAQ;EAC1C,CAAC,CAAC,CAAC;AACL;AAEA,SAASH,aAAaA,CAACD,IAAmC,EAAqB;EAC7E,OAAO,IAAAK,cAAM,EAACL,IAAI,EAAGG,IAAI;IAAA,IAAAG,UAAA;IAAA,QAAAA,UAAA,GAAKH,IAAI,CAACI,IAAI,cAAAD,UAAA,cAAAA,UAAA,GAAI,CAACE,QAAQ;EAAA,EAAC;AACvD","ignoreList":[]}
@@ -7,13 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.MessageDispatcher = void 0;
8
8
  var _classPrivateMethodInitSpec2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateMethodInitSpec"));
9
9
  var _classPrivateFieldInitSpec2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldInitSpec"));
10
+ var _classPrivateGetter2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateGetter"));
11
+ var _assertClassBrand2 = _interopRequireDefault(require("@babel/runtime/helpers/assertClassBrand"));
12
+ var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet2"));
13
+ var _classPrivateFieldGet3 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet2"));
10
14
  var _runtime = require("@next-core/runtime");
11
15
  var _lodash = require("lodash");
12
16
  var _MessageService = require("./MessageService.js");
13
- function _classPrivateGetter(s, r, a) { return a(_assertClassBrand(s, r)); }
14
- function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
15
- function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
16
- function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
17
17
  var _ms = /*#__PURE__*/new WeakMap();
18
18
  var _memoizedChannels = /*#__PURE__*/new WeakMap();
19
19
  var _channelPayloads = /*#__PURE__*/new WeakMap();
@@ -30,10 +30,10 @@ class MessageDispatcher {
30
30
  }
31
31
  subscribe(channel, payload) {
32
32
  const stringifiedPayload = JSON.stringify(payload);
33
- return _assertClassBrand(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "sub", channel, payload, stringifiedPayload);
33
+ return (0, _assertClassBrand2.default)(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "sub", channel, payload, stringifiedPayload);
34
34
  }
35
35
  unsubscribe(channel) {
36
- const stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
36
+ const stringifiedPayload = (0, _classPrivateFieldGet3.default)(_channelPayloads, this).get(channel);
37
37
  if (!stringifiedPayload) {
38
38
  const msg = `The message channel to unsubscribe "${channel}" is not found`;
39
39
  // eslint-disable-next-line no-console
@@ -41,19 +41,19 @@ class MessageDispatcher {
41
41
  return Promise.reject(new Error(msg));
42
42
  }
43
43
  const payload = JSON.parse(stringifiedPayload);
44
- const result = _assertClassBrand(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "unsub", channel, payload, stringifiedPayload);
45
- _classPrivateFieldGet(_memoizedChannels, this).sub.delete(stringifiedPayload);
44
+ const result = (0, _assertClassBrand2.default)(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "unsub", channel, payload, stringifiedPayload);
45
+ (0, _classPrivateFieldGet3.default)(_memoizedChannels, this).sub.delete(stringifiedPayload);
46
46
  result.then(() => {
47
- _classPrivateFieldGet(_channelPayloads, this).delete(channel);
47
+ (0, _classPrivateFieldGet3.default)(_channelPayloads, this).delete(channel);
48
48
  });
49
49
  return result;
50
50
  }
51
51
  onMessage(channel, listener) {
52
- let stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
52
+ let stringifiedPayload = (0, _classPrivateFieldGet3.default)(_channelPayloads, this).get(channel);
53
53
  let warned = false;
54
- _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
54
+ (0, _classPrivateGetter2.default)(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
55
55
  if (!stringifiedPayload) {
56
- stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
56
+ stringifiedPayload = (0, _classPrivateFieldGet3.default)(_channelPayloads, this).get(channel);
57
57
  }
58
58
  if (!stringifiedPayload) {
59
59
  if (!warned) {
@@ -69,27 +69,27 @@ class MessageDispatcher {
69
69
  });
70
70
  }
71
71
  onClose(listener) {
72
- _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onClose(listener);
72
+ (0, _classPrivateGetter2.default)(_MessageDispatcher_brand, this, _get_ms).onClose(listener);
73
73
  }
74
74
  reset() {
75
75
  var _classPrivateFieldGet2;
76
- _classPrivateFieldGet(_memoizedChannels, this).sub.clear();
77
- _classPrivateFieldGet(_memoizedChannels, this).unsub.clear();
78
- _classPrivateFieldGet(_channelPayloads, this).clear();
79
- (_classPrivateFieldGet2 = _classPrivateFieldGet(_ms, this)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.reset();
76
+ (0, _classPrivateFieldGet3.default)(_memoizedChannels, this).sub.clear();
77
+ (0, _classPrivateFieldGet3.default)(_memoizedChannels, this).unsub.clear();
78
+ (0, _classPrivateFieldGet3.default)(_channelPayloads, this).clear();
79
+ (_classPrivateFieldGet2 = (0, _classPrivateFieldGet3.default)(_ms, this)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.reset();
80
80
  }
81
81
  }
82
82
  exports.MessageDispatcher = MessageDispatcher;
83
83
  function _get_ms(_this) {
84
- if (!_classPrivateFieldGet(_ms, _this)) {
84
+ if (!(0, _classPrivateFieldGet3.default)(_ms, _this)) {
85
85
  const protocol = location.protocol === "https:" ? "wss:" : "ws:";
86
86
  const url = `${protocol}//${window.location.host}${(0, _runtime.getBasePath)()}api/websocket_service/v1/ws`;
87
- _classPrivateFieldSet(_ms, _this, new _MessageService.MessageService(url));
87
+ (0, _classPrivateFieldSet2.default)(_ms, _this, new _MessageService.MessageService(url));
88
88
  }
89
- return _classPrivateFieldGet(_ms, _this);
89
+ return (0, _classPrivateFieldGet3.default)(_ms, _this);
90
90
  }
91
91
  function _subOrUnsub(type, channel, payload, stringifiedPayload) {
92
- const hit = _classPrivateFieldGet(_memoizedChannels, this)[type].get(stringifiedPayload);
92
+ const hit = (0, _classPrivateFieldGet3.default)(_memoizedChannels, this)[type].get(stringifiedPayload);
93
93
  if (hit) {
94
94
  return hit;
95
95
  }
@@ -99,7 +99,7 @@ function _subOrUnsub(type, channel, payload, stringifiedPayload) {
99
99
  };
100
100
  const promise = new Promise((resolve, reject) => {
101
101
  const identity = getIdentity(payload);
102
- _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
102
+ (0, _classPrivateGetter2.default)(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
103
103
  const isSuccess = response.event === (type === "sub" ? "TOPIC.SUB_SUCCESS" : "TOPIC.UNSUB_SUCCESS");
104
104
  const isFailed = response.event === (type === "sub" ? "TOPIC.SUB_FAILED" : "TOPIC.UNSUB_FAILED");
105
105
  if ((isSuccess || isFailed) &&
@@ -109,12 +109,12 @@ function _subOrUnsub(type, channel, payload, stringifiedPayload) {
109
109
  (isSuccess ? resolve : reject)(response);
110
110
  }
111
111
  });
112
- _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).send(request);
112
+ (0, _classPrivateGetter2.default)(_MessageDispatcher_brand, this, _get_ms).send(request);
113
113
  });
114
114
  if (type === "sub") {
115
- _classPrivateFieldGet(_channelPayloads, this).set(channel, stringifiedPayload);
115
+ (0, _classPrivateFieldGet3.default)(_channelPayloads, this).set(channel, stringifiedPayload);
116
116
  }
117
- _classPrivateFieldGet(_memoizedChannels, this)[type].set(stringifiedPayload, promise);
117
+ (0, _classPrivateFieldGet3.default)(_memoizedChannels, this)[type].set(stringifiedPayload, promise);
118
118
  return promise;
119
119
  }
120
120
  function getIdentity(payload) {
@@ -136,6 +136,6 @@ function matchMessageChannel(stringifiedPayload, responsePayload) {
136
136
  // For `ab.cd.*`:
137
137
  // - Matches `ab.cd.r` or `ab.cd.x.yz`
138
138
  // - DOES NOT match `ab.cd.x/yz` or `ab.x.cd` or `x.ab.cd.yz`
139
- typeof payload.topic === "string" && payload.topic.includes("*") && new RegExp(`^${payload.topic.replace(/([^*]*)\*([^*]*)/g, (m, p1, p2) => `${(0, _lodash.escapeRegExp)(p1)}[^/]*${(0, _lodash.escapeRegExp)(p2)}`)}$`).test(responsePayload.topic));
139
+ typeof payload.topic === "string" && payload.topic.includes("*") && new RegExp(`^${payload.topic.replace(/([^*]*)\*([^*]*)/g, (_m, p1, p2) => `${(0, _lodash.escapeRegExp)(p1)}[^/]*${(0, _lodash.escapeRegExp)(p2)}`)}$`).test(responsePayload.topic));
140
140
  }
141
141
  //# sourceMappingURL=MessageDispatcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageDispatcher.js","names":["_runtime","require","_lodash","_MessageService","_classPrivateGetter","s","r","a","_assertClassBrand","_classPrivateFieldSet","set","_classPrivateFieldGet","get","e","t","n","has","arguments","length","TypeError","_ms","WeakMap","_memoizedChannels","_channelPayloads","_MessageDispatcher_brand","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_subOrUnsub","call","unsubscribe","msg","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","warned","_get_ms","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","exports","_this","protocol","location","url","window","host","getBasePath","MessageService","type","hit","request","promise","resolve","identity","getIdentity","isSuccess","isFailed","send","system","topic","responsePayload","includes","RegExp","replace","m","p1","p2","escapeRegExp","test"],"sources":["../../../src/websocket/MessageDispatcher.ts"],"sourcesContent":["import { getBasePath } from \"@next-core/runtime\";\nimport { escapeRegExp } from \"lodash\";\nimport {\n MessageService,\n type MessageListener,\n CloseListener,\n} from \"./MessageService.js\";\n\ninterface MessageResponse {\n event:\n | \"TOPIC.SUB_SUCCESS\"\n | \"TOPIC.SUB_FAILED\"\n | \"TOPIC.UNSUB_SUCCESS\"\n | \"TOPIC.UNSUB_FAILED\"\n | \"MESSAGE.PUSH\";\n payload: MessagePayload;\n}\n\ninterface MessagePayload {\n source?: string;\n system: string;\n topic: string;\n message?: unknown;\n}\n\nexport class MessageDispatcher {\n #_ms: MessageService | undefined;\n #memoizedChannels = {\n sub: new Map<string, Promise<unknown>>(),\n unsub: new Map<string, Promise<unknown>>(),\n };\n #channelPayloads = new Map<string, string>();\n\n get #ms(): MessageService {\n if (!this.#_ms) {\n const protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const url = `${protocol}//${\n window.location.host\n }${getBasePath()}api/websocket_service/v1/ws`;\n this.#_ms = new MessageService(url);\n }\n return this.#_ms;\n }\n\n subscribe(channel: string, payload: MessagePayload): Promise<unknown> {\n const stringifiedPayload = JSON.stringify(payload);\n return this.#subOrUnsub(\"sub\", channel, payload, stringifiedPayload);\n }\n\n unsubscribe(channel: string): Promise<unknown> {\n const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n const msg = `The message channel to unsubscribe \"${channel}\" is not found`;\n // eslint-disable-next-line no-console\n console.error(msg);\n return Promise.reject(new Error(msg));\n }\n\n const payload = JSON.parse(stringifiedPayload);\n const result = this.#subOrUnsub(\n \"unsub\",\n channel,\n payload,\n stringifiedPayload\n );\n\n this.#memoizedChannels.sub.delete(stringifiedPayload);\n\n result.then(() => {\n this.#channelPayloads.delete(channel);\n });\n\n return result;\n }\n\n onMessage(channel: string, listener: MessageListener): void {\n let stringifiedPayload = this.#channelPayloads.get(channel);\n let warned = false;\n\n this.#ms.onMessage<MessageResponse>((response) => {\n if (!stringifiedPayload) {\n stringifiedPayload = this.#channelPayloads.get(channel);\n }\n if (!stringifiedPayload) {\n if (!warned) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n warned = true;\n }\n return;\n }\n if (\n response.event === \"MESSAGE.PUSH\" &&\n matchMessageChannel(stringifiedPayload, response.payload)\n ) {\n listener(response.payload.message);\n }\n });\n }\n\n onClose(listener: CloseListener): void {\n this.#ms.onClose(listener);\n }\n\n reset(): void {\n this.#memoizedChannels.sub.clear();\n this.#memoizedChannels.unsub.clear();\n this.#channelPayloads.clear();\n this.#_ms?.reset();\n }\n\n #subOrUnsub(\n type: \"sub\" | \"unsub\",\n channel: string,\n payload: MessagePayload,\n stringifiedPayload: string\n ): Promise<unknown> {\n const hit = this.#memoizedChannels[type].get(stringifiedPayload);\n if (hit) {\n return hit;\n }\n const request = {\n event: type === \"sub\" ? \"TOPIC.SUB\" : \"TOPIC.UNSUB\",\n payload,\n };\n const promise = new Promise((resolve, reject) => {\n const identity = getIdentity(payload);\n this.#ms.onMessage<MessageResponse>((response) => {\n const isSuccess =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_SUCCESS\" : \"TOPIC.UNSUB_SUCCESS\");\n const isFailed =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_FAILED\" : \"TOPIC.UNSUB_FAILED\");\n if (\n (isSuccess || isFailed) &&\n // Put this after event type checks, to prevent unnecessary\n // JSON stringify.\n identity === getIdentity(response.payload)\n ) {\n (isSuccess ? resolve : reject)(response);\n }\n });\n this.#ms.send(request);\n });\n\n if (type === \"sub\") {\n this.#channelPayloads.set(channel, stringifiedPayload);\n }\n this.#memoizedChannels[type].set(stringifiedPayload, promise);\n return promise;\n }\n}\n\nfunction getIdentity(payload: MessagePayload) {\n const { system, topic } = payload;\n return JSON.stringify({ system, topic });\n}\n\nfunction matchMessageChannel(\n stringifiedPayload: string,\n responsePayload: MessagePayload\n): boolean {\n const payload = JSON.parse(stringifiedPayload) as MessagePayload;\n return (\n payload.system === responsePayload.system &&\n // Exact match\n (payload.topic === responsePayload.topic ||\n // Wildcards match\n // For `ab.cd.*`:\n // - Matches `ab.cd.r` or `ab.cd.x.yz`\n // - DOES NOT match `ab.cd.x/yz` or `ab.x.cd` or `x.ab.cd.yz`\n (typeof payload.topic === \"string\" &&\n payload.topic.includes(\"*\") &&\n new RegExp(\n `^${payload.topic.replace(\n /([^*]*)\\*([^*]*)/g,\n (m, p1, p2) => `${escapeRegExp(p1)}[^/]*${escapeRegExp(p2)}`\n )}$`\n ).test(responsePayload.topic)))\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MessageDispatcher.js","names":["_runtime","require","_lodash","_MessageService","_ms","WeakMap","_memoizedChannels","_channelPayloads","_MessageDispatcher_brand","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_assertClassBrand2","_subOrUnsub","call","unsubscribe","_classPrivateFieldGet3","get","msg","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","warned","_classPrivateGetter2","_get_ms","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","exports","_this","protocol","location","url","window","host","getBasePath","_classPrivateFieldSet2","MessageService","type","hit","request","promise","resolve","identity","getIdentity","isSuccess","isFailed","send","set","system","topic","responsePayload","includes","RegExp","replace","_m","p1","p2","escapeRegExp","test"],"sources":["../../../src/websocket/MessageDispatcher.ts"],"sourcesContent":["import { getBasePath } from \"@next-core/runtime\";\nimport { escapeRegExp } from \"lodash\";\nimport {\n MessageService,\n type MessageListener,\n CloseListener,\n} from \"./MessageService.js\";\n\ninterface MessageResponse {\n event:\n | \"TOPIC.SUB_SUCCESS\"\n | \"TOPIC.SUB_FAILED\"\n | \"TOPIC.UNSUB_SUCCESS\"\n | \"TOPIC.UNSUB_FAILED\"\n | \"MESSAGE.PUSH\";\n payload: MessagePayload;\n}\n\ninterface MessagePayload {\n source?: string;\n system: string;\n topic: string;\n message?: unknown;\n}\n\nexport class MessageDispatcher {\n #_ms: MessageService | undefined;\n #memoizedChannels = {\n sub: new Map<string, Promise<unknown>>(),\n unsub: new Map<string, Promise<unknown>>(),\n };\n #channelPayloads = new Map<string, string>();\n\n get #ms(): MessageService {\n if (!this.#_ms) {\n const protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const url = `${protocol}//${\n window.location.host\n }${getBasePath()}api/websocket_service/v1/ws`;\n this.#_ms = new MessageService(url);\n }\n return this.#_ms;\n }\n\n subscribe(channel: string, payload: MessagePayload): Promise<unknown> {\n const stringifiedPayload = JSON.stringify(payload);\n return this.#subOrUnsub(\"sub\", channel, payload, stringifiedPayload);\n }\n\n unsubscribe(channel: string): Promise<unknown> {\n const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n const msg = `The message channel to unsubscribe \"${channel}\" is not found`;\n // eslint-disable-next-line no-console\n console.error(msg);\n return Promise.reject(new Error(msg));\n }\n\n const payload = JSON.parse(stringifiedPayload);\n const result = this.#subOrUnsub(\n \"unsub\",\n channel,\n payload,\n stringifiedPayload\n );\n\n this.#memoizedChannels.sub.delete(stringifiedPayload);\n\n result.then(() => {\n this.#channelPayloads.delete(channel);\n });\n\n return result;\n }\n\n onMessage(channel: string, listener: MessageListener): void {\n let stringifiedPayload = this.#channelPayloads.get(channel);\n let warned = false;\n\n this.#ms.onMessage<MessageResponse>((response) => {\n if (!stringifiedPayload) {\n stringifiedPayload = this.#channelPayloads.get(channel);\n }\n if (!stringifiedPayload) {\n if (!warned) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n warned = true;\n }\n return;\n }\n if (\n response.event === \"MESSAGE.PUSH\" &&\n matchMessageChannel(stringifiedPayload, response.payload)\n ) {\n listener(response.payload.message);\n }\n });\n }\n\n onClose(listener: CloseListener): void {\n this.#ms.onClose(listener);\n }\n\n reset(): void {\n this.#memoizedChannels.sub.clear();\n this.#memoizedChannels.unsub.clear();\n this.#channelPayloads.clear();\n this.#_ms?.reset();\n }\n\n #subOrUnsub(\n type: \"sub\" | \"unsub\",\n channel: string,\n payload: MessagePayload,\n stringifiedPayload: string\n ): Promise<unknown> {\n const hit = this.#memoizedChannels[type].get(stringifiedPayload);\n if (hit) {\n return hit;\n }\n const request = {\n event: type === \"sub\" ? \"TOPIC.SUB\" : \"TOPIC.UNSUB\",\n payload,\n };\n const promise = new Promise((resolve, reject) => {\n const identity = getIdentity(payload);\n this.#ms.onMessage<MessageResponse>((response) => {\n const isSuccess =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_SUCCESS\" : \"TOPIC.UNSUB_SUCCESS\");\n const isFailed =\n response.event ===\n (type === \"sub\" ? \"TOPIC.SUB_FAILED\" : \"TOPIC.UNSUB_FAILED\");\n if (\n (isSuccess || isFailed) &&\n // Put this after event type checks, to prevent unnecessary\n // JSON stringify.\n identity === getIdentity(response.payload)\n ) {\n (isSuccess ? resolve : reject)(response);\n }\n });\n this.#ms.send(request);\n });\n\n if (type === \"sub\") {\n this.#channelPayloads.set(channel, stringifiedPayload);\n }\n this.#memoizedChannels[type].set(stringifiedPayload, promise);\n return promise;\n }\n}\n\nfunction getIdentity(payload: MessagePayload) {\n const { system, topic } = payload;\n return JSON.stringify({ system, topic });\n}\n\nfunction matchMessageChannel(\n stringifiedPayload: string,\n responsePayload: MessagePayload\n): boolean {\n const payload = JSON.parse(stringifiedPayload) as MessagePayload;\n return (\n payload.system === responsePayload.system &&\n // Exact match\n (payload.topic === responsePayload.topic ||\n // Wildcards match\n // For `ab.cd.*`:\n // - Matches `ab.cd.r` or `ab.cd.x.yz`\n // - DOES NOT match `ab.cd.x/yz` or `ab.x.cd` or `x.ab.cd.yz`\n (typeof payload.topic === \"string\" &&\n payload.topic.includes(\"*\") &&\n new RegExp(\n `^${payload.topic.replace(\n /([^*]*)\\*([^*]*)/g,\n (_m, p1, p2) => `${escapeRegExp(p1)}[^/]*${escapeRegExp(p2)}`\n )}$`\n ).test(responsePayload.topic)))\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.MessageService = void 0;
8
8
  var _classPrivateMethodInitSpec2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateMethodInitSpec"));
9
9
  var _classPrivateFieldInitSpec2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldInitSpec"));
10
- function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
11
- function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
12
- function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
10
+ var _assertClassBrand2 = _interopRequireDefault(require("@babel/runtime/helpers/assertClassBrand"));
11
+ var _classPrivateFieldGet3 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet2"));
12
+ var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet2"));
13
13
  const RETRY_TIMEOUT_UNIT = 1000;
14
14
  const RETRY_LIMIT = 6;
15
15
  var _url = /*#__PURE__*/new WeakMap();
@@ -30,36 +30,36 @@ class MessageService {
30
30
  (0, _classPrivateFieldInitSpec2.default)(this, _closeListeners, new Set());
31
31
  (0, _classPrivateFieldInitSpec2.default)(this, _retryCount, 0);
32
32
  (0, _classPrivateFieldInitSpec2.default)(this, _closed, false);
33
- _classPrivateFieldSet(_url, this, url);
33
+ (0, _classPrivateFieldSet2.default)(_url, this, url);
34
34
  }
35
35
  send(data) {
36
36
  // Connect when data is sent for the first time
37
- if (!_classPrivateFieldGet(_ws, this)) {
38
- _classPrivateFieldSet(_ws, this, _assertClassBrand(_MessageService_brand, this, _connect).call(this));
37
+ if (!(0, _classPrivateFieldGet3.default)(_ws, this)) {
38
+ (0, _classPrivateFieldSet2.default)(_ws, this, (0, _assertClassBrand2.default)(_MessageService_brand, this, _connect).call(this));
39
39
  }
40
40
  const stringifiedData = JSON.stringify(data);
41
- if (_classPrivateFieldGet(_ws, this).readyState === WebSocket.OPEN) {
42
- _classPrivateFieldGet(_ws, this).send(stringifiedData);
41
+ if ((0, _classPrivateFieldGet3.default)(_ws, this).readyState === WebSocket.OPEN) {
42
+ (0, _classPrivateFieldGet3.default)(_ws, this).send(stringifiedData);
43
43
  } else {
44
- _classPrivateFieldGet(_queuedMessages, this).push(stringifiedData);
44
+ (0, _classPrivateFieldGet3.default)(_queuedMessages, this).push(stringifiedData);
45
45
  }
46
46
  }
47
47
  onMessage(listener) {
48
- _classPrivateFieldGet(_messageListeners, this).add(listener);
48
+ (0, _classPrivateFieldGet3.default)(_messageListeners, this).add(listener);
49
49
  }
50
50
  onClose(listener) {
51
- _classPrivateFieldGet(_closeListeners, this).add(listener);
51
+ (0, _classPrivateFieldGet3.default)(_closeListeners, this).add(listener);
52
52
  }
53
53
  reset() {
54
- _classPrivateFieldGet(_queuedMessages, this).length = 0;
55
- _classPrivateFieldGet(_messageListeners, this).clear();
56
- _classPrivateFieldGet(_closeListeners, this).clear();
54
+ (0, _classPrivateFieldGet3.default)(_queuedMessages, this).length = 0;
55
+ (0, _classPrivateFieldGet3.default)(_messageListeners, this).clear();
56
+ (0, _classPrivateFieldGet3.default)(_closeListeners, this).clear();
57
57
  }
58
58
  close() {
59
59
  var _classPrivateFieldGet2;
60
- _classPrivateFieldSet(_closed, this, true);
61
- if (((_classPrivateFieldGet2 = _classPrivateFieldGet(_ws, this)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.readyState) === WebSocket.OPEN) {
62
- _classPrivateFieldGet(_ws, this).close();
60
+ (0, _classPrivateFieldSet2.default)(_closed, this, true);
61
+ if (((_classPrivateFieldGet2 = (0, _classPrivateFieldGet3.default)(_ws, this)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.readyState) === WebSocket.OPEN) {
62
+ (0, _classPrivateFieldGet3.default)(_ws, this).close();
63
63
  }
64
64
  }
65
65
  }
@@ -67,28 +67,28 @@ exports.MessageService = MessageService;
67
67
  function _connect() {
68
68
  // eslint-disable-next-line no-console
69
69
  console.log("WebSocket connecting ...");
70
- const ws = new WebSocket(_classPrivateFieldGet(_url, this));
70
+ const ws = new WebSocket((0, _classPrivateFieldGet3.default)(_url, this));
71
71
  ws.addEventListener("open", e => {
72
72
  // eslint-disable-next-line no-console
73
73
  console.log("WebSocket open:", e);
74
- _classPrivateFieldSet(_retryCount, this, 0);
75
- for (const msg of _classPrivateFieldGet(_queuedMessages, this)) {
74
+ (0, _classPrivateFieldSet2.default)(_retryCount, this, 0);
75
+ for (const msg of (0, _classPrivateFieldGet3.default)(_queuedMessages, this)) {
76
76
  ws.send(msg);
77
77
  }
78
- _classPrivateFieldGet(_queuedMessages, this).length = 0;
78
+ (0, _classPrivateFieldGet3.default)(_queuedMessages, this).length = 0;
79
79
  });
80
80
  ws.addEventListener("close", e => {
81
- if (_classPrivateFieldGet(_closed, this)) {
81
+ if ((0, _classPrivateFieldGet3.default)(_closed, this)) {
82
82
  return;
83
83
  }
84
84
  // eslint-disable-next-line no-console
85
85
  console.log("WebSocket close:", e);
86
- for (const listener of _classPrivateFieldGet(_closeListeners, this)) {
86
+ for (const listener of (0, _classPrivateFieldGet3.default)(_closeListeners, this)) {
87
87
  listener();
88
88
  }
89
89
  // Error code 1000 means that the connection was closed normally.
90
90
  if (e.code !== 1000) {
91
- _assertClassBrand(_MessageService_brand, this, _reconnect).call(this);
91
+ (0, _assertClassBrand2.default)(_MessageService_brand, this, _reconnect).call(this);
92
92
  }
93
93
  });
94
94
  ws.addEventListener("error", e => {
@@ -99,7 +99,7 @@ function _connect() {
99
99
  });
100
100
  ws.addEventListener("message", e => {
101
101
  const response = JSON.parse(e.data);
102
- for (const listener of _classPrivateFieldGet(_messageListeners, this)) {
102
+ for (const listener of (0, _classPrivateFieldGet3.default)(_messageListeners, this)) {
103
103
  listener(response);
104
104
  }
105
105
  });
@@ -107,19 +107,19 @@ function _connect() {
107
107
  }
108
108
  function _reconnect() {
109
109
  // istanbul ignore next: currently can't mock this
110
- if (_classPrivateFieldGet(_retryCount, this) >= RETRY_LIMIT) {
110
+ if ((0, _classPrivateFieldGet3.default)(_retryCount, this) >= RETRY_LIMIT) {
111
111
  // eslint-disable-next-line no-console
112
112
  console.error("WebSocket connect retry limit exceeded");
113
113
  return;
114
114
  }
115
115
  // Double the timeout for each retry
116
- const delay = Math.pow(2, _classPrivateFieldGet(_retryCount, this)) * RETRY_TIMEOUT_UNIT;
116
+ const delay = Math.pow(2, (0, _classPrivateFieldGet3.default)(_retryCount, this)) * RETRY_TIMEOUT_UNIT;
117
117
  // eslint-disable-next-line no-console
118
118
  console.log("WebSocket will reconnect after %d seconds", delay / 1000);
119
119
  setTimeout(() => {
120
120
  var _this$retryCount, _this$retryCount2;
121
- _classPrivateFieldSet(_retryCount, this, (_this$retryCount = _classPrivateFieldGet(_retryCount, this), _this$retryCount2 = _this$retryCount++, _this$retryCount)), _this$retryCount2;
122
- _classPrivateFieldSet(_ws, this, _assertClassBrand(_MessageService_brand, this, _connect).call(this));
121
+ (0, _classPrivateFieldSet2.default)(_retryCount, this, (_this$retryCount = (0, _classPrivateFieldGet3.default)(_retryCount, this), _this$retryCount2 = _this$retryCount++, _this$retryCount)), _this$retryCount2;
122
+ (0, _classPrivateFieldSet2.default)(_ws, this, (0, _assertClassBrand2.default)(_MessageService_brand, this, _connect).call(this));
123
123
  }, delay);
124
124
  }
125
125
  //# sourceMappingURL=MessageService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageService.js","names":["RETRY_TIMEOUT_UNIT","RETRY_LIMIT","_url","WeakMap","_ws","_queuedMessages","_messageListeners","_closeListeners","_retryCount","_closed","_MessageService_brand","WeakSet","MessageService","constructor","url","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","Set","_classPrivateFieldSet","send","data","_classPrivateFieldGet","_assertClassBrand","_connect","call","stringifiedData","JSON","stringify","readyState","WebSocket","OPEN","push","onMessage","listener","add","onClose","reset","length","clear","close","_classPrivateFieldGet2","exports","console","log","ws","addEventListener","e","msg","code","_reconnect","error","response","parse","delay","Math","pow","setTimeout","_this$retryCount","_this$retryCount2"],"sources":["../../../src/websocket/MessageService.ts"],"sourcesContent":["export type MessageListener<T = unknown> = (response: T) => void;\nexport type CloseListener = () => void;\n\nconst RETRY_TIMEOUT_UNIT = 1000;\nconst RETRY_LIMIT = 6;\n\nexport class MessageService {\n #url: string;\n #ws: WebSocket | undefined;\n #queuedMessages: string[] = [];\n #messageListeners = new Set<MessageListener>();\n #closeListeners = new Set<CloseListener>();\n #retryCount = 0;\n #closed = false;\n\n constructor(url: string) {\n this.#url = url;\n }\n\n #connect(): WebSocket {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket connecting ...\");\n const ws = new WebSocket(this.#url);\n ws.addEventListener(\"open\", (e) => {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket open:\", e);\n this.#retryCount = 0;\n for (const msg of this.#queuedMessages) {\n ws.send(msg);\n }\n this.#queuedMessages.length = 0;\n });\n ws.addEventListener(\"close\", (e) => {\n if (this.#closed) {\n return;\n }\n // eslint-disable-next-line no-console\n console.log(\"WebSocket close:\", e);\n for (const listener of this.#closeListeners) {\n listener();\n }\n // Error code 1000 means that the connection was closed normally.\n if (e.code !== 1000) {\n this.#reconnect();\n }\n });\n ws.addEventListener(\"error\", (e) => {\n // No need to reconnect in error event listener,\n // there will always be a close event along with the error event.\n // eslint-disable-next-line no-console\n console.error(\"WebSocket error:\", e);\n });\n ws.addEventListener(\"message\", (e: MessageEvent<string>) => {\n const response = JSON.parse(e.data);\n for (const listener of this.#messageListeners) {\n listener(response);\n }\n });\n return ws;\n }\n\n #reconnect() {\n // istanbul ignore next: currently can't mock this\n if (this.#retryCount >= RETRY_LIMIT) {\n // eslint-disable-next-line no-console\n console.error(\"WebSocket connect retry limit exceeded\");\n return;\n }\n // Double the timeout for each retry\n const delay = Math.pow(2, this.#retryCount) * RETRY_TIMEOUT_UNIT;\n // eslint-disable-next-line no-console\n console.log(\"WebSocket will reconnect after %d seconds\", delay / 1000);\n setTimeout(() => {\n this.#retryCount++;\n this.#ws = this.#connect();\n }, delay);\n }\n\n send(data: unknown): void {\n // Connect when data is sent for the first time\n if (!this.#ws) {\n this.#ws = this.#connect();\n }\n const stringifiedData = JSON.stringify(data);\n if (this.#ws.readyState === WebSocket.OPEN) {\n this.#ws.send(stringifiedData);\n } else {\n this.#queuedMessages.push(stringifiedData);\n }\n }\n\n onMessage<T = unknown>(listener: MessageListener<T>) {\n this.#messageListeners.add(listener as MessageListener<unknown>);\n }\n\n onClose(listener: CloseListener) {\n this.#closeListeners.add(listener);\n }\n\n reset() {\n this.#queuedMessages.length = 0;\n this.#messageListeners.clear();\n this.#closeListeners.clear();\n }\n\n close() {\n this.#closed = true;\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#ws.close();\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MessageService.js","names":["RETRY_TIMEOUT_UNIT","RETRY_LIMIT","_url","WeakMap","_ws","_queuedMessages","_messageListeners","_closeListeners","_retryCount","_closed","_MessageService_brand","WeakSet","MessageService","constructor","url","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","Set","_classPrivateFieldSet2","send","data","_classPrivateFieldGet3","_assertClassBrand2","_connect","call","stringifiedData","JSON","stringify","readyState","WebSocket","OPEN","push","onMessage","listener","add","onClose","reset","length","clear","close","_classPrivateFieldGet2","exports","console","log","ws","addEventListener","e","msg","code","_reconnect","error","response","parse","delay","Math","pow","setTimeout","_this$retryCount","_this$retryCount2"],"sources":["../../../src/websocket/MessageService.ts"],"sourcesContent":["export type MessageListener<T = unknown> = (response: T) => void;\nexport type CloseListener = () => void;\n\nconst RETRY_TIMEOUT_UNIT = 1000;\nconst RETRY_LIMIT = 6;\n\nexport class MessageService {\n #url: string;\n #ws: WebSocket | undefined;\n #queuedMessages: string[] = [];\n #messageListeners = new Set<MessageListener>();\n #closeListeners = new Set<CloseListener>();\n #retryCount = 0;\n #closed = false;\n\n constructor(url: string) {\n this.#url = url;\n }\n\n #connect(): WebSocket {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket connecting ...\");\n const ws = new WebSocket(this.#url);\n ws.addEventListener(\"open\", (e) => {\n // eslint-disable-next-line no-console\n console.log(\"WebSocket open:\", e);\n this.#retryCount = 0;\n for (const msg of this.#queuedMessages) {\n ws.send(msg);\n }\n this.#queuedMessages.length = 0;\n });\n ws.addEventListener(\"close\", (e) => {\n if (this.#closed) {\n return;\n }\n // eslint-disable-next-line no-console\n console.log(\"WebSocket close:\", e);\n for (const listener of this.#closeListeners) {\n listener();\n }\n // Error code 1000 means that the connection was closed normally.\n if (e.code !== 1000) {\n this.#reconnect();\n }\n });\n ws.addEventListener(\"error\", (e) => {\n // No need to reconnect in error event listener,\n // there will always be a close event along with the error event.\n // eslint-disable-next-line no-console\n console.error(\"WebSocket error:\", e);\n });\n ws.addEventListener(\"message\", (e: MessageEvent<string>) => {\n const response = JSON.parse(e.data);\n for (const listener of this.#messageListeners) {\n listener(response);\n }\n });\n return ws;\n }\n\n #reconnect() {\n // istanbul ignore next: currently can't mock this\n if (this.#retryCount >= RETRY_LIMIT) {\n // eslint-disable-next-line no-console\n console.error(\"WebSocket connect retry limit exceeded\");\n return;\n }\n // Double the timeout for each retry\n const delay = Math.pow(2, this.#retryCount) * RETRY_TIMEOUT_UNIT;\n // eslint-disable-next-line no-console\n console.log(\"WebSocket will reconnect after %d seconds\", delay / 1000);\n setTimeout(() => {\n this.#retryCount++;\n this.#ws = this.#connect();\n }, delay);\n }\n\n send(data: unknown): void {\n // Connect when data is sent for the first time\n if (!this.#ws) {\n this.#ws = this.#connect();\n }\n const stringifiedData = JSON.stringify(data);\n if (this.#ws.readyState === WebSocket.OPEN) {\n this.#ws.send(stringifiedData);\n } else {\n this.#queuedMessages.push(stringifiedData);\n }\n }\n\n onMessage<T = unknown>(listener: MessageListener<T>) {\n this.#messageListeners.add(listener as MessageListener<unknown>);\n }\n\n onClose(listener: CloseListener) {\n this.#closeListeners.add(listener);\n }\n\n reset() {\n this.#queuedMessages.length = 0;\n this.#messageListeners.clear();\n this.#closeListeners.clear();\n }\n\n close() {\n this.#closed = true;\n if (this.#ws?.readyState === WebSocket.OPEN) {\n this.#ws.close();\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","names":["createTransport","events","initialized","transport","pageState","isFirstPageView","stashedApiMetrics","initialize","api","options","arguments","length","undefined","sendOnExit","createPageView","finishPageView","metric","pageId","generateUUID","lt","route","push","_objectSpread","apiCount","maxApiTimeCost","Math","max","map","duration","size","filter","reduce","prev","current","item","emit","earlyFinishPageView","pushApiMetric","type","url","URL","createObjectURL","Blob","uuid","substring","lastIndexOf","revokeObjectURL"],"sources":["../../../src/analytics/analytics.ts"],"sourcesContent":["import type {\n ApiMetric,\n ApiPageState,\n PartialPageViewMetric,\n} from \"./interfaces.js\";\nimport { createTransport, events, TransportOptions } from \"./transport.js\";\n\nlet initialized = false;\nlet transport: ReturnType<typeof createTransport>;\nlet pageState: ApiPageState | null = null;\nlet isFirstPageView = true;\nconst stashedApiMetrics: ApiMetric[] = [];\n\ntype Options = Partial<TransportOptions>;\n\nexport function initialize(api: string, options: Options = {}) {\n if (initialized) {\n return;\n }\n initialized = true;\n if (!transport) {\n transport = createTransport(api, options);\n transport.sendOnExit();\n }\n}\n\nexport function createPageView() {\n stashedApiMetrics.length = 0;\n pageState = null;\n}\n\nexport function finishPageView(metric: PartialPageViewMetric) {\n const pageId = generateUUID();\n const { lt, route } = metric;\n pageState = { lt, route, pageId };\n\n events.push({\n ...metric,\n pageId,\n apiCount: stashedApiMetrics.length,\n maxApiTimeCost: Math.max(\n 0,\n ...stashedApiMetrics.map((api) => api.duration)\n ),\n size: stashedApiMetrics\n .map((api) => api.size)\n .filter((size) => size > 0)\n .reduce((prev, current) => prev + current, 0),\n });\n\n for (const item of stashedApiMetrics) {\n events.push({\n ...item,\n ...pageState,\n });\n }\n stashedApiMetrics.length = 0;\n\n transport.emit();\n}\n\nexport function earlyFinishPageView() {\n events.push(...stashedApiMetrics);\n stashedApiMetrics.length = 0;\n}\n\nexport function pushApiMetric(metric: ApiMetric) {\n if (pageState) {\n events.push({\n ...metric,\n type: \"apiRequest\",\n ...pageState,\n });\n } else {\n stashedApiMetrics.push(metric);\n }\n}\n\n// Ref https://medium.com/teads-engineering/generating-uuids-at-scale-on-the-web-2877f529d2a2\nfunction generateUUID() {\n const url = URL.createObjectURL(new Blob([]));\n let uuid = url.substring(url.lastIndexOf(\"/\") + 1);\n URL.revokeObjectURL(url);\n // 第一次渲染加上特殊标记\n if (isFirstPageView) {\n uuid = \"88-\" + uuid;\n isFirstPageView = false;\n }\n return uuid;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"analytics.js","names":["createTransport","events","initialized","transport","pageState","isFirstPageView","stashedApiMetrics","initialize","api","options","arguments","length","undefined","sendOnExit","createPageView","finishPageView","metric","pageId","generateUUID","lt","route","push","_objectSpread","apiCount","maxApiTimeCost","Math","max","map","duration","size","filter","reduce","prev","current","item","emit","earlyFinishPageView","pushApiMetric","type","url","URL","createObjectURL","Blob","uuid","substring","lastIndexOf","revokeObjectURL"],"sources":["../../../src/analytics/analytics.ts"],"sourcesContent":["import type {\n ApiMetric,\n ApiPageState,\n PartialPageViewMetric,\n} from \"./interfaces.js\";\nimport { createTransport, events, TransportOptions } from \"./transport.js\";\n\nlet initialized = false;\nlet transport: ReturnType<typeof createTransport>;\nlet pageState: ApiPageState | null = null;\nlet isFirstPageView = true;\nconst stashedApiMetrics: ApiMetric[] = [];\n\ntype Options = Partial<TransportOptions>;\n\nexport function initialize(api: string, options: Options = {}) {\n if (initialized) {\n return;\n }\n initialized = true;\n if (!transport) {\n transport = createTransport(api, options);\n transport.sendOnExit();\n }\n}\n\nexport function createPageView() {\n stashedApiMetrics.length = 0;\n pageState = null;\n}\n\nexport function finishPageView(metric: PartialPageViewMetric) {\n const pageId = generateUUID();\n const { lt, route } = metric;\n pageState = { lt, route, pageId };\n\n events.push({\n ...metric,\n pageId,\n apiCount: stashedApiMetrics.length,\n maxApiTimeCost: Math.max(\n 0,\n ...stashedApiMetrics.map((api) => api.duration)\n ),\n size: stashedApiMetrics\n .map((api) => api.size)\n .filter((size) => size > 0)\n .reduce((prev, current) => prev + current, 0),\n });\n\n for (const item of stashedApiMetrics) {\n events.push({\n ...item,\n ...pageState,\n });\n }\n stashedApiMetrics.length = 0;\n\n transport.emit();\n}\n\nexport function earlyFinishPageView() {\n events.push(...stashedApiMetrics);\n stashedApiMetrics.length = 0;\n}\n\nexport function pushApiMetric(metric: ApiMetric) {\n if (pageState) {\n events.push({\n ...metric,\n type: \"apiRequest\",\n ...pageState,\n });\n } else {\n stashedApiMetrics.push(metric);\n }\n}\n\n// Ref https://medium.com/teads-engineering/generating-uuids-at-scale-on-the-web-2877f529d2a2\nfunction generateUUID() {\n const url = URL.createObjectURL(new Blob([]));\n let uuid = url.substring(url.lastIndexOf(\"/\") + 1);\n URL.revokeObjectURL(url);\n // 第一次渲染加上特殊标记\n if (isFirstPageView) {\n uuid = \"88-\" + uuid;\n isFirstPageView = false;\n }\n return uuid;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":["HttpResponseError","HttpParseError","HttpAbortError","isObject","getAuth","pushApiMetric","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","_code","_message","_traceId","userInstanceId","uid","username","code","message","traceId","size","status","headers","data","isHttpResponseError","responseJson","Headers","get","_ver","page","location","href","duration","api","type","msg","Number","Promise","reject"],"sources":["../../../src/analytics/http.ts"],"sourcesContent":["import {\n HttpResponseError,\n HttpParseError,\n HttpAbortError,\n type HttpError,\n type HttpRequestConfig,\n type HttpResponse,\n} from \"@next-core/http\";\nimport { isObject } from \"@next-core/utils/general\";\nimport { getAuth } from \"../auth.js\";\nimport type { HttpAnalyticsMeta } from \"./interfaces.js\";\nimport { pushApiMetric } from \"./analytics.js\";\n\nconst symbolHttpAnalytics = Symbol(\"HttpAnalytics\");\n\ninterface HttpRequestConfigWithAnalyticsMeta extends HttpRequestConfig {\n [symbolHttpAnalytics]?: HttpAnalyticsMeta;\n}\n\nexport function onRequest(\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpRequestConfig {\n const perfStartTime = Math.round(performance.now());\n const st = Date.now();\n config[symbolHttpAnalytics] = {\n st,\n time: Math.round(st / 1000),\n perfStartTime,\n };\n return config;\n}\n\nexport function onResponse(\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse {\n return onResponseOrError(false, response, config);\n}\n\nexport function onResponseError(\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError> {\n return onResponseOrError(true, error, config);\n}\n\nfunction onResponseOrError(\n hasError: false,\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse;\nfunction onResponseOrError(\n hasError: true,\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError>;\nfunction onResponseOrError(\n hasError: boolean,\n responseOrError: HttpResponse | HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse | Promise<HttpError> {\n const perfEndTime = Math.round(performance.now());\n const et = Date.now();\n const { [symbolHttpAnalytics]: meta, url } = config;\n if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {\n delete config[symbolHttpAnalytics];\n const { st, time, perfStartTime } = meta;\n const { userInstanceId: uid, username } = getAuth();\n\n let code: number | undefined;\n let message: string | undefined;\n let traceId: string | null | undefined;\n let size: string | null | undefined;\n let status: number | undefined;\n\n let headers: Headers | undefined;\n let data: unknown;\n\n if (hasError) {\n const isHttpResponseError = responseOrError instanceof HttpResponseError;\n if (isHttpResponseError || responseOrError instanceof HttpParseError) {\n ({ status, headers } = responseOrError.response);\n if (isHttpResponseError) {\n data = responseOrError.responseJson;\n }\n }\n } else {\n ({ status, data, headers } = responseOrError as HttpResponse);\n }\n\n if (isObject(data)) {\n ({ code, message } = data as { code?: number; message?: string });\n }\n\n if (headers instanceof Headers) {\n traceId = headers.get(\"x-b3-traceid\");\n size = headers.get(\"content-length\");\n }\n\n pushApiMetric({\n st,\n _ver: st,\n uid,\n username,\n time,\n et,\n page: location.href,\n duration: perfEndTime - perfStartTime,\n api: url,\n type: \"api\",\n code: code ?? -1,\n msg: message ?? \"\",\n status,\n traceId: traceId ?? \"\",\n size: size ? Number(size) : -1,\n });\n }\n\n return hasError\n ? Promise.reject(responseOrError)\n : (responseOrError as HttpResponse);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http.js","names":["HttpResponseError","HttpParseError","HttpAbortError","isObject","getAuth","pushApiMetric","symbolHttpAnalytics","Symbol","onRequest","config","perfStartTime","Math","round","performance","now","st","Date","time","onResponse","response","onResponseOrError","onResponseError","error","hasError","responseOrError","perfEndTime","et","meta","url","_code","_message","_traceId","userInstanceId","uid","username","code","message","traceId","size","status","headers","data","isHttpResponseError","responseJson","Headers","get","_ver","page","location","href","duration","api","type","msg","Number","Promise","reject"],"sources":["../../../src/analytics/http.ts"],"sourcesContent":["import {\n HttpResponseError,\n HttpParseError,\n HttpAbortError,\n type HttpError,\n type HttpRequestConfig,\n type HttpResponse,\n} from \"@next-core/http\";\nimport { isObject } from \"@next-core/utils/general\";\nimport { getAuth } from \"../auth.js\";\nimport type { HttpAnalyticsMeta } from \"./interfaces.js\";\nimport { pushApiMetric } from \"./analytics.js\";\n\nconst symbolHttpAnalytics = Symbol(\"HttpAnalytics\");\n\ninterface HttpRequestConfigWithAnalyticsMeta extends HttpRequestConfig {\n [symbolHttpAnalytics]?: HttpAnalyticsMeta;\n}\n\nexport function onRequest(\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpRequestConfig {\n const perfStartTime = Math.round(performance.now());\n const st = Date.now();\n config[symbolHttpAnalytics] = {\n st,\n time: Math.round(st / 1000),\n perfStartTime,\n };\n return config;\n}\n\nexport function onResponse(\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse {\n return onResponseOrError(false, response, config);\n}\n\nexport function onResponseError(\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError> {\n return onResponseOrError(true, error, config);\n}\n\nfunction onResponseOrError(\n hasError: false,\n response: HttpResponse,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse;\nfunction onResponseOrError(\n hasError: true,\n error: HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): Promise<HttpError>;\nfunction onResponseOrError(\n hasError: boolean,\n responseOrError: HttpResponse | HttpError,\n config: HttpRequestConfigWithAnalyticsMeta\n): HttpResponse | Promise<HttpError> {\n const perfEndTime = Math.round(performance.now());\n const et = Date.now();\n const { [symbolHttpAnalytics]: meta, url } = config;\n if (meta && !(hasError && responseOrError instanceof HttpAbortError)) {\n delete config[symbolHttpAnalytics];\n const { st, time, perfStartTime } = meta;\n const { userInstanceId: uid, username } = getAuth();\n\n let code: number | undefined;\n let message: string | undefined;\n let traceId: string | null | undefined;\n let size: string | null | undefined;\n let status: number | undefined;\n\n let headers: Headers | undefined;\n let data: unknown;\n\n if (hasError) {\n const isHttpResponseError = responseOrError instanceof HttpResponseError;\n if (isHttpResponseError || responseOrError instanceof HttpParseError) {\n ({ status, headers } = responseOrError.response);\n if (isHttpResponseError) {\n data = responseOrError.responseJson;\n }\n }\n } else {\n ({ status, data, headers } = responseOrError as HttpResponse);\n }\n\n if (isObject(data)) {\n ({ code, message } = data as { code?: number; message?: string });\n }\n\n if (headers instanceof Headers) {\n traceId = headers.get(\"x-b3-traceid\");\n size = headers.get(\"content-length\");\n }\n\n pushApiMetric({\n st,\n _ver: st,\n uid,\n username,\n time,\n et,\n page: location.href,\n duration: perfEndTime - perfStartTime,\n api: url,\n type: \"api\",\n code: code ?? -1,\n msg: message ?? \"\",\n status,\n traceId: traceId ?? \"\",\n size: size ? Number(size) : -1,\n });\n }\n\n return hasError\n ? Promise.reject(responseOrError)\n : (responseOrError as HttpResponse);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["http","pageView","initialize"],"sources":["../../../src/analytics/index.ts"],"sourcesContent":["import * as http from \"./http.js\";\nimport * as pageView from \"./pageView.js\";\nimport { initialize } from \"./analytics.js\";\n\nexport { initialize, http, pageView };\n"],"mappings":"AAAA,OAAO,KAAKA,IAAI,MAAM,WAAW;AACjC,OAAO,KAAKC,QAAQ,MAAM,eAAe;AACzC,SAASC,UAAU,QAAQ,gBAAgB;AAE3C,SAASA,UAAU,EAAEF,IAAI,EAAEC,QAAQ"}
1
+ {"version":3,"file":"index.js","names":["http","pageView","initialize"],"sources":["../../../src/analytics/index.ts"],"sourcesContent":["import * as http from \"./http.js\";\nimport * as pageView from \"./pageView.js\";\nimport { initialize } from \"./analytics.js\";\n\nexport { initialize, http, pageView };\n"],"mappings":"AAAA,OAAO,KAAKA,IAAI,MAAM,WAAW;AACjC,OAAO,KAAKC,QAAQ,MAAM,eAAe;AACzC,SAASC,UAAU,QAAQ,gBAAgB;AAE3C,SAASA,UAAU,EAAEF,IAAI,EAAEC,QAAQ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","names":[],"sources":["../../../src/analytics/interfaces.ts"],"sourcesContent":["export interface HttpAnalyticsMeta {\n st: number;\n time: number;\n perfStartTime: number;\n}\n\nexport interface ApiMetric extends BaseMetric {\n type: \"api\" | \"apiRequest\";\n uid: string | undefined;\n duration: number;\n api: string;\n code: number;\n status: number | undefined;\n msg: string;\n traceId: string;\n}\n\nexport interface PageViewMetric extends BaseMetric {\n type: \"page\";\n apiCount: number;\n maxApiTimeCost: number;\n pageTitle: string | undefined;\n lt: number;\n route: string | undefined;\n pageId: string;\n}\n\nexport type PartialPageViewMetric = Omit<\n PageViewMetric,\n \"apiCount\" | \"maxApiTimeCost\" | \"size\" | \"pageId\"\n>;\n\nexport type ApiPageState = Pick<PageViewMetric, \"lt\" | \"route\" | \"pageId\">;\n\nexport interface BaseMetric {\n type: string;\n time: number;\n st: number;\n et: number;\n _ver: number;\n username: string | undefined;\n page: string;\n size: number;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"interfaces.js","names":[],"sources":["../../../src/analytics/interfaces.ts"],"sourcesContent":["export interface HttpAnalyticsMeta {\n st: number;\n time: number;\n perfStartTime: number;\n}\n\nexport interface ApiMetric extends BaseMetric {\n type: \"api\" | \"apiRequest\";\n uid: string | undefined;\n duration: number;\n api: string;\n code: number;\n status: number | undefined;\n msg: string;\n traceId: string;\n}\n\nexport interface PageViewMetric extends BaseMetric {\n type: \"page\";\n apiCount: number;\n maxApiTimeCost: number;\n pageTitle: string | undefined;\n lt: number;\n route: string | undefined;\n pageId: string;\n}\n\nexport type PartialPageViewMetric = Omit<\n PageViewMetric,\n \"apiCount\" | \"maxApiTimeCost\" | \"size\" | \"pageId\"\n>;\n\nexport type ApiPageState = Pick<PageViewMetric, \"lt\" | \"route\" | \"pageId\">;\n\nexport interface BaseMetric {\n type: string;\n time: number;\n st: number;\n et: number;\n _ver: number;\n username: string | undefined;\n page: string;\n size: number;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"pageView.js","names":["createPageView","earlyFinishPageView","finishPageView","getAuth","create","perfStartTime","Math","round","performance","now","startTime","Date","finish","_ref","status","path","pageTitle","renderTime","endTime","username","type","page","location","href","_ver","time","st","et","lt","route","window","dispatchEvent","CustomEvent","detail"],"sources":["../../../src/analytics/pageView.ts"],"sourcesContent":["import type { PageViewInfo } from \"@next-core/runtime\";\nimport {\n createPageView,\n earlyFinishPageView,\n finishPageView,\n} from \"./analytics.js\";\nimport { getAuth } from \"../auth.js\";\n\nexport function create() {\n const perfStartTime = Math.round(performance.now());\n const startTime = Date.now();\n createPageView();\n\n return function finish({ status, path, pageTitle }: PageViewInfo) {\n if (status !== \"ok\") {\n earlyFinishPageView();\n return;\n }\n\n const renderTime = Math.round(performance.now()) - perfStartTime;\n const endTime = Date.now();\n const { username } = getAuth();\n\n finishPageView({\n type: \"page\",\n page: location.href,\n _ver: startTime,\n time: Math.round(startTime / 1000),\n st: startTime,\n et: endTime,\n lt: renderTime,\n pageTitle,\n username,\n route: path,\n });\n\n // For bricks which would take actions with render time.\n window.dispatchEvent(\n new CustomEvent(\"route.render\", {\n detail: {\n renderTime,\n },\n })\n );\n };\n}\n"],"mappings":"AACA,SACEA,cAAc,EACdC,mBAAmB,EACnBC,cAAc,QACT,gBAAgB;AACvB,SAASC,OAAO,QAAQ,YAAY;AAEpC,OAAO,SAASC,MAAMA,CAAA,EAAG;EACvB,IAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC;EACnD,IAAMC,SAAS,GAAGC,IAAI,CAACF,GAAG,CAAC,CAAC;EAC5BT,cAAc,CAAC,CAAC;EAEhB,OAAO,SAASY,MAAMA,CAAAC,IAAA,EAA4C;IAAA,IAA3C;MAAEC,MAAM;MAAEC,IAAI;MAAEC;IAAwB,CAAC,GAAAH,IAAA;IAC9D,IAAIC,MAAM,KAAK,IAAI,EAAE;MACnBb,mBAAmB,CAAC,CAAC;MACrB;IACF;IAEA,IAAMgB,UAAU,GAAGX,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC,GAAGJ,aAAa;IAChE,IAAMa,OAAO,GAAGP,IAAI,CAACF,GAAG,CAAC,CAAC;IAC1B,IAAM;MAAEU;IAAS,CAAC,GAAGhB,OAAO,CAAC,CAAC;IAE9BD,cAAc,CAAC;MACbkB,IAAI,EAAE,MAAM;MACZC,IAAI,EAAEC,QAAQ,CAACC,IAAI;MACnBC,IAAI,EAAEd,SAAS;MACfe,IAAI,EAAEnB,IAAI,CAACC,KAAK,CAACG,SAAS,GAAG,IAAI,CAAC;MAClCgB,EAAE,EAAEhB,SAAS;MACbiB,EAAE,EAAET,OAAO;MACXU,EAAE,EAAEX,UAAU;MACdD,SAAS;MACTG,QAAQ;MACRU,KAAK,EAAEd;IACT,CAAC,CAAC;;IAEF;IACAe,MAAM,CAACC,aAAa,CAClB,IAAIC,WAAW,CAAC,cAAc,EAAE;MAC9BC,MAAM,EAAE;QACNhB;MACF;IACF,CAAC,CACH,CAAC;EACH,CAAC;AACH"}
1
+ {"version":3,"file":"pageView.js","names":["createPageView","earlyFinishPageView","finishPageView","getAuth","create","perfStartTime","Math","round","performance","now","startTime","Date","finish","_ref","status","path","pageTitle","renderTime","endTime","username","type","page","location","href","_ver","time","st","et","lt","route","window","dispatchEvent","CustomEvent","detail"],"sources":["../../../src/analytics/pageView.ts"],"sourcesContent":["import type { PageViewInfo } from \"@next-core/runtime\";\nimport {\n createPageView,\n earlyFinishPageView,\n finishPageView,\n} from \"./analytics.js\";\nimport { getAuth } from \"../auth.js\";\n\nexport function create() {\n const perfStartTime = Math.round(performance.now());\n const startTime = Date.now();\n createPageView();\n\n return function finish({ status, path, pageTitle }: PageViewInfo) {\n if (status !== \"ok\") {\n earlyFinishPageView();\n return;\n }\n\n const renderTime = Math.round(performance.now()) - perfStartTime;\n const endTime = Date.now();\n const { username } = getAuth();\n\n finishPageView({\n type: \"page\",\n page: location.href,\n _ver: startTime,\n time: Math.round(startTime / 1000),\n st: startTime,\n et: endTime,\n lt: renderTime,\n pageTitle,\n username,\n route: path,\n });\n\n // For bricks which would take actions with render time.\n window.dispatchEvent(\n new CustomEvent(\"route.render\", {\n detail: {\n renderTime,\n },\n })\n );\n };\n}\n"],"mappings":"AACA,SACEA,cAAc,EACdC,mBAAmB,EACnBC,cAAc,QACT,gBAAgB;AACvB,SAASC,OAAO,QAAQ,YAAY;AAEpC,OAAO,SAASC,MAAMA,CAAA,EAAG;EACvB,IAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC;EACnD,IAAMC,SAAS,GAAGC,IAAI,CAACF,GAAG,CAAC,CAAC;EAC5BT,cAAc,CAAC,CAAC;EAEhB,OAAO,SAASY,MAAMA,CAAAC,IAAA,EAA4C;IAAA,IAA3C;MAAEC,MAAM;MAAEC,IAAI;MAAEC;IAAwB,CAAC,GAAAH,IAAA;IAC9D,IAAIC,MAAM,KAAK,IAAI,EAAE;MACnBb,mBAAmB,CAAC,CAAC;MACrB;IACF;IAEA,IAAMgB,UAAU,GAAGX,IAAI,CAACC,KAAK,CAACC,WAAW,CAACC,GAAG,CAAC,CAAC,CAAC,GAAGJ,aAAa;IAChE,IAAMa,OAAO,GAAGP,IAAI,CAACF,GAAG,CAAC,CAAC;IAC1B,IAAM;MAAEU;IAAS,CAAC,GAAGhB,OAAO,CAAC,CAAC;IAE9BD,cAAc,CAAC;MACbkB,IAAI,EAAE,MAAM;MACZC,IAAI,EAAEC,QAAQ,CAACC,IAAI;MACnBC,IAAI,EAAEd,SAAS;MACfe,IAAI,EAAEnB,IAAI,CAACC,KAAK,CAACG,SAAS,GAAG,IAAI,CAAC;MAClCgB,EAAE,EAAEhB,SAAS;MACbiB,EAAE,EAAET,OAAO;MACXU,EAAE,EAAEX,UAAU;MACdD,SAAS;MACTG,QAAQ;MACRU,KAAK,EAAEd;IACT,CAAC,CAAC;;IAEF;IACAe,MAAM,CAACC,aAAa,CAClB,IAAIC,WAAW,CAAC,cAAc,EAAE;MAC9BC,MAAM,EAAE;QACNhB;MACF;IACF,CAAC,CACH,CAAC;EACH,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","names":["events","MAXIMUM_WAITING_TIME","MAXIMUM_LOGGED_EVENTS","timer","transportOptions","maxWaitingTime","maxLoggedEvents","createTransport","api","options","Object","assign","_objectSpread","sendOnExit","emit","nextTime","callback","window","requestIdleCallback","requestAnimationFrame","cb","setTimeout","clearTimeout","length","send","transportEvents","splice","transportData","buildTransportData","sendBeacon","requestUrl","data","headers","type","blob","Blob","JSON","stringify","navigator","addEventListener","model","columns"],"sources":["../../../src/analytics/transport.ts"],"sourcesContent":["import { ApiMetric, PageViewMetric } from \"./interfaces.js\";\n\nexport const events: (ApiMetric | PageViewMetric)[] = [];\n\nconst MAXIMUM_WAITING_TIME = 5 * 1000;\nconst MAXIMUM_LOGGED_EVENTS = 10;\nlet timer: any = null;\n\nexport const transportOptions = {\n maxWaitingTime: MAXIMUM_WAITING_TIME,\n maxLoggedEvents: MAXIMUM_LOGGED_EVENTS,\n} as TransportOptions;\n\ntype TransportData = {\n model: string;\n columns: string[];\n data: (ApiMetric | PageViewMetric)[];\n};\n\nexport interface TransportOptions {\n api: string;\n maxWaitingTime: number;\n maxLoggedEvents: number;\n}\n\nexport function createTransport(\n api: string,\n options: Partial<TransportOptions>\n) {\n Object.assign(transportOptions, { ...options, api });\n return {\n sendOnExit,\n emit,\n };\n}\n\nfunction nextTime(callback: (data: unknown) => void): unknown {\n return (\n window.requestIdleCallback ||\n window.requestAnimationFrame ||\n ((cb: (data: Record<string, any>) => void) => setTimeout(cb, 17))\n )(callback);\n}\n\nfunction emit() {\n clearTimeout(timer);\n events.length > transportOptions.maxLoggedEvents\n ? send()\n : (timer = setTimeout(send, transportOptions.maxWaitingTime));\n}\n\nfunction send() {\n if (events.length === 0) {\n return;\n }\n const transportEvents = events.splice(0, transportOptions.maxLoggedEvents);\n const transportData = buildTransportData(transportEvents);\n\n sendBeacon(transportOptions.api, transportData);\n\n events.length && nextTime(send);\n}\n\nfunction sendBeacon(requestUrl: string, data: TransportData) {\n const headers = {\n type: \"application/json\",\n };\n\n const blob = new Blob([JSON.stringify(data)], headers);\n window.navigator.sendBeacon(requestUrl, blob);\n}\n\nfunction sendOnExit() {\n window.addEventListener(\"beforeunload\", send, false);\n}\n\nfunction buildTransportData(data: (ApiMetric | PageViewMetric)[]) {\n return {\n model: \"easyops.FRONTEND_STAT\",\n columns: [\n \"_ver\",\n \"st\",\n \"et\",\n \"lt\",\n \"size\",\n \"time\",\n \"traceId\",\n \"code\",\n \"duration\",\n \"page\",\n \"uid\",\n \"username\",\n \"api\",\n \"type\",\n \"msg\",\n \"status\",\n \"pageId\",\n \"route\",\n \"apiCount\",\n \"maxApiTimeCost\",\n \"apiSizeCost\",\n \"pageTitle\",\n ],\n data,\n };\n}\n"],"mappings":";AAEA,OAAO,IAAMA,MAAsC,GAAG,EAAE;AAExD,IAAMC,oBAAoB,GAAG,CAAC,GAAG,IAAI;AACrC,IAAMC,qBAAqB,GAAG,EAAE;AAChC,IAAIC,KAAU,GAAG,IAAI;AAErB,OAAO,IAAMC,gBAAgB,GAAG;EAC9BC,cAAc,EAAEJ,oBAAoB;EACpCK,eAAe,EAAEJ;AACnB,CAAqB;AAcrB,OAAO,SAASK,eAAeA,CAC7BC,GAAW,EACXC,OAAkC,EAClC;EACAC,MAAM,CAACC,MAAM,CAACP,gBAAgB,EAAAQ,aAAA,CAAAA,aAAA,KAAOH,OAAO;IAAED;EAAG,EAAE,CAAC;EACpD,OAAO;IACLK,UAAU;IACVC;EACF,CAAC;AACH;AAEA,SAASC,QAAQA,CAACC,QAAiC,EAAW;EAC5D,OAAO,CACLC,MAAM,CAACC,mBAAmB,IAC1BD,MAAM,CAACE,qBAAqB,KAC1BC,EAAuC,IAAKC,UAAU,CAACD,EAAE,EAAE,EAAE,CAAC,CAAC,EACjEJ,QAAQ,CAAC;AACb;AAEA,SAASF,IAAIA,CAAA,EAAG;EACdQ,YAAY,CAACnB,KAAK,CAAC;EACnBH,MAAM,CAACuB,MAAM,GAAGnB,gBAAgB,CAACE,eAAe,GAC5CkB,IAAI,CAAC,CAAC,GACLrB,KAAK,GAAGkB,UAAU,CAACG,IAAI,EAAEpB,gBAAgB,CAACC,cAAc,CAAE;AACjE;AAEA,SAASmB,IAAIA,CAAA,EAAG;EACd,IAAIxB,MAAM,CAACuB,MAAM,KAAK,CAAC,EAAE;IACvB;EACF;EACA,IAAME,eAAe,GAAGzB,MAAM,CAAC0B,MAAM,CAAC,CAAC,EAAEtB,gBAAgB,CAACE,eAAe,CAAC;EAC1E,IAAMqB,aAAa,GAAGC,kBAAkB,CAACH,eAAe,CAAC;EAEzDI,UAAU,CAACzB,gBAAgB,CAACI,GAAG,EAAEmB,aAAa,CAAC;EAE/C3B,MAAM,CAACuB,MAAM,IAAIR,QAAQ,CAACS,IAAI,CAAC;AACjC;AAEA,SAASK,UAAUA,CAACC,UAAkB,EAAEC,IAAmB,EAAE;EAC3D,IAAMC,OAAO,GAAG;IACdC,IAAI,EAAE;EACR,CAAC;EAED,IAAMC,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACC,IAAI,CAACC,SAAS,CAACN,IAAI,CAAC,CAAC,EAAEC,OAAO,CAAC;EACtDf,MAAM,CAACqB,SAAS,CAACT,UAAU,CAACC,UAAU,EAAEI,IAAI,CAAC;AAC/C;AAEA,SAASrB,UAAUA,CAAA,EAAG;EACpBI,MAAM,CAACsB,gBAAgB,CAAC,cAAc,EAAEf,IAAI,EAAE,KAAK,CAAC;AACtD;AAEA,SAASI,kBAAkBA,CAACG,IAAoC,EAAE;EAChE,OAAO;IACLS,KAAK,EAAE,uBAAuB;IAC9BC,OAAO,EAAE,CACP,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,SAAS,EACT,MAAM,EACN,UAAU,EACV,MAAM,EACN,KAAK,EACL,UAAU,EACV,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,CACZ;IACDV;EACF,CAAC;AACH"}
1
+ {"version":3,"file":"transport.js","names":["events","MAXIMUM_WAITING_TIME","MAXIMUM_LOGGED_EVENTS","timer","transportOptions","maxWaitingTime","maxLoggedEvents","createTransport","api","options","Object","assign","_objectSpread","sendOnExit","emit","nextTime","callback","window","requestIdleCallback","requestAnimationFrame","cb","setTimeout","clearTimeout","length","send","transportEvents","splice","transportData","buildTransportData","sendBeacon","requestUrl","data","headers","type","blob","Blob","JSON","stringify","navigator","addEventListener","model","columns"],"sources":["../../../src/analytics/transport.ts"],"sourcesContent":["import { ApiMetric, PageViewMetric } from \"./interfaces.js\";\n\nexport const events: (ApiMetric | PageViewMetric)[] = [];\n\nconst MAXIMUM_WAITING_TIME = 5 * 1000;\nconst MAXIMUM_LOGGED_EVENTS = 10;\nlet timer: any = null;\n\nexport const transportOptions = {\n maxWaitingTime: MAXIMUM_WAITING_TIME,\n maxLoggedEvents: MAXIMUM_LOGGED_EVENTS,\n} as TransportOptions;\n\ntype TransportData = {\n model: string;\n columns: string[];\n data: (ApiMetric | PageViewMetric)[];\n};\n\nexport interface TransportOptions {\n api: string;\n maxWaitingTime: number;\n maxLoggedEvents: number;\n}\n\nexport function createTransport(\n api: string,\n options: Partial<TransportOptions>\n) {\n Object.assign(transportOptions, { ...options, api });\n return {\n sendOnExit,\n emit,\n };\n}\n\nfunction nextTime(callback: (data: unknown) => void): unknown {\n return (\n window.requestIdleCallback ||\n window.requestAnimationFrame ||\n ((cb: (data: Record<string, any>) => void) => setTimeout(cb, 17))\n )(callback);\n}\n\nfunction emit() {\n clearTimeout(timer);\n events.length > transportOptions.maxLoggedEvents\n ? send()\n : (timer = setTimeout(send, transportOptions.maxWaitingTime));\n}\n\nfunction send() {\n if (events.length === 0) {\n return;\n }\n const transportEvents = events.splice(0, transportOptions.maxLoggedEvents);\n const transportData = buildTransportData(transportEvents);\n\n sendBeacon(transportOptions.api, transportData);\n\n events.length && nextTime(send);\n}\n\nfunction sendBeacon(requestUrl: string, data: TransportData) {\n const headers = {\n type: \"application/json\",\n };\n\n const blob = new Blob([JSON.stringify(data)], headers);\n window.navigator.sendBeacon(requestUrl, blob);\n}\n\nfunction sendOnExit() {\n window.addEventListener(\"beforeunload\", send, false);\n}\n\nfunction buildTransportData(data: (ApiMetric | PageViewMetric)[]) {\n return {\n model: \"easyops.FRONTEND_STAT\",\n columns: [\n \"_ver\",\n \"st\",\n \"et\",\n \"lt\",\n \"size\",\n \"time\",\n \"traceId\",\n \"code\",\n \"duration\",\n \"page\",\n \"uid\",\n \"username\",\n \"api\",\n \"type\",\n \"msg\",\n \"status\",\n \"pageId\",\n \"route\",\n \"apiCount\",\n \"maxApiTimeCost\",\n \"apiSizeCost\",\n \"pageTitle\",\n ],\n data,\n };\n}\n"],"mappings":";AAEA,OAAO,IAAMA,MAAsC,GAAG,EAAE;AAExD,IAAMC,oBAAoB,GAAG,CAAC,GAAG,IAAI;AACrC,IAAMC,qBAAqB,GAAG,EAAE;AAChC,IAAIC,KAAU,GAAG,IAAI;AAErB,OAAO,IAAMC,gBAAgB,GAAG;EAC9BC,cAAc,EAAEJ,oBAAoB;EACpCK,eAAe,EAAEJ;AACnB,CAAqB;AAcrB,OAAO,SAASK,eAAeA,CAC7BC,GAAW,EACXC,OAAkC,EAClC;EACAC,MAAM,CAACC,MAAM,CAACP,gBAAgB,EAAAQ,aAAA,CAAAA,aAAA,KAAOH,OAAO;IAAED;EAAG,EAAE,CAAC;EACpD,OAAO;IACLK,UAAU;IACVC;EACF,CAAC;AACH;AAEA,SAASC,QAAQA,CAACC,QAAiC,EAAW;EAC5D,OAAO,CACLC,MAAM,CAACC,mBAAmB,IAC1BD,MAAM,CAACE,qBAAqB,KAC1BC,EAAuC,IAAKC,UAAU,CAACD,EAAE,EAAE,EAAE,CAAC,CAAC,EACjEJ,QAAQ,CAAC;AACb;AAEA,SAASF,IAAIA,CAAA,EAAG;EACdQ,YAAY,CAACnB,KAAK,CAAC;EACnBH,MAAM,CAACuB,MAAM,GAAGnB,gBAAgB,CAACE,eAAe,GAC5CkB,IAAI,CAAC,CAAC,GACLrB,KAAK,GAAGkB,UAAU,CAACG,IAAI,EAAEpB,gBAAgB,CAACC,cAAc,CAAE;AACjE;AAEA,SAASmB,IAAIA,CAAA,EAAG;EACd,IAAIxB,MAAM,CAACuB,MAAM,KAAK,CAAC,EAAE;IACvB;EACF;EACA,IAAME,eAAe,GAAGzB,MAAM,CAAC0B,MAAM,CAAC,CAAC,EAAEtB,gBAAgB,CAACE,eAAe,CAAC;EAC1E,IAAMqB,aAAa,GAAGC,kBAAkB,CAACH,eAAe,CAAC;EAEzDI,UAAU,CAACzB,gBAAgB,CAACI,GAAG,EAAEmB,aAAa,CAAC;EAE/C3B,MAAM,CAACuB,MAAM,IAAIR,QAAQ,CAACS,IAAI,CAAC;AACjC;AAEA,SAASK,UAAUA,CAACC,UAAkB,EAAEC,IAAmB,EAAE;EAC3D,IAAMC,OAAO,GAAG;IACdC,IAAI,EAAE;EACR,CAAC;EAED,IAAMC,IAAI,GAAG,IAAIC,IAAI,CAAC,CAACC,IAAI,CAACC,SAAS,CAACN,IAAI,CAAC,CAAC,EAAEC,OAAO,CAAC;EACtDf,MAAM,CAACqB,SAAS,CAACT,UAAU,CAACC,UAAU,EAAEI,IAAI,CAAC;AAC/C;AAEA,SAASrB,UAAUA,CAAA,EAAG;EACpBI,MAAM,CAACsB,gBAAgB,CAAC,cAAc,EAAEf,IAAI,EAAE,KAAK,CAAC;AACtD;AAEA,SAASI,kBAAkBA,CAACG,IAAoC,EAAE;EAChE,OAAO;IACLS,KAAK,EAAE,uBAAuB;IAC9BC,OAAO,EAAE,CACP,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,SAAS,EACT,MAAM,EACN,UAAU,EACV,MAAM,EACN,KAAK,EACL,UAAU,EACV,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,CACZ;IACDV;EACF,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-v2.js","names":["getV2RuntimeFromDll","pick","authV2Factory","v2Kit","Object","freeze"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\"authenticate\", \"getAuth\", \"isLoggedIn\", \"logout\"])\n ) as typeof auth;\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,IAAI,QAAQ,QAAQ;AAG7B,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9B,IAAMC,KAAK,GAAGH,mBAAmB,CAAC,CAAC;EACnC,IAAIG,KAAK,EAAE;IACT,OAAOC,MAAM,CAACC,MAAM,CAClBJ,IAAI,CAACE,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CACjE,CAAC;EACH;AACF"}
1
+ {"version":3,"file":"auth-v2.js","names":["getV2RuntimeFromDll","pick","authV2Factory","v2Kit","Object","freeze"],"sources":["../../src/auth-v2.ts"],"sourcesContent":["// istanbul ignore file\nimport { getV2RuntimeFromDll } from \"@next-core/runtime\";\nimport { pick } from \"lodash\";\nimport type * as auth from \"./auth.js\";\n\nexport function authV2Factory() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze(\n pick(v2Kit, [\"authenticate\", \"getAuth\", \"isLoggedIn\", \"logout\"])\n ) as typeof auth;\n }\n}\n"],"mappings":"AAAA;AACA,SAASA,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,IAAI,QAAQ,QAAQ;AAG7B,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9B,IAAMC,KAAK,GAAGH,mBAAmB,CAAC,CAAC;EACnC,IAAIG,KAAK,EAAE;IACT,OAAOC,MAAM,CAACC,MAAM,CAClBJ,IAAI,CAACE,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CACjE,CAAC;EACH;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":["resetPermissionPreChecks","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","userShowValue","getAuth","_objectSpread","logout","key","keys","undefined","isLoggedIn"],"sources":["../../src/auth.ts"],"sourcesContent":["import type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n"],"mappings":";AACA,SAASA,wBAAwB,QAAQ,uBAAuB;AAEhE,IAAMC,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACA,OAAO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,aAAa,EAAEX,OAAO,CAACW;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAAC,aAAA,KACKf,IAAI;AAEX;;AAEA;AACA,OAAO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,IAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACApB,wBAAwB,CAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASqB,UAAUA,CAAA,EAAY;EACpC,OAAOpB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC"}
1
+ {"version":3,"file":"auth.js","names":["resetPermissionPreChecks","auth","authenticate","newAuth","Object","assign","org","username","userInstanceId","loginFrom","accessRule","isAdmin","csrfToken","license","userShowValue","getAuth","_objectSpread","logout","key","keys","undefined","isLoggedIn"],"sources":["../../src/auth.ts"],"sourcesContent":["import type { AuthApi_CheckLoginResponseBody } from \"@next-api-sdk/api-gateway-sdk\";\nimport { resetPermissionPreChecks } from \"./checkPermissions.js\";\n\nconst auth: AuthInfo = {};\n\n/** @internal */\nexport type AuthInfo = Omit<AuthApi_CheckLoginResponseBody, \"loggedIn\">;\n\n/** @internal */\nexport function authenticate(newAuth: AuthInfo): void {\n Object.assign(auth, {\n org: newAuth.org,\n username: newAuth.username,\n userInstanceId: newAuth.userInstanceId,\n loginFrom: newAuth.loginFrom,\n accessRule: newAuth.accessRule,\n isAdmin: newAuth.isAdmin,\n csrfToken: newAuth.csrfToken,\n license: newAuth.license,\n userShowValue: newAuth.userShowValue,\n });\n}\n\n/**\n * 获取当前登录认证信息。\n *\n * @returns 当前登录认证信息。\n */\nexport function getAuth(): AuthInfo {\n return {\n ...auth,\n };\n}\n\n/** @internal */\nexport function logout(): void {\n for (const key of Object.keys(auth) as (keyof AuthInfo)[]) {\n auth[key] = undefined;\n }\n resetPermissionPreChecks();\n}\n\n/**\n * 查看当前是否已登录。\n *\n * @returns 当前是否已登录。\n */\nexport function isLoggedIn(): boolean {\n return auth.username !== undefined;\n}\n"],"mappings":";AACA,SAASA,wBAAwB,QAAQ,uBAAuB;AAEhE,IAAMC,IAAc,GAAG,CAAC,CAAC;;AAEzB;;AAGA;AACA,OAAO,SAASC,YAAYA,CAACC,OAAiB,EAAQ;EACpDC,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE;IAClBK,GAAG,EAAEH,OAAO,CAACG,GAAG;IAChBC,QAAQ,EAAEJ,OAAO,CAACI,QAAQ;IAC1BC,cAAc,EAAEL,OAAO,CAACK,cAAc;IACtCC,SAAS,EAAEN,OAAO,CAACM,SAAS;IAC5BC,UAAU,EAAEP,OAAO,CAACO,UAAU;IAC9BC,OAAO,EAAER,OAAO,CAACQ,OAAO;IACxBC,SAAS,EAAET,OAAO,CAACS,SAAS;IAC5BC,OAAO,EAAEV,OAAO,CAACU,OAAO;IACxBC,aAAa,EAAEX,OAAO,CAACW;EACzB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAa;EAClC,OAAAC,aAAA,KACKf,IAAI;AAEX;;AAEA;AACA,OAAO,SAASgB,MAAMA,CAAA,EAAS;EAC7B,KAAK,IAAMC,GAAG,IAAId,MAAM,CAACe,IAAI,CAAClB,IAAI,CAAC,EAAwB;IACzDA,IAAI,CAACiB,GAAG,CAAC,GAAGE,SAAS;EACvB;EACApB,wBAAwB,CAAC,CAAC;AAC5B;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASqB,UAAUA,CAAA,EAAY;EACpC,OAAOpB,IAAI,CAACM,QAAQ,KAAKa,SAAS;AACpC","ignoreList":[]}