@next-core/easyops-runtime 0.7.6 → 0.7.7

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.
@@ -7,46 +7,33 @@ 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 _classPrivateMethodGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateMethodGet"));
11
- var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
12
- var _classPrivateFieldGet3 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
13
10
  var _runtime = require("@next-core/runtime");
14
11
  var _lodash = require("lodash");
15
12
  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"); }
16
17
  var _ms = /*#__PURE__*/new WeakMap();
17
18
  var _memoizedChannels = /*#__PURE__*/new WeakMap();
18
19
  var _channelPayloads = /*#__PURE__*/new WeakMap();
19
- var _ms2 = /*#__PURE__*/new WeakMap();
20
- var _subOrUnsub = /*#__PURE__*/new WeakSet();
20
+ var _MessageDispatcher_brand = /*#__PURE__*/new WeakSet();
21
21
  class MessageDispatcher {
22
22
  constructor() {
23
- (0, _classPrivateMethodInitSpec2.default)(this, _subOrUnsub);
24
- (0, _classPrivateFieldInitSpec2.default)(this, _ms2, {
25
- get: _get_ms,
26
- set: void 0
27
- });
28
- (0, _classPrivateFieldInitSpec2.default)(this, _ms, {
29
- writable: true,
30
- value: void 0
31
- });
23
+ (0, _classPrivateMethodInitSpec2.default)(this, _MessageDispatcher_brand);
24
+ (0, _classPrivateFieldInitSpec2.default)(this, _ms, void 0);
32
25
  (0, _classPrivateFieldInitSpec2.default)(this, _memoizedChannels, {
33
- writable: true,
34
- value: {
35
- sub: new Map(),
36
- unsub: new Map()
37
- }
38
- });
39
- (0, _classPrivateFieldInitSpec2.default)(this, _channelPayloads, {
40
- writable: true,
41
- value: new Map()
26
+ sub: new Map(),
27
+ unsub: new Map()
42
28
  });
29
+ (0, _classPrivateFieldInitSpec2.default)(this, _channelPayloads, new Map());
43
30
  }
44
31
  subscribe(channel, payload) {
45
32
  const stringifiedPayload = JSON.stringify(payload);
46
- return (0, _classPrivateMethodGet2.default)(this, _subOrUnsub, _subOrUnsub2).call(this, "sub", channel, payload, stringifiedPayload);
33
+ return _assertClassBrand(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "sub", channel, payload, stringifiedPayload);
47
34
  }
48
35
  unsubscribe(channel) {
49
- const stringifiedPayload = (0, _classPrivateFieldGet3.default)(this, _channelPayloads).get(channel);
36
+ const stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
50
37
  if (!stringifiedPayload) {
51
38
  const msg = `The message channel to unsubscribe "${channel}" is not found`;
52
39
  // eslint-disable-next-line no-console
@@ -54,48 +41,48 @@ class MessageDispatcher {
54
41
  return Promise.reject(new Error(msg));
55
42
  }
56
43
  const payload = JSON.parse(stringifiedPayload);
57
- const result = (0, _classPrivateMethodGet2.default)(this, _subOrUnsub, _subOrUnsub2).call(this, "unsub", channel, payload, stringifiedPayload);
58
- (0, _classPrivateFieldGet3.default)(this, _memoizedChannels).sub.delete(stringifiedPayload);
44
+ const result = _assertClassBrand(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "unsub", channel, payload, stringifiedPayload);
45
+ _classPrivateFieldGet(_memoizedChannels, this).sub.delete(stringifiedPayload);
59
46
  result.then(() => {
60
- (0, _classPrivateFieldGet3.default)(this, _channelPayloads).delete(channel);
47
+ _classPrivateFieldGet(_channelPayloads, this).delete(channel);
61
48
  });
62
49
  return result;
63
50
  }
64
51
  onMessage(channel, listener) {
65
- const stringifiedPayload = (0, _classPrivateFieldGet3.default)(this, _channelPayloads).get(channel);
52
+ const stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
66
53
  if (!stringifiedPayload) {
67
54
  // eslint-disable-next-line no-console
68
55
  console.error(`Message channel: "${channel}" not found`);
69
56
  return;
70
57
  }
71
- (0, _classPrivateFieldGet3.default)(this, _ms2).onMessage(response => {
58
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
72
59
  if (response.event === "MESSAGE.PUSH" && matchMessageChannel(stringifiedPayload, response.payload)) {
73
60
  listener(response.payload.message);
74
61
  }
75
62
  });
76
63
  }
77
64
  onClose(listener) {
78
- (0, _classPrivateFieldGet3.default)(this, _ms2).onClose(listener);
65
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onClose(listener);
79
66
  }
80
67
  reset() {
81
68
  var _classPrivateFieldGet2;
82
- (0, _classPrivateFieldGet3.default)(this, _memoizedChannels).sub.clear();
83
- (0, _classPrivateFieldGet3.default)(this, _memoizedChannels).unsub.clear();
84
- (0, _classPrivateFieldGet3.default)(this, _channelPayloads).clear();
85
- (_classPrivateFieldGet2 = (0, _classPrivateFieldGet3.default)(this, _ms)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.reset();
69
+ _classPrivateFieldGet(_memoizedChannels, this).sub.clear();
70
+ _classPrivateFieldGet(_memoizedChannels, this).unsub.clear();
71
+ _classPrivateFieldGet(_channelPayloads, this).clear();
72
+ (_classPrivateFieldGet2 = _classPrivateFieldGet(_ms, this)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.reset();
86
73
  }
87
74
  }
88
75
  exports.MessageDispatcher = MessageDispatcher;
89
- function _get_ms() {
90
- if (!(0, _classPrivateFieldGet3.default)(this, _ms)) {
76
+ function _get_ms(_this) {
77
+ if (!_classPrivateFieldGet(_ms, _this)) {
91
78
  const protocol = location.protocol === "https:" ? "wss:" : "ws:";
92
79
  const url = `${protocol}//${window.location.host}${(0, _runtime.getBasePath)()}api/websocket_service/v1/ws`;
93
- (0, _classPrivateFieldSet2.default)(this, _ms, new _MessageService.MessageService(url));
80
+ _classPrivateFieldSet(_ms, _this, new _MessageService.MessageService(url));
94
81
  }
95
- return (0, _classPrivateFieldGet3.default)(this, _ms);
82
+ return _classPrivateFieldGet(_ms, _this);
96
83
  }
97
- function _subOrUnsub2(type, channel, payload, stringifiedPayload) {
98
- const hit = (0, _classPrivateFieldGet3.default)(this, _memoizedChannels)[type].get(stringifiedPayload);
84
+ function _subOrUnsub(type, channel, payload, stringifiedPayload) {
85
+ const hit = _classPrivateFieldGet(_memoizedChannels, this)[type].get(stringifiedPayload);
99
86
  if (hit) {
100
87
  return hit;
101
88
  }
@@ -105,7 +92,7 @@ function _subOrUnsub2(type, channel, payload, stringifiedPayload) {
105
92
  };
106
93
  const promise = new Promise((resolve, reject) => {
107
94
  const identity = getIdentity(payload);
108
- (0, _classPrivateFieldGet3.default)(this, _ms2).onMessage(response => {
95
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
109
96
  const isSuccess = response.event === (type === "sub" ? "TOPIC.SUB_SUCCESS" : "TOPIC.UNSUB_SUCCESS");
110
97
  const isFailed = response.event === (type === "sub" ? "TOPIC.SUB_FAILED" : "TOPIC.UNSUB_FAILED");
111
98
  if ((isSuccess || isFailed) &&
@@ -115,12 +102,12 @@ function _subOrUnsub2(type, channel, payload, stringifiedPayload) {
115
102
  (isSuccess ? resolve : reject)(response);
116
103
  }
117
104
  });
118
- (0, _classPrivateFieldGet3.default)(this, _ms2).send(request);
105
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).send(request);
119
106
  });
120
107
  if (type === "sub") {
121
- (0, _classPrivateFieldGet3.default)(this, _channelPayloads).set(channel, stringifiedPayload);
108
+ _classPrivateFieldGet(_channelPayloads, this).set(channel, stringifiedPayload);
122
109
  }
123
- (0, _classPrivateFieldGet3.default)(this, _memoizedChannels)[type].set(stringifiedPayload, promise);
110
+ _classPrivateFieldGet(_memoizedChannels, this)[type].set(stringifiedPayload, promise);
124
111
  return promise;
125
112
  }
126
113
  function getIdentity(payload) {
@@ -1 +1 @@
1
- {"version":3,"file":"MessageDispatcher.js","names":["_runtime","require","_lodash","_MessageService","_ms","WeakMap","_memoizedChannels","_channelPayloads","_ms2","_subOrUnsub","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","get","_get_ms","set","writable","value","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_classPrivateMethodGet2","_subOrUnsub2","call","unsubscribe","_classPrivateFieldGet3","msg","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","exports","protocol","location","url","window","host","getBasePath","_classPrivateFieldSet2","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 const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n return;\n }\n\n this.#ms.onMessage<MessageResponse>((response) => {\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","_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","_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 const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n return;\n }\n\n this.#ms.onMessage<MessageResponse>((response) => {\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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"}
@@ -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
- var _classPrivateMethodGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateMethodGet"));
11
- var _classPrivateFieldGet3 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
12
- var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
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"); }
13
13
  const RETRY_TIMEOUT_UNIT = 1000;
14
14
  const RETRY_LIMIT = 6;
15
15
  var _url = /*#__PURE__*/new WeakMap();
@@ -19,99 +19,76 @@ var _messageListeners = /*#__PURE__*/new WeakMap();
19
19
  var _closeListeners = /*#__PURE__*/new WeakMap();
20
20
  var _retryCount = /*#__PURE__*/new WeakMap();
21
21
  var _closed = /*#__PURE__*/new WeakMap();
22
- var _connect = /*#__PURE__*/new WeakSet();
23
- var _reconnect = /*#__PURE__*/new WeakSet();
22
+ var _MessageService_brand = /*#__PURE__*/new WeakSet();
24
23
  class MessageService {
25
24
  constructor(url) {
26
- (0, _classPrivateMethodInitSpec2.default)(this, _reconnect);
27
- (0, _classPrivateMethodInitSpec2.default)(this, _connect);
28
- (0, _classPrivateFieldInitSpec2.default)(this, _url, {
29
- writable: true,
30
- value: void 0
31
- });
32
- (0, _classPrivateFieldInitSpec2.default)(this, _ws, {
33
- writable: true,
34
- value: void 0
35
- });
36
- (0, _classPrivateFieldInitSpec2.default)(this, _queuedMessages, {
37
- writable: true,
38
- value: []
39
- });
40
- (0, _classPrivateFieldInitSpec2.default)(this, _messageListeners, {
41
- writable: true,
42
- value: new Set()
43
- });
44
- (0, _classPrivateFieldInitSpec2.default)(this, _closeListeners, {
45
- writable: true,
46
- value: new Set()
47
- });
48
- (0, _classPrivateFieldInitSpec2.default)(this, _retryCount, {
49
- writable: true,
50
- value: 0
51
- });
52
- (0, _classPrivateFieldInitSpec2.default)(this, _closed, {
53
- writable: true,
54
- value: false
55
- });
56
- (0, _classPrivateFieldSet2.default)(this, _url, url);
25
+ (0, _classPrivateMethodInitSpec2.default)(this, _MessageService_brand);
26
+ (0, _classPrivateFieldInitSpec2.default)(this, _url, void 0);
27
+ (0, _classPrivateFieldInitSpec2.default)(this, _ws, void 0);
28
+ (0, _classPrivateFieldInitSpec2.default)(this, _queuedMessages, []);
29
+ (0, _classPrivateFieldInitSpec2.default)(this, _messageListeners, new Set());
30
+ (0, _classPrivateFieldInitSpec2.default)(this, _closeListeners, new Set());
31
+ (0, _classPrivateFieldInitSpec2.default)(this, _retryCount, 0);
32
+ (0, _classPrivateFieldInitSpec2.default)(this, _closed, false);
33
+ _classPrivateFieldSet(_url, this, url);
57
34
  }
58
35
  send(data) {
59
36
  // Connect when data is sent for the first time
60
- if (!(0, _classPrivateFieldGet3.default)(this, _ws)) {
61
- (0, _classPrivateFieldSet2.default)(this, _ws, (0, _classPrivateMethodGet2.default)(this, _connect, _connect2).call(this));
37
+ if (!_classPrivateFieldGet(_ws, this)) {
38
+ _classPrivateFieldSet(_ws, this, _assertClassBrand(_MessageService_brand, this, _connect).call(this));
62
39
  }
63
40
  const stringifiedData = JSON.stringify(data);
64
- if ((0, _classPrivateFieldGet3.default)(this, _ws).readyState === WebSocket.OPEN) {
65
- (0, _classPrivateFieldGet3.default)(this, _ws).send(stringifiedData);
41
+ if (_classPrivateFieldGet(_ws, this).readyState === WebSocket.OPEN) {
42
+ _classPrivateFieldGet(_ws, this).send(stringifiedData);
66
43
  } else {
67
- (0, _classPrivateFieldGet3.default)(this, _queuedMessages).push(stringifiedData);
44
+ _classPrivateFieldGet(_queuedMessages, this).push(stringifiedData);
68
45
  }
69
46
  }
70
47
  onMessage(listener) {
71
- (0, _classPrivateFieldGet3.default)(this, _messageListeners).add(listener);
48
+ _classPrivateFieldGet(_messageListeners, this).add(listener);
72
49
  }
73
50
  onClose(listener) {
74
- (0, _classPrivateFieldGet3.default)(this, _closeListeners).add(listener);
51
+ _classPrivateFieldGet(_closeListeners, this).add(listener);
75
52
  }
76
53
  reset() {
77
- (0, _classPrivateFieldGet3.default)(this, _queuedMessages).length = 0;
78
- (0, _classPrivateFieldGet3.default)(this, _messageListeners).clear();
79
- (0, _classPrivateFieldGet3.default)(this, _closeListeners).clear();
54
+ _classPrivateFieldGet(_queuedMessages, this).length = 0;
55
+ _classPrivateFieldGet(_messageListeners, this).clear();
56
+ _classPrivateFieldGet(_closeListeners, this).clear();
80
57
  }
81
58
  close() {
82
59
  var _classPrivateFieldGet2;
83
- (0, _classPrivateFieldSet2.default)(this, _closed, true);
84
- if (((_classPrivateFieldGet2 = (0, _classPrivateFieldGet3.default)(this, _ws)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.readyState) === WebSocket.OPEN) {
85
- (0, _classPrivateFieldGet3.default)(this, _ws).close();
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();
86
63
  }
87
64
  }
88
65
  }
89
66
  exports.MessageService = MessageService;
90
- function _connect2() {
67
+ function _connect() {
91
68
  // eslint-disable-next-line no-console
92
69
  console.log("WebSocket connecting ...");
93
- const ws = new WebSocket((0, _classPrivateFieldGet3.default)(this, _url));
70
+ const ws = new WebSocket(_classPrivateFieldGet(_url, this));
94
71
  ws.addEventListener("open", e => {
95
72
  // eslint-disable-next-line no-console
96
73
  console.log("WebSocket open:", e);
97
- (0, _classPrivateFieldSet2.default)(this, _retryCount, 0);
98
- for (const msg of (0, _classPrivateFieldGet3.default)(this, _queuedMessages)) {
74
+ _classPrivateFieldSet(_retryCount, this, 0);
75
+ for (const msg of _classPrivateFieldGet(_queuedMessages, this)) {
99
76
  ws.send(msg);
100
77
  }
101
- (0, _classPrivateFieldGet3.default)(this, _queuedMessages).length = 0;
78
+ _classPrivateFieldGet(_queuedMessages, this).length = 0;
102
79
  });
103
80
  ws.addEventListener("close", e => {
104
- if ((0, _classPrivateFieldGet3.default)(this, _closed)) {
81
+ if (_classPrivateFieldGet(_closed, this)) {
105
82
  return;
106
83
  }
107
84
  // eslint-disable-next-line no-console
108
85
  console.log("WebSocket close:", e);
109
- for (const listener of (0, _classPrivateFieldGet3.default)(this, _closeListeners)) {
86
+ for (const listener of _classPrivateFieldGet(_closeListeners, this)) {
110
87
  listener();
111
88
  }
112
89
  // Error code 1000 means that the connection was closed normally.
113
90
  if (e.code !== 1000) {
114
- (0, _classPrivateMethodGet2.default)(this, _reconnect, _reconnect2).call(this);
91
+ _assertClassBrand(_MessageService_brand, this, _reconnect).call(this);
115
92
  }
116
93
  });
117
94
  ws.addEventListener("error", e => {
@@ -122,27 +99,27 @@ function _connect2() {
122
99
  });
123
100
  ws.addEventListener("message", e => {
124
101
  const response = JSON.parse(e.data);
125
- for (const listener of (0, _classPrivateFieldGet3.default)(this, _messageListeners)) {
102
+ for (const listener of _classPrivateFieldGet(_messageListeners, this)) {
126
103
  listener(response);
127
104
  }
128
105
  });
129
106
  return ws;
130
107
  }
131
- function _reconnect2() {
108
+ function _reconnect() {
132
109
  // istanbul ignore next: currently can't mock this
133
- if ((0, _classPrivateFieldGet3.default)(this, _retryCount) >= RETRY_LIMIT) {
110
+ if (_classPrivateFieldGet(_retryCount, this) >= RETRY_LIMIT) {
134
111
  // eslint-disable-next-line no-console
135
112
  console.error("WebSocket connect retry limit exceeded");
136
113
  return;
137
114
  }
138
115
  // Double the timeout for each retry
139
- const delay = Math.pow(2, (0, _classPrivateFieldGet3.default)(this, _retryCount)) * RETRY_TIMEOUT_UNIT;
116
+ const delay = Math.pow(2, _classPrivateFieldGet(_retryCount, this)) * RETRY_TIMEOUT_UNIT;
140
117
  // eslint-disable-next-line no-console
141
118
  console.log("WebSocket will reconnect after %d seconds", delay / 1000);
142
119
  setTimeout(() => {
143
120
  var _this$retryCount, _this$retryCount2;
144
- (0, _classPrivateFieldSet2.default)(this, _retryCount, (_this$retryCount = (0, _classPrivateFieldGet3.default)(this, _retryCount), _this$retryCount2 = _this$retryCount++, _this$retryCount)), _this$retryCount2;
145
- (0, _classPrivateFieldSet2.default)(this, _ws, (0, _classPrivateMethodGet2.default)(this, _connect, _connect2).call(this));
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));
146
123
  }, delay);
147
124
  }
148
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","_connect","WeakSet","_reconnect","MessageService","constructor","url","_classPrivateMethodInitSpec2","default","_classPrivateFieldInitSpec2","writable","value","Set","_classPrivateFieldSet2","send","data","_classPrivateFieldGet3","_classPrivateMethodGet2","_connect2","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","_reconnect2","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","_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,45 +1,32 @@
1
1
  import _classPrivateMethodInitSpec from "@babel/runtime/helpers/classPrivateMethodInitSpec";
2
2
  import _classPrivateFieldInitSpec from "@babel/runtime/helpers/classPrivateFieldInitSpec";
3
- import _classPrivateMethodGet from "@babel/runtime/helpers/classPrivateMethodGet";
4
- import _classPrivateFieldSet from "@babel/runtime/helpers/classPrivateFieldSet";
5
- import _classPrivateFieldGet from "@babel/runtime/helpers/classPrivateFieldGet";
3
+ function _classPrivateGetter(s, r, a) { return a(_assertClassBrand(s, r)); }
4
+ function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
5
+ function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
6
+ 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"); }
6
7
  import { getBasePath } from "@next-core/runtime";
7
8
  import { escapeRegExp } from "lodash";
8
9
  import { MessageService } from "./MessageService.js";
9
10
  var _ms = /*#__PURE__*/new WeakMap();
10
11
  var _memoizedChannels = /*#__PURE__*/new WeakMap();
11
12
  var _channelPayloads = /*#__PURE__*/new WeakMap();
12
- var _ms2 = /*#__PURE__*/new WeakMap();
13
- var _subOrUnsub = /*#__PURE__*/new WeakSet();
13
+ var _MessageDispatcher_brand = /*#__PURE__*/new WeakSet();
14
14
  export class MessageDispatcher {
15
15
  constructor() {
16
- _classPrivateMethodInitSpec(this, _subOrUnsub);
17
- _classPrivateFieldInitSpec(this, _ms2, {
18
- get: _get_ms,
19
- set: void 0
20
- });
21
- _classPrivateFieldInitSpec(this, _ms, {
22
- writable: true,
23
- value: void 0
24
- });
16
+ _classPrivateMethodInitSpec(this, _MessageDispatcher_brand);
17
+ _classPrivateFieldInitSpec(this, _ms, void 0);
25
18
  _classPrivateFieldInitSpec(this, _memoizedChannels, {
26
- writable: true,
27
- value: {
28
- sub: new Map(),
29
- unsub: new Map()
30
- }
31
- });
32
- _classPrivateFieldInitSpec(this, _channelPayloads, {
33
- writable: true,
34
- value: new Map()
19
+ sub: new Map(),
20
+ unsub: new Map()
35
21
  });
22
+ _classPrivateFieldInitSpec(this, _channelPayloads, new Map());
36
23
  }
37
24
  subscribe(channel, payload) {
38
25
  var stringifiedPayload = JSON.stringify(payload);
39
- return _classPrivateMethodGet(this, _subOrUnsub, _subOrUnsub2).call(this, "sub", channel, payload, stringifiedPayload);
26
+ return _assertClassBrand(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "sub", channel, payload, stringifiedPayload);
40
27
  }
41
28
  unsubscribe(channel) {
42
- var stringifiedPayload = _classPrivateFieldGet(this, _channelPayloads).get(channel);
29
+ var stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
43
30
  if (!stringifiedPayload) {
44
31
  var msg = "The message channel to unsubscribe \"".concat(channel, "\" is not found");
45
32
  // eslint-disable-next-line no-console
@@ -47,47 +34,47 @@ export class MessageDispatcher {
47
34
  return Promise.reject(new Error(msg));
48
35
  }
49
36
  var payload = JSON.parse(stringifiedPayload);
50
- var result = _classPrivateMethodGet(this, _subOrUnsub, _subOrUnsub2).call(this, "unsub", channel, payload, stringifiedPayload);
51
- _classPrivateFieldGet(this, _memoizedChannels).sub.delete(stringifiedPayload);
37
+ var result = _assertClassBrand(_MessageDispatcher_brand, this, _subOrUnsub).call(this, "unsub", channel, payload, stringifiedPayload);
38
+ _classPrivateFieldGet(_memoizedChannels, this).sub.delete(stringifiedPayload);
52
39
  result.then(() => {
53
- _classPrivateFieldGet(this, _channelPayloads).delete(channel);
40
+ _classPrivateFieldGet(_channelPayloads, this).delete(channel);
54
41
  });
55
42
  return result;
56
43
  }
57
44
  onMessage(channel, listener) {
58
- var stringifiedPayload = _classPrivateFieldGet(this, _channelPayloads).get(channel);
45
+ var stringifiedPayload = _classPrivateFieldGet(_channelPayloads, this).get(channel);
59
46
  if (!stringifiedPayload) {
60
47
  // eslint-disable-next-line no-console
61
48
  console.error("Message channel: \"".concat(channel, "\" not found"));
62
49
  return;
63
50
  }
64
- _classPrivateFieldGet(this, _ms2).onMessage(response => {
51
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
65
52
  if (response.event === "MESSAGE.PUSH" && matchMessageChannel(stringifiedPayload, response.payload)) {
66
53
  listener(response.payload.message);
67
54
  }
68
55
  });
69
56
  }
70
57
  onClose(listener) {
71
- _classPrivateFieldGet(this, _ms2).onClose(listener);
58
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onClose(listener);
72
59
  }
73
60
  reset() {
74
61
  var _classPrivateFieldGet2;
75
- _classPrivateFieldGet(this, _memoizedChannels).sub.clear();
76
- _classPrivateFieldGet(this, _memoizedChannels).unsub.clear();
77
- _classPrivateFieldGet(this, _channelPayloads).clear();
78
- (_classPrivateFieldGet2 = _classPrivateFieldGet(this, _ms)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.reset();
62
+ _classPrivateFieldGet(_memoizedChannels, this).sub.clear();
63
+ _classPrivateFieldGet(_memoizedChannels, this).unsub.clear();
64
+ _classPrivateFieldGet(_channelPayloads, this).clear();
65
+ (_classPrivateFieldGet2 = _classPrivateFieldGet(_ms, this)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.reset();
79
66
  }
80
67
  }
81
- function _get_ms() {
82
- if (!_classPrivateFieldGet(this, _ms)) {
68
+ function _get_ms(_this) {
69
+ if (!_classPrivateFieldGet(_ms, _this)) {
83
70
  var protocol = location.protocol === "https:" ? "wss:" : "ws:";
84
71
  var url = "".concat(protocol, "//").concat(window.location.host).concat(getBasePath(), "api/websocket_service/v1/ws");
85
- _classPrivateFieldSet(this, _ms, new MessageService(url));
72
+ _classPrivateFieldSet(_ms, _this, new MessageService(url));
86
73
  }
87
- return _classPrivateFieldGet(this, _ms);
74
+ return _classPrivateFieldGet(_ms, _this);
88
75
  }
89
- function _subOrUnsub2(type, channel, payload, stringifiedPayload) {
90
- var hit = _classPrivateFieldGet(this, _memoizedChannels)[type].get(stringifiedPayload);
76
+ function _subOrUnsub(type, channel, payload, stringifiedPayload) {
77
+ var hit = _classPrivateFieldGet(_memoizedChannels, this)[type].get(stringifiedPayload);
91
78
  if (hit) {
92
79
  return hit;
93
80
  }
@@ -97,7 +84,7 @@ function _subOrUnsub2(type, channel, payload, stringifiedPayload) {
97
84
  };
98
85
  var promise = new Promise((resolve, reject) => {
99
86
  var identity = getIdentity(payload);
100
- _classPrivateFieldGet(this, _ms2).onMessage(response => {
87
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).onMessage(response => {
101
88
  var isSuccess = response.event === (type === "sub" ? "TOPIC.SUB_SUCCESS" : "TOPIC.UNSUB_SUCCESS");
102
89
  var isFailed = response.event === (type === "sub" ? "TOPIC.SUB_FAILED" : "TOPIC.UNSUB_FAILED");
103
90
  if ((isSuccess || isFailed) &&
@@ -107,12 +94,12 @@ function _subOrUnsub2(type, channel, payload, stringifiedPayload) {
107
94
  (isSuccess ? resolve : reject)(response);
108
95
  }
109
96
  });
110
- _classPrivateFieldGet(this, _ms2).send(request);
97
+ _classPrivateGetter(_MessageDispatcher_brand, this, _get_ms).send(request);
111
98
  });
112
99
  if (type === "sub") {
113
- _classPrivateFieldGet(this, _channelPayloads).set(channel, stringifiedPayload);
100
+ _classPrivateFieldGet(_channelPayloads, this).set(channel, stringifiedPayload);
114
101
  }
115
- _classPrivateFieldGet(this, _memoizedChannels)[type].set(stringifiedPayload, promise);
102
+ _classPrivateFieldGet(_memoizedChannels, this)[type].set(stringifiedPayload, promise);
116
103
  return promise;
117
104
  }
118
105
  function getIdentity(payload) {
@@ -1 +1 @@
1
- {"version":3,"file":"MessageDispatcher.js","names":["getBasePath","escapeRegExp","MessageService","_ms","WeakMap","_memoizedChannels","_channelPayloads","_ms2","_subOrUnsub","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","get","_get_ms","set","writable","value","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_classPrivateMethodGet","_subOrUnsub2","call","unsubscribe","_classPrivateFieldGet","msg","concat","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","protocol","location","url","window","host","_classPrivateFieldSet","type","hit","request","promise","resolve","identity","getIdentity","isSuccess","isFailed","send","system","topic","responsePayload","includes","RegExp","replace","m","p1","p2","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 const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n return;\n }\n\n this.#ms.onMessage<MessageResponse>((response) => {\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":["getBasePath","escapeRegExp","MessageService","_ms","WeakMap","_memoizedChannels","_channelPayloads","_MessageDispatcher_brand","WeakSet","MessageDispatcher","constructor","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","sub","Map","unsub","subscribe","channel","payload","stringifiedPayload","JSON","stringify","_assertClassBrand","_subOrUnsub","call","unsubscribe","_classPrivateFieldGet","get","msg","concat","console","error","Promise","reject","Error","parse","result","delete","then","onMessage","listener","_classPrivateGetter","_get_ms","response","event","matchMessageChannel","message","onClose","reset","_classPrivateFieldGet2","clear","_this","protocol","location","url","window","host","_classPrivateFieldSet","type","hit","request","promise","resolve","identity","getIdentity","isSuccess","isFailed","send","set","system","topic","responsePayload","includes","RegExp","replace","m","p1","p2","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 const stringifiedPayload = this.#channelPayloads.get(channel);\n if (!stringifiedPayload) {\n // eslint-disable-next-line no-console\n console.error(`Message channel: \"${channel}\" not found`);\n return;\n }\n\n this.#ms.onMessage<MessageResponse>((response) => {\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,8 +1,8 @@
1
1
  import _classPrivateMethodInitSpec from "@babel/runtime/helpers/classPrivateMethodInitSpec";
2
2
  import _classPrivateFieldInitSpec from "@babel/runtime/helpers/classPrivateFieldInitSpec";
3
- import _classPrivateMethodGet from "@babel/runtime/helpers/classPrivateMethodGet";
4
- import _classPrivateFieldGet from "@babel/runtime/helpers/classPrivateFieldGet";
5
- import _classPrivateFieldSet from "@babel/runtime/helpers/classPrivateFieldSet";
3
+ function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
4
+ function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
5
+ 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"); }
6
6
  var RETRY_TIMEOUT_UNIT = 1000;
7
7
  var RETRY_LIMIT = 6;
8
8
  var _url = /*#__PURE__*/new WeakMap();
@@ -12,98 +12,75 @@ var _messageListeners = /*#__PURE__*/new WeakMap();
12
12
  var _closeListeners = /*#__PURE__*/new WeakMap();
13
13
  var _retryCount = /*#__PURE__*/new WeakMap();
14
14
  var _closed = /*#__PURE__*/new WeakMap();
15
- var _connect = /*#__PURE__*/new WeakSet();
16
- var _reconnect = /*#__PURE__*/new WeakSet();
15
+ var _MessageService_brand = /*#__PURE__*/new WeakSet();
17
16
  export class MessageService {
18
17
  constructor(url) {
19
- _classPrivateMethodInitSpec(this, _reconnect);
20
- _classPrivateMethodInitSpec(this, _connect);
21
- _classPrivateFieldInitSpec(this, _url, {
22
- writable: true,
23
- value: void 0
24
- });
25
- _classPrivateFieldInitSpec(this, _ws, {
26
- writable: true,
27
- value: void 0
28
- });
29
- _classPrivateFieldInitSpec(this, _queuedMessages, {
30
- writable: true,
31
- value: []
32
- });
33
- _classPrivateFieldInitSpec(this, _messageListeners, {
34
- writable: true,
35
- value: new Set()
36
- });
37
- _classPrivateFieldInitSpec(this, _closeListeners, {
38
- writable: true,
39
- value: new Set()
40
- });
41
- _classPrivateFieldInitSpec(this, _retryCount, {
42
- writable: true,
43
- value: 0
44
- });
45
- _classPrivateFieldInitSpec(this, _closed, {
46
- writable: true,
47
- value: false
48
- });
49
- _classPrivateFieldSet(this, _url, url);
18
+ _classPrivateMethodInitSpec(this, _MessageService_brand);
19
+ _classPrivateFieldInitSpec(this, _url, void 0);
20
+ _classPrivateFieldInitSpec(this, _ws, void 0);
21
+ _classPrivateFieldInitSpec(this, _queuedMessages, []);
22
+ _classPrivateFieldInitSpec(this, _messageListeners, new Set());
23
+ _classPrivateFieldInitSpec(this, _closeListeners, new Set());
24
+ _classPrivateFieldInitSpec(this, _retryCount, 0);
25
+ _classPrivateFieldInitSpec(this, _closed, false);
26
+ _classPrivateFieldSet(_url, this, url);
50
27
  }
51
28
  send(data) {
52
29
  // Connect when data is sent for the first time
53
- if (!_classPrivateFieldGet(this, _ws)) {
54
- _classPrivateFieldSet(this, _ws, _classPrivateMethodGet(this, _connect, _connect2).call(this));
30
+ if (!_classPrivateFieldGet(_ws, this)) {
31
+ _classPrivateFieldSet(_ws, this, _assertClassBrand(_MessageService_brand, this, _connect).call(this));
55
32
  }
56
33
  var stringifiedData = JSON.stringify(data);
57
- if (_classPrivateFieldGet(this, _ws).readyState === WebSocket.OPEN) {
58
- _classPrivateFieldGet(this, _ws).send(stringifiedData);
34
+ if (_classPrivateFieldGet(_ws, this).readyState === WebSocket.OPEN) {
35
+ _classPrivateFieldGet(_ws, this).send(stringifiedData);
59
36
  } else {
60
- _classPrivateFieldGet(this, _queuedMessages).push(stringifiedData);
37
+ _classPrivateFieldGet(_queuedMessages, this).push(stringifiedData);
61
38
  }
62
39
  }
63
40
  onMessage(listener) {
64
- _classPrivateFieldGet(this, _messageListeners).add(listener);
41
+ _classPrivateFieldGet(_messageListeners, this).add(listener);
65
42
  }
66
43
  onClose(listener) {
67
- _classPrivateFieldGet(this, _closeListeners).add(listener);
44
+ _classPrivateFieldGet(_closeListeners, this).add(listener);
68
45
  }
69
46
  reset() {
70
- _classPrivateFieldGet(this, _queuedMessages).length = 0;
71
- _classPrivateFieldGet(this, _messageListeners).clear();
72
- _classPrivateFieldGet(this, _closeListeners).clear();
47
+ _classPrivateFieldGet(_queuedMessages, this).length = 0;
48
+ _classPrivateFieldGet(_messageListeners, this).clear();
49
+ _classPrivateFieldGet(_closeListeners, this).clear();
73
50
  }
74
51
  close() {
75
52
  var _classPrivateFieldGet2;
76
- _classPrivateFieldSet(this, _closed, true);
77
- if (((_classPrivateFieldGet2 = _classPrivateFieldGet(this, _ws)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.readyState) === WebSocket.OPEN) {
78
- _classPrivateFieldGet(this, _ws).close();
53
+ _classPrivateFieldSet(_closed, this, true);
54
+ if (((_classPrivateFieldGet2 = _classPrivateFieldGet(_ws, this)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.readyState) === WebSocket.OPEN) {
55
+ _classPrivateFieldGet(_ws, this).close();
79
56
  }
80
57
  }
81
58
  }
82
- function _connect2() {
59
+ function _connect() {
83
60
  // eslint-disable-next-line no-console
84
61
  console.log("WebSocket connecting ...");
85
- var ws = new WebSocket(_classPrivateFieldGet(this, _url));
62
+ var ws = new WebSocket(_classPrivateFieldGet(_url, this));
86
63
  ws.addEventListener("open", e => {
87
64
  // eslint-disable-next-line no-console
88
65
  console.log("WebSocket open:", e);
89
- _classPrivateFieldSet(this, _retryCount, 0);
90
- for (var msg of _classPrivateFieldGet(this, _queuedMessages)) {
66
+ _classPrivateFieldSet(_retryCount, this, 0);
67
+ for (var msg of _classPrivateFieldGet(_queuedMessages, this)) {
91
68
  ws.send(msg);
92
69
  }
93
- _classPrivateFieldGet(this, _queuedMessages).length = 0;
70
+ _classPrivateFieldGet(_queuedMessages, this).length = 0;
94
71
  });
95
72
  ws.addEventListener("close", e => {
96
- if (_classPrivateFieldGet(this, _closed)) {
73
+ if (_classPrivateFieldGet(_closed, this)) {
97
74
  return;
98
75
  }
99
76
  // eslint-disable-next-line no-console
100
77
  console.log("WebSocket close:", e);
101
- for (var listener of _classPrivateFieldGet(this, _closeListeners)) {
78
+ for (var listener of _classPrivateFieldGet(_closeListeners, this)) {
102
79
  listener();
103
80
  }
104
81
  // Error code 1000 means that the connection was closed normally.
105
82
  if (e.code !== 1000) {
106
- _classPrivateMethodGet(this, _reconnect, _reconnect2).call(this);
83
+ _assertClassBrand(_MessageService_brand, this, _reconnect).call(this);
107
84
  }
108
85
  });
109
86
  ws.addEventListener("error", e => {
@@ -114,27 +91,27 @@ function _connect2() {
114
91
  });
115
92
  ws.addEventListener("message", e => {
116
93
  var response = JSON.parse(e.data);
117
- for (var listener of _classPrivateFieldGet(this, _messageListeners)) {
94
+ for (var listener of _classPrivateFieldGet(_messageListeners, this)) {
118
95
  listener(response);
119
96
  }
120
97
  });
121
98
  return ws;
122
99
  }
123
- function _reconnect2() {
100
+ function _reconnect() {
124
101
  // istanbul ignore next: currently can't mock this
125
- if (_classPrivateFieldGet(this, _retryCount) >= RETRY_LIMIT) {
102
+ if (_classPrivateFieldGet(_retryCount, this) >= RETRY_LIMIT) {
126
103
  // eslint-disable-next-line no-console
127
104
  console.error("WebSocket connect retry limit exceeded");
128
105
  return;
129
106
  }
130
107
  // Double the timeout for each retry
131
- var delay = Math.pow(2, _classPrivateFieldGet(this, _retryCount)) * RETRY_TIMEOUT_UNIT;
108
+ var delay = Math.pow(2, _classPrivateFieldGet(_retryCount, this)) * RETRY_TIMEOUT_UNIT;
132
109
  // eslint-disable-next-line no-console
133
110
  console.log("WebSocket will reconnect after %d seconds", delay / 1000);
134
111
  setTimeout(() => {
135
112
  var _this$retryCount, _this$retryCount2;
136
- _classPrivateFieldSet(this, _retryCount, (_this$retryCount = _classPrivateFieldGet(this, _retryCount), _this$retryCount2 = _this$retryCount++, _this$retryCount)), _this$retryCount2;
137
- _classPrivateFieldSet(this, _ws, _classPrivateMethodGet(this, _connect, _connect2).call(this));
113
+ _classPrivateFieldSet(_retryCount, this, (_this$retryCount = _classPrivateFieldGet(_retryCount, this), _this$retryCount2 = _this$retryCount++, _this$retryCount)), _this$retryCount2;
114
+ _classPrivateFieldSet(_ws, this, _assertClassBrand(_MessageService_brand, this, _connect).call(this));
138
115
  }, delay);
139
116
  }
140
117
  //# 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","_connect","WeakSet","_reconnect","MessageService","constructor","url","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","writable","value","Set","_classPrivateFieldSet","send","data","_classPrivateFieldGet","_classPrivateMethodGet","_connect2","call","stringifiedData","JSON","stringify","readyState","WebSocket","OPEN","push","onMessage","listener","add","onClose","reset","length","clear","close","_classPrivateFieldGet2","console","log","ws","addEventListener","e","msg","code","_reconnect2","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","_classPrivateMethodInitSpec","_classPrivateFieldInitSpec","Set","_classPrivateFieldSet","send","data","_classPrivateFieldGet","_assertClassBrand","_connect","call","stringifiedData","JSON","stringify","readyState","WebSocket","OPEN","push","onMessage","listener","add","onClose","reset","length","clear","close","_classPrivateFieldGet2","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-core/easyops-runtime",
3
- "version": "0.7.6",
3
+ "version": "0.7.7",
4
4
  "homepage": "https://github.com/easyops-cn/next-core/tree/v3/packages/easyops-runtime",
5
5
  "license": "GPL-3.0",
6
6
  "repository": {
@@ -44,20 +44,20 @@
44
44
  "@next-api-sdk/cmdb-sdk": "^1.1.0",
45
45
  "@next-api-sdk/micro-app-sdk": "^1.2.1",
46
46
  "@next-api-sdk/micro-app-standalone-sdk": "^1.1.0",
47
- "@next-core/cook": "^2.2.12",
48
- "@next-core/http": "^1.1.9",
49
- "@next-core/pipes": "^2.0.16",
50
- "@next-core/runtime": "^1.31.1",
51
- "@next-core/types": "^1.8.0",
52
- "@next-core/utils": "^1.6.10",
47
+ "@next-core/cook": "^2.2.13",
48
+ "@next-core/http": "^1.1.10",
49
+ "@next-core/pipes": "^2.0.17",
50
+ "@next-core/runtime": "^1.31.2",
51
+ "@next-core/types": "^1.8.1",
52
+ "@next-core/utils": "^1.6.11",
53
53
  "js-yaml": "^3.14.1",
54
54
  "lodash": "^4.17.21"
55
55
  },
56
56
  "devDependencies": {
57
- "@next-core/build-next-libs": "^1.0.12",
58
- "@next-core/test-next": "^1.0.15",
57
+ "@next-core/build-next-libs": "^1.0.13",
58
+ "@next-core/test-next": "^1.0.16",
59
59
  "jest-websocket-mock": "^2.5.0",
60
60
  "whatwg-fetch": "^3.6.20"
61
61
  },
62
- "gitHead": "0431d1699d2c31b4595e475e53b7e5535621960f"
62
+ "gitHead": "7794348c3503d686fbdd8595be9c51191aa2de5d"
63
63
  }