@wireapp/api-client 27.0.9 → 27.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/APIClient.d.ts +0 -1
- package/lib/APIClient.d.ts.map +1 -1
- package/lib/APIClient.js +24 -22
- package/lib/account/AccountAPI.js +16 -15
- package/lib/asset/AssetAPI.d.ts +0 -1
- package/lib/asset/AssetAPI.d.ts.map +1 -1
- package/lib/asset/AssetAPI.js +5 -4
- package/lib/auth/AccessTokenStore.d.ts +0 -1
- package/lib/auth/AccessTokenStore.d.ts.map +1 -1
- package/lib/auth/AccessTokenStore.js +8 -1
- package/lib/auth/AuthAPI.js +22 -27
- package/lib/auth/Cookie.js +2 -2
- package/lib/auth/CookieStore.d.ts +0 -1
- package/lib/auth/CookieStore.d.ts.map +1 -1
- package/lib/auth/CookieStore.js +3 -2
- package/lib/auth/parseAccessToken.js +3 -3
- package/lib/broadcast/BroadcastAPI.js +5 -4
- package/lib/client/ClientAPI.d.ts +1 -1
- package/lib/client/ClientAPI.js +11 -10
- package/lib/connection/ConnectionAPI.js +4 -3
- package/lib/conversation/ConversationAPI/ConversationAPI.js +34 -33
- package/lib/conversation/FederatedBackendsError.js +6 -5
- package/lib/demo/initClient.js +1 -2
- package/lib/generic/GenericAPI.js +1 -0
- package/lib/giphy/GiphyAPI.js +8 -7
- package/lib/http/BackendError.js +3 -0
- package/lib/http/HttpClient.d.ts +0 -1
- package/lib/http/HttpClient.d.ts.map +1 -1
- package/lib/http/HttpClient.js +49 -24
- package/lib/http/NetworkError.js +1 -0
- package/lib/notification/NotificationAPI/NotificationAPI.js +11 -11
- package/lib/notification/NotificationAPI/NotificationsAPI.mocks.d.ts +1 -1
- package/lib/oauth/OAuthAPI.js +8 -7
- package/lib/obfuscation/ObfuscationUtil.js +4 -1
- package/lib/self/SelfAPI.js +12 -11
- package/lib/serviceProvider/ServiceProviderAPI.js +8 -7
- package/lib/services/ServicesAPI.js +13 -11
- package/lib/shims/browser/cookie.d.ts.map +1 -1
- package/lib/shims/browser/websocket.d.ts +1 -1
- package/lib/shims/node/buffer.d.ts +0 -1
- package/lib/shims/node/buffer.d.ts.map +1 -1
- package/lib/shims/node/cookie.d.ts.map +1 -1
- package/lib/shims/node/cookie.js +1 -2
- package/lib/tcp/ReconnectingWebsocket.js +72 -64
- package/lib/tcp/WebSocketClient.d.ts +0 -1
- package/lib/tcp/WebSocketClient.d.ts.map +1 -1
- package/lib/tcp/WebSocketClient.js +68 -61
- package/lib/team/billing/BillingAPI.js +15 -14
- package/lib/team/conversation/TeamConversationAPI.js +6 -5
- package/lib/team/feature/FeatureAPI.js +20 -19
- package/lib/team/identityprovider/IdentityProviderAPI.js +6 -5
- package/lib/team/invitation/TeamInvitationAPI.js +9 -9
- package/lib/team/legalhold/LegalHoldAPI.js +6 -5
- package/lib/team/member/MemberAPI.js +8 -7
- package/lib/team/payment/PaymentAPI.js +12 -11
- package/lib/team/scim/ScimAPI.js +6 -5
- package/lib/team/search/TeamSearchAPI.js +9 -5
- package/lib/team/service/ServiceAPI.js +8 -7
- package/lib/team/team/TeamAPI.js +12 -8
- package/lib/user/UserAPI.js +40 -30
- package/lib/validation/ValidationError.js +1 -0
- package/package.json +4 -4
|
@@ -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
|
-
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../../src/tcp/WebSocketClient.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
this.
|
|
41
|
-
|
|
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) &&
|
|
88
|
-
const 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
|
-
};
|
package/lib/team/scim/ScimAPI.js
CHANGED
|
@@ -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:
|
|
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
|
-
};
|