@wireapp/api-client 27.0.9 → 27.0.10

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 (62) hide show
  1. package/lib/APIClient.d.ts +0 -1
  2. package/lib/APIClient.d.ts.map +1 -1
  3. package/lib/APIClient.js +24 -22
  4. package/lib/account/AccountAPI.js +16 -15
  5. package/lib/asset/AssetAPI.d.ts +0 -1
  6. package/lib/asset/AssetAPI.d.ts.map +1 -1
  7. package/lib/asset/AssetAPI.js +5 -4
  8. package/lib/auth/AccessTokenStore.d.ts +0 -1
  9. package/lib/auth/AccessTokenStore.d.ts.map +1 -1
  10. package/lib/auth/AccessTokenStore.js +8 -1
  11. package/lib/auth/AuthAPI.js +22 -27
  12. package/lib/auth/Cookie.js +2 -2
  13. package/lib/auth/CookieStore.d.ts +0 -1
  14. package/lib/auth/CookieStore.d.ts.map +1 -1
  15. package/lib/auth/CookieStore.js +3 -2
  16. package/lib/auth/parseAccessToken.js +3 -3
  17. package/lib/broadcast/BroadcastAPI.js +5 -4
  18. package/lib/client/ClientAPI.d.ts +1 -1
  19. package/lib/client/ClientAPI.js +11 -10
  20. package/lib/connection/ConnectionAPI.js +4 -3
  21. package/lib/conversation/ConversationAPI/ConversationAPI.js +34 -33
  22. package/lib/conversation/FederatedBackendsError.js +6 -5
  23. package/lib/demo/initClient.js +1 -2
  24. package/lib/generic/GenericAPI.js +1 -0
  25. package/lib/giphy/GiphyAPI.js +8 -7
  26. package/lib/http/BackendError.js +3 -0
  27. package/lib/http/HttpClient.d.ts +0 -1
  28. package/lib/http/HttpClient.d.ts.map +1 -1
  29. package/lib/http/HttpClient.js +49 -24
  30. package/lib/http/NetworkError.js +1 -0
  31. package/lib/notification/NotificationAPI/NotificationAPI.js +11 -11
  32. package/lib/notification/NotificationAPI/NotificationsAPI.mocks.d.ts +1 -1
  33. package/lib/oauth/OAuthAPI.js +8 -7
  34. package/lib/obfuscation/ObfuscationUtil.js +4 -1
  35. package/lib/self/SelfAPI.js +12 -11
  36. package/lib/serviceProvider/ServiceProviderAPI.js +8 -7
  37. package/lib/services/ServicesAPI.js +13 -11
  38. package/lib/shims/browser/cookie.d.ts.map +1 -1
  39. package/lib/shims/browser/websocket.d.ts +1 -1
  40. package/lib/shims/node/buffer.d.ts +0 -1
  41. package/lib/shims/node/buffer.d.ts.map +1 -1
  42. package/lib/shims/node/cookie.d.ts.map +1 -1
  43. package/lib/shims/node/cookie.js +1 -2
  44. package/lib/tcp/ReconnectingWebsocket.js +72 -64
  45. package/lib/tcp/WebSocketClient.d.ts +0 -1
  46. package/lib/tcp/WebSocketClient.d.ts.map +1 -1
  47. package/lib/tcp/WebSocketClient.js +68 -61
  48. package/lib/team/billing/BillingAPI.js +15 -14
  49. package/lib/team/conversation/TeamConversationAPI.js +6 -5
  50. package/lib/team/feature/FeatureAPI.js +20 -19
  51. package/lib/team/identityprovider/IdentityProviderAPI.js +6 -5
  52. package/lib/team/invitation/TeamInvitationAPI.js +9 -9
  53. package/lib/team/legalhold/LegalHoldAPI.js +6 -5
  54. package/lib/team/member/MemberAPI.js +8 -7
  55. package/lib/team/payment/PaymentAPI.js +12 -11
  56. package/lib/team/scim/ScimAPI.js +6 -5
  57. package/lib/team/search/TeamSearchAPI.js +9 -5
  58. package/lib/team/service/ServiceAPI.js +8 -7
  59. package/lib/team/team/TeamAPI.js +12 -8
  60. package/lib/user/UserAPI.js +40 -30
  61. package/lib/validation/ValidationError.js +1 -0
  62. package/package.json +3 -3
@@ -71,61 +71,27 @@ var PingMessage;
71
71
  PingMessage["PONG"] = "pong";
72
72
  })(PingMessage || (exports.PingMessage = PingMessage = {}));
73
73
  class ReconnectingWebsocket {
74
+ onReconnect;
75
+ static RECONNECTING_OPTIONS = {
76
+ WebSocket: websocket_1.WebSocketNode,
77
+ connectionTimeout: commons_1.TimeUtil.TimeInMillis.SECOND * 4,
78
+ debug: false,
79
+ maxReconnectionDelay: commons_1.TimeUtil.TimeInMillis.SECOND * 10,
80
+ maxRetries: Infinity,
81
+ minReconnectionDelay: commons_1.TimeUtil.TimeInMillis.SECOND * 4,
82
+ reconnectionDelayGrowFactor: 1.3,
83
+ };
84
+ logger;
85
+ socket;
86
+ pingerId;
87
+ PING_INTERVAL = commons_1.TimeUtil.TimeInMillis.SECOND * 20;
88
+ hasUnansweredPing;
89
+ onOpen;
90
+ onMessage;
91
+ onError;
92
+ onClose;
74
93
  constructor(onReconnect, options = {}) {
75
94
  this.onReconnect = onReconnect;
76
- this.PING_INTERVAL = commons_1.TimeUtil.TimeInMillis.SECOND * 20;
77
- this.internalOnError = (error) => {
78
- this.logger.warn('WebSocket connection error', error);
79
- if (this.onError) {
80
- this.onError(error);
81
- }
82
- };
83
- this.internalOnMessage = (event) => {
84
- this.logger.debug('Incoming message');
85
- const data = buffer.bufferToString(event.data);
86
- if (data === PingMessage.PONG) {
87
- this.logger.debug('Received pong from WebSocket');
88
- this.hasUnansweredPing = false;
89
- }
90
- else if (this.onMessage) {
91
- this.onMessage(data);
92
- }
93
- };
94
- this.internalOnOpen = (event) => {
95
- this.logger.debug('WebSocket opened');
96
- if (this.socket) {
97
- this.socket.binaryType = 'arraybuffer';
98
- }
99
- if (this.onOpen) {
100
- this.onOpen(event);
101
- }
102
- };
103
- this.internalOnReconnect = async () => {
104
- this.logger.debug('Connecting to WebSocket');
105
- // The ping is needed to keep the connection alive as long as possible.
106
- // Otherwise the connection would be closed after 1 min of inactivity and re-established.
107
- this.startPinging();
108
- return this.onReconnect();
109
- };
110
- this.internalOnClose = (event) => {
111
- this.logger.debug('WebSocket closed');
112
- this.stopPinging();
113
- if (this.onClose) {
114
- this.onClose(event);
115
- }
116
- };
117
- this.sendPing = () => {
118
- if (this.socket) {
119
- if (this.hasUnansweredPing) {
120
- this.logger.warn('Ping interval check failed');
121
- this.stopPinging();
122
- this.socket.reconnect();
123
- return;
124
- }
125
- this.hasUnansweredPing = true;
126
- this.send(PingMessage.PING);
127
- }
128
- };
129
95
  this.logger = (0, logdown_1.default)('@wireapp/api-client/tcp/ReconnectingWebsocket', {
130
96
  logger: console,
131
97
  markdown: false,
@@ -142,15 +108,54 @@ class ReconnectingWebsocket {
142
108
  * **/
143
109
  (0, BackFromSleepHandler_1.onBackFromSleep)({
144
110
  callback: () => {
145
- var _a;
146
111
  if (this.socket) {
147
112
  this.logger.debug('Back from sleep, reconnecting WebSocket');
148
- (_a = this.socket) === null || _a === void 0 ? void 0 : _a.reconnect();
113
+ this.socket?.reconnect();
149
114
  }
150
115
  },
151
116
  isDisconnected: () => this.getState() === WEBSOCKET_STATE.CLOSED,
152
117
  });
153
118
  }
119
+ internalOnError = (error) => {
120
+ this.logger.warn('WebSocket connection error', error);
121
+ if (this.onError) {
122
+ this.onError(error);
123
+ }
124
+ };
125
+ internalOnMessage = (event) => {
126
+ this.logger.debug('Incoming message');
127
+ const data = buffer.bufferToString(event.data);
128
+ if (data === PingMessage.PONG) {
129
+ this.logger.debug('Received pong from WebSocket');
130
+ this.hasUnansweredPing = false;
131
+ }
132
+ else if (this.onMessage) {
133
+ this.onMessage(data);
134
+ }
135
+ };
136
+ internalOnOpen = (event) => {
137
+ this.logger.debug('WebSocket opened');
138
+ if (this.socket) {
139
+ this.socket.binaryType = 'arraybuffer';
140
+ }
141
+ if (this.onOpen) {
142
+ this.onOpen(event);
143
+ }
144
+ };
145
+ internalOnReconnect = async () => {
146
+ this.logger.debug('Connecting to WebSocket');
147
+ // The ping is needed to keep the connection alive as long as possible.
148
+ // Otherwise the connection would be closed after 1 min of inactivity and re-established.
149
+ this.startPinging();
150
+ return this.onReconnect();
151
+ };
152
+ internalOnClose = (event) => {
153
+ this.logger.debug('WebSocket closed');
154
+ this.stopPinging();
155
+ if (this.onClose) {
156
+ this.onClose(event);
157
+ }
158
+ };
154
159
  connect() {
155
160
  this.socket = this.getReconnectingWebsocket();
156
161
  this.socket.onmessage = this.internalOnMessage;
@@ -173,6 +178,18 @@ class ReconnectingWebsocket {
173
178
  clearInterval(this.pingerId);
174
179
  }
175
180
  }
181
+ sendPing = () => {
182
+ if (this.socket) {
183
+ if (this.hasUnansweredPing) {
184
+ this.logger.warn('Ping interval check failed');
185
+ this.stopPinging();
186
+ this.socket.reconnect();
187
+ return;
188
+ }
189
+ this.hasUnansweredPing = true;
190
+ this.send(PingMessage.PING);
191
+ }
192
+ };
176
193
  getState() {
177
194
  return this.socket ? this.socket.readyState : WEBSOCKET_STATE.CLOSED;
178
195
  }
@@ -199,12 +216,3 @@ class ReconnectingWebsocket {
199
216
  }
200
217
  }
201
218
  exports.ReconnectingWebsocket = ReconnectingWebsocket;
202
- ReconnectingWebsocket.RECONNECTING_OPTIONS = {
203
- WebSocket: websocket_1.WebSocketNode,
204
- connectionTimeout: commons_1.TimeUtil.TimeInMillis.SECOND * 4,
205
- debug: false,
206
- maxReconnectionDelay: commons_1.TimeUtil.TimeInMillis.SECOND * 10,
207
- maxRetries: Infinity,
208
- minReconnectionDelay: commons_1.TimeUtil.TimeInMillis.SECOND * 4,
209
- reconnectionDelayGrowFactor: 1.3,
210
- };
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { ErrorEvent } from 'reconnecting-websocket';
3
2
  import { EventEmitter } from 'events';
4
3
  import { WEBSOCKET_STATE } from './ReconnectingWebsocket';
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../../src/tcp/WebSocketClient.ts"],"names":[],"mappings":";AAoBA,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAwB,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAE/E,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAC,UAAU,EAAe,MAAM,UAAU,CAAC;AAClD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,aAAK,KAAK;IACR,QAAQ,mCAAmC;IAC3C,gBAAgB,2CAA2C;IAC3D,UAAU,qCAAqC;IAC/C,eAAe,0CAA0C;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/E,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3G,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;CACpF;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,KAAK,aAEH;IAEF,SAAS,gBAAsB;CAChC;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,uBAAuB,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,cAAc,CAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,gBAAuB,KAAK,eAAS;gBAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAiB/C,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAOxB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAItB;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAM1B;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAItB;IAEF;;;;;;;;;;;OAWG;IACI,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,eAAe;YAmB3D,kBAAkB;IA0BzB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAMxC;;;;OAIG;IACH,SAAgB,MAAM,aAOpB;IAEF;;;;;OAKG;IACH,SAAgB,IAAI,aAGlB;IAEK,QAAQ,IAAI,OAAO;IAI1B,OAAO,CAAC,iBAAiB;CAc1B"}
1
+ {"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../../src/tcp/WebSocketClient.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAwB,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAE/E,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAC,UAAU,EAAe,MAAM,UAAU,CAAC;AAClD,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,aAAK,KAAK;IACR,QAAQ,mCAAmC;IAC3C,gBAAgB,2CAA2C;IAC3D,UAAU,qCAAqC;IAC/C,eAAe,0CAA0C;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/E,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3G,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;CACpF;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,KAAK,aAEH;IAEF,SAAS,gBAAsB;CAChC;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,uBAAuB,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,cAAc,CAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,gBAAuB,KAAK,eAAS;gBAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAiB/C,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAOxB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAItB;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAM1B;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAItB;IAEF;;;;;;;;;;;OAWG;IACI,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,eAAe;YAmB3D,kBAAkB;IA0BzB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAMxC;;;;OAIG;IACH,SAAgB,MAAM,aAOpB;IAEF;;;;;OAKG;IACH,SAAgB,IAAI,aAGlB;IAEK,QAAQ,IAAI,OAAO;IAI1B,OAAO,CAAC,iBAAiB;CAc1B"}
@@ -35,71 +35,27 @@ var TOPIC;
35
35
  TOPIC["ON_STATE_CHANGE"] = "WebSocketClient.TOPIC.ON_STATE_CHANGE";
36
36
  })(TOPIC || (TOPIC = {}));
37
37
  class AbortHandler {
38
- constructor() {
39
- this.aborted = false;
40
- this.abort = () => {
41
- this.aborted = true;
42
- };
43
- this.isAborted = () => this.aborted;
44
- }
38
+ aborted = false;
39
+ abort = () => {
40
+ this.aborted = true;
41
+ };
42
+ isAborted = () => this.aborted;
45
43
  }
46
44
  exports.AbortHandler = AbortHandler;
47
45
  class WebSocketClient extends events_1.EventEmitter {
46
+ clientId;
47
+ isRefreshingAccessToken;
48
+ baseUrl;
49
+ logger;
50
+ socket;
51
+ websocketState;
52
+ client;
53
+ isSocketLocked;
54
+ bufferedMessages;
55
+ abortHandler;
56
+ static TOPIC = TOPIC;
48
57
  constructor(baseUrl, client) {
49
58
  super();
50
- this.onMessage = (data) => {
51
- if (this.isLocked()) {
52
- this.bufferedMessages.push(data);
53
- }
54
- else {
55
- const notification = JSON.parse(data);
56
- this.emit(WebSocketClient.TOPIC.ON_MESSAGE, notification);
57
- }
58
- };
59
- this.onError = async (error) => {
60
- this.onStateChange(this.socket.getState());
61
- this.emit(WebSocketClient.TOPIC.ON_ERROR, error);
62
- await this.refreshAccessToken();
63
- };
64
- this.onReconnect = async () => {
65
- if (!this.client.hasValidAccessToken()) {
66
- // before we try any connection, we first refresh the access token to make sure we will avoid concurrent accessToken refreshes
67
- await this.refreshAccessToken();
68
- }
69
- return this.buildWebSocketUrl();
70
- };
71
- this.onOpen = () => {
72
- this.onStateChange(this.socket.getState());
73
- };
74
- this.onClose = () => {
75
- var _a;
76
- (_a = this.abortHandler) === null || _a === void 0 ? void 0 : _a.abort();
77
- this.bufferedMessages = [];
78
- this.onStateChange(this.socket.getState());
79
- };
80
- /**
81
- * Unlocks the websocket.
82
- * When unlocking the websocket all buffered messages between
83
- * connecting the websocket and the unlocking the websocket will be emitted.
84
- */
85
- this.unlock = () => {
86
- this.logger.info(`Unlocking WebSocket - Emitting "${this.bufferedMessages.length}" unprocessed messages`);
87
- this.isSocketLocked = false;
88
- for (const bufferedMessage of this.bufferedMessages) {
89
- this.onMessage(bufferedMessage);
90
- }
91
- this.bufferedMessages = [];
92
- };
93
- /**
94
- * Locks the websocket so messages are buffered instead of being emitted.
95
- * Once the websocket gets unlocked buffered messages get emitted.
96
- * This behaviour is needed in order to not miss any messages
97
- * during fetching notifications from the notification stream.
98
- */
99
- this.lock = () => {
100
- this.logger.info('Locking WebSocket');
101
- this.isSocketLocked = true;
102
- };
103
59
  this.bufferedMessages = [];
104
60
  this.isSocketLocked = false;
105
61
  this.baseUrl = baseUrl;
@@ -118,6 +74,35 @@ class WebSocketClient extends events_1.EventEmitter {
118
74
  this.emit(WebSocketClient.TOPIC.ON_STATE_CHANGE, this.websocketState);
119
75
  }
120
76
  }
77
+ onMessage = (data) => {
78
+ if (this.isLocked()) {
79
+ this.bufferedMessages.push(data);
80
+ }
81
+ else {
82
+ const notification = JSON.parse(data);
83
+ this.emit(WebSocketClient.TOPIC.ON_MESSAGE, notification);
84
+ }
85
+ };
86
+ onError = async (error) => {
87
+ this.onStateChange(this.socket.getState());
88
+ this.emit(WebSocketClient.TOPIC.ON_ERROR, error);
89
+ await this.refreshAccessToken();
90
+ };
91
+ onReconnect = async () => {
92
+ if (!this.client.hasValidAccessToken()) {
93
+ // before we try any connection, we first refresh the access token to make sure we will avoid concurrent accessToken refreshes
94
+ await this.refreshAccessToken();
95
+ }
96
+ return this.buildWebSocketUrl();
97
+ };
98
+ onOpen = () => {
99
+ this.onStateChange(this.socket.getState());
100
+ };
101
+ onClose = () => {
102
+ this.abortHandler?.abort();
103
+ this.bufferedMessages = [];
104
+ this.onStateChange(this.socket.getState());
105
+ };
121
106
  /**
122
107
  * Attaches all listeners to the websocket and establishes the connection.
123
108
  *
@@ -176,6 +161,29 @@ class WebSocketClient extends events_1.EventEmitter {
176
161
  this.socket.disconnect(reason);
177
162
  }
178
163
  }
164
+ /**
165
+ * Unlocks the websocket.
166
+ * When unlocking the websocket all buffered messages between
167
+ * connecting the websocket and the unlocking the websocket will be emitted.
168
+ */
169
+ unlock = () => {
170
+ this.logger.info(`Unlocking WebSocket - Emitting "${this.bufferedMessages.length}" unprocessed messages`);
171
+ this.isSocketLocked = false;
172
+ for (const bufferedMessage of this.bufferedMessages) {
173
+ this.onMessage(bufferedMessage);
174
+ }
175
+ this.bufferedMessages = [];
176
+ };
177
+ /**
178
+ * Locks the websocket so messages are buffered instead of being emitted.
179
+ * Once the websocket gets unlocked buffered messages get emitted.
180
+ * This behaviour is needed in order to not miss any messages
181
+ * during fetching notifications from the notification stream.
182
+ */
183
+ lock = () => {
184
+ this.logger.info('Locking WebSocket');
185
+ this.isSocketLocked = true;
186
+ };
179
187
  isLocked() {
180
188
  return this.isSocketLocked;
181
189
  }
@@ -195,4 +203,3 @@ class WebSocketClient extends events_1.EventEmitter {
195
203
  }
196
204
  }
197
205
  exports.WebSocketClient = WebSocketClient;
198
- WebSocketClient.TOPIC = TOPIC;
@@ -20,9 +20,24 @@
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.BillingAPI = void 0;
22
22
  class BillingAPI {
23
+ client;
24
+ static DEFAULT_INVOICES_CHUNK_SIZE = 10;
23
25
  constructor(client) {
24
26
  this.client = client;
25
27
  }
28
+ static URL = {
29
+ BILLING: 'billing',
30
+ CURRENCIES: 'currencies',
31
+ INFO: 'info',
32
+ CARD: 'card',
33
+ COUPON: 'coupon',
34
+ INVOICES: 'invoices',
35
+ PLAN: 'plan',
36
+ LIST: 'list',
37
+ TEAMS: '/teams',
38
+ TEAM: 'team',
39
+ UPCOMING: 'upcoming',
40
+ };
26
41
  async getBillingTeam(teamId) {
27
42
  const config = {
28
43
  method: 'get',
@@ -161,17 +176,3 @@ class BillingAPI {
161
176
  }
162
177
  }
163
178
  exports.BillingAPI = BillingAPI;
164
- BillingAPI.DEFAULT_INVOICES_CHUNK_SIZE = 10;
165
- BillingAPI.URL = {
166
- BILLING: 'billing',
167
- CURRENCIES: 'currencies',
168
- INFO: 'info',
169
- CARD: 'card',
170
- COUPON: 'coupon',
171
- INVOICES: 'invoices',
172
- PLAN: 'plan',
173
- LIST: 'list',
174
- TEAMS: '/teams',
175
- TEAM: 'team',
176
- UPCOMING: 'upcoming',
177
- };
@@ -20,9 +20,15 @@
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.TeamConversationAPI = void 0;
22
22
  class TeamConversationAPI {
23
+ client;
23
24
  constructor(client) {
24
25
  this.client = client;
25
26
  }
27
+ static URL = {
28
+ CONVERSATIONS: 'conversations',
29
+ ROLES: 'roles',
30
+ TEAMS: '/teams',
31
+ };
26
32
  /**
27
33
  * Remove a team conversation.
28
34
  * @param teamId ID of the team to remove the conversation from
@@ -78,8 +84,3 @@ class TeamConversationAPI {
78
84
  }
79
85
  }
80
86
  exports.TeamConversationAPI = TeamConversationAPI;
81
- TeamConversationAPI.URL = {
82
- CONVERSATIONS: 'conversations',
83
- ROLES: 'roles',
84
- TEAMS: '/teams',
85
- };
@@ -23,9 +23,29 @@ const FeatureError_1 = require("./FeatureError");
23
23
  const http_1 = require("../../http");
24
24
  const _1 = require(".");
25
25
  class FeatureAPI {
26
+ client;
26
27
  constructor(client) {
27
28
  this.client = client;
28
29
  }
30
+ static URL = {
31
+ APPLOCK: 'appLock',
32
+ CALLING_CONFERENCE: 'conferenceCalling',
33
+ CALLING_VIDEO: 'videoCalling',
34
+ SELF_DELETING_MESSAGES: 'selfDeletingMessages',
35
+ DIGITAL_SIGNATURES: 'digitalSignatures',
36
+ DL_PATH: 'enforceFileDownloadLocation',
37
+ CONVERSATION_GUEST_LINKS: 'conversationGuestLinks',
38
+ FEATURE_CONFIGS: '/feature-configs',
39
+ FEATURES: 'features',
40
+ FILE_SHARING: 'fileSharing',
41
+ LEGAL_HOLD: 'legalhold',
42
+ SND_FACTOR_PASSWORD: 'sndFactorPasswordChallenge',
43
+ SSO: 'sso',
44
+ MLS: 'mls',
45
+ MLSE2EID: 'mlsE2EId',
46
+ MLS_MIGRATION: 'mlsMigration',
47
+ TEAMS: '/teams',
48
+ };
29
49
  async getAllFeatures() {
30
50
  const config = {
31
51
  method: 'get',
@@ -294,22 +314,3 @@ class FeatureAPI {
294
314
  }
295
315
  }
296
316
  exports.FeatureAPI = FeatureAPI;
297
- FeatureAPI.URL = {
298
- APPLOCK: 'appLock',
299
- CALLING_CONFERENCE: 'conferenceCalling',
300
- CALLING_VIDEO: 'videoCalling',
301
- SELF_DELETING_MESSAGES: 'selfDeletingMessages',
302
- DIGITAL_SIGNATURES: 'digitalSignatures',
303
- DL_PATH: 'enforceFileDownloadLocation',
304
- CONVERSATION_GUEST_LINKS: 'conversationGuestLinks',
305
- FEATURE_CONFIGS: '/feature-configs',
306
- FEATURES: 'features',
307
- FILE_SHARING: 'fileSharing',
308
- LEGAL_HOLD: 'legalhold',
309
- SND_FACTOR_PASSWORD: 'sndFactorPasswordChallenge',
310
- SSO: 'sso',
311
- MLS: 'mls',
312
- MLSE2EID: 'mlsE2EId',
313
- MLS_MIGRATION: 'mlsMigration',
314
- TEAMS: '/teams',
315
- };
@@ -20,9 +20,15 @@
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.IdentityProviderAPI = void 0;
22
22
  class IdentityProviderAPI {
23
+ client;
23
24
  constructor(client) {
24
25
  this.client = client;
25
26
  }
27
+ static URL = {
28
+ METADATA: 'metadata',
29
+ PROVIDER: '/identity-providers',
30
+ SSO: '/sso',
31
+ };
26
32
  async getIdentityProvider(identityProviderId) {
27
33
  const config = {
28
34
  method: 'get',
@@ -80,8 +86,3 @@ class IdentityProviderAPI {
80
86
  }
81
87
  }
82
88
  exports.IdentityProviderAPI = IdentityProviderAPI;
83
- IdentityProviderAPI.URL = {
84
- METADATA: 'metadata',
85
- PROVIDER: '/identity-providers',
86
- SSO: '/sso',
87
- };
@@ -28,6 +28,13 @@ const InvitationError_1 = require("./InvitationError");
28
28
  const http_1 = require("../../http/");
29
29
  const team_1 = require("../team/");
30
30
  class TeamInvitationAPI {
31
+ client;
32
+ static MAX_CHUNK_SIZE = 100;
33
+ static URL = {
34
+ INFO: 'info',
35
+ INVITATIONS: 'invitations',
36
+ EMAIL: 'by-email',
37
+ };
31
38
  constructor(client) {
32
39
  this.client = client;
33
40
  }
@@ -72,7 +79,6 @@ class TeamInvitationAPI {
72
79
  await this.client.sendJSON(config);
73
80
  }
74
81
  async headInvitation(email) {
75
- var _a, _b;
76
82
  const config = {
77
83
  method: 'head',
78
84
  params: {
@@ -84,8 +90,8 @@ class TeamInvitationAPI {
84
90
  await this.client.sendJSON(config);
85
91
  }
86
92
  catch (error) {
87
- if (axios_1.default.isAxiosError(error) && ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status)) {
88
- const status = (_b = error.response) === null || _b === void 0 ? void 0 : _b.status;
93
+ if (axios_1.default.isAxiosError(error) && error.response?.status) {
94
+ const status = error.response?.status;
89
95
  switch (status) {
90
96
  case http_status_codes_1.StatusCodes.NOT_FOUND: {
91
97
  throw new InvitationError_1.InvitationNotFoundError('Invitation not found');
@@ -140,9 +146,3 @@ class TeamInvitationAPI {
140
146
  }
141
147
  }
142
148
  exports.TeamInvitationAPI = TeamInvitationAPI;
143
- TeamInvitationAPI.MAX_CHUNK_SIZE = 100;
144
- TeamInvitationAPI.URL = {
145
- INFO: 'info',
146
- INVITATIONS: 'invitations',
147
- EMAIL: 'by-email',
148
- };
@@ -21,9 +21,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.LegalHoldAPI = void 0;
22
22
  const TeamAPI_1 = require("../team/TeamAPI");
23
23
  class LegalHoldAPI {
24
+ client;
24
25
  constructor(client) {
25
26
  this.client = client;
26
27
  }
28
+ static URL = {
29
+ APPROVE_LEGAL_HOLD: 'approve',
30
+ LEGAL_HOLD: 'legalhold',
31
+ SETTINGS_LEGAL_HOLD: 'settings',
32
+ };
27
33
  async getMemberLegalHold(teamId, userId) {
28
34
  const config = {
29
35
  method: 'get',
@@ -88,8 +94,3 @@ class LegalHoldAPI {
88
94
  }
89
95
  }
90
96
  exports.LegalHoldAPI = LegalHoldAPI;
91
- LegalHoldAPI.URL = {
92
- APPROVE_LEGAL_HOLD: 'approve',
93
- LEGAL_HOLD: 'legalhold',
94
- SETTINGS_LEGAL_HOLD: 'settings',
95
- };
@@ -28,9 +28,17 @@ const http_1 = require("../../http/");
28
28
  const user_1 = require("../../user");
29
29
  const TeamAPI_1 = require("../team/TeamAPI");
30
30
  class MemberAPI {
31
+ client;
32
+ // Maximum 1600 due to "413 Request Entity Too Large" response
33
+ static DEFAULT_MEMBERS_CHUNK_SIZE = 1600;
31
34
  constructor(client) {
32
35
  this.client = client;
33
36
  }
37
+ static URL = {
38
+ MEMBERS: 'members',
39
+ CSV: 'csv',
40
+ MEMBERS_BY_ID_LIST: 'get-members-by-ids-using-post',
41
+ };
34
42
  async getMember(teamId, userId) {
35
43
  const config = {
36
44
  method: 'get',
@@ -139,10 +147,3 @@ class MemberAPI {
139
147
  }
140
148
  }
141
149
  exports.MemberAPI = MemberAPI;
142
- // Maximum 1600 due to "413 Request Entity Too Large" response
143
- MemberAPI.DEFAULT_MEMBERS_CHUNK_SIZE = 1600;
144
- MemberAPI.URL = {
145
- MEMBERS: 'members',
146
- CSV: 'csv',
147
- MEMBERS_BY_ID_LIST: 'get-members-by-ids-using-post',
148
- };
@@ -20,9 +20,21 @@
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.PaymentAPI = void 0;
22
22
  class PaymentAPI {
23
+ client;
24
+ static DEFAULT_INVOICES_CHUNK_SIZE = 10;
23
25
  constructor(client) {
24
26
  this.client = client;
25
27
  }
28
+ static URL = {
29
+ BILLING: 'billing',
30
+ CHARGES: 'charges',
31
+ CURRENCIES: 'currencies',
32
+ INFO: 'info',
33
+ INVOICES: 'invoices',
34
+ PLAN: 'plan',
35
+ PLANS: 'plans',
36
+ TEAMS: '/teams',
37
+ };
26
38
  /**
27
39
  * @deprecated Use BillingAPI
28
40
  */
@@ -142,14 +154,3 @@ class PaymentAPI {
142
154
  }
143
155
  }
144
156
  exports.PaymentAPI = PaymentAPI;
145
- PaymentAPI.DEFAULT_INVOICES_CHUNK_SIZE = 10;
146
- PaymentAPI.URL = {
147
- BILLING: 'billing',
148
- CHARGES: 'charges',
149
- CURRENCIES: 'currencies',
150
- INFO: 'info',
151
- INVOICES: 'invoices',
152
- PLAN: 'plan',
153
- PLANS: 'plans',
154
- TEAMS: '/teams',
155
- };
@@ -20,9 +20,14 @@
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.ScimAPI = void 0;
22
22
  class ScimAPI {
23
+ client;
23
24
  constructor(client) {
24
25
  this.client = client;
25
26
  }
27
+ static URL = {
28
+ AUTH_TOKENS: 'auth-tokens',
29
+ SCIM: '/scim',
30
+ };
26
31
  async getTokens() {
27
32
  const config = {
28
33
  method: 'get',
@@ -41,7 +46,7 @@ class ScimAPI {
41
46
  }
42
47
  async postToken(description, password, verificationCode) {
43
48
  const config = {
44
- data: Object.assign({ description, password }, (verificationCode && { verification_code: verificationCode })),
49
+ data: { description, password, ...(verificationCode && { verification_code: verificationCode }) },
45
50
  method: 'post',
46
51
  url: `${ScimAPI.URL.SCIM}/${ScimAPI.URL.AUTH_TOKENS}`,
47
52
  };
@@ -50,7 +55,3 @@ class ScimAPI {
50
55
  }
51
56
  }
52
57
  exports.ScimAPI = ScimAPI;
53
- ScimAPI.URL = {
54
- AUTH_TOKENS: 'auth-tokens',
55
- SCIM: '/scim',
56
- };