@wildix/xbees-conversations-utils 1.2.1 → 1.2.3

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 (74) hide show
  1. package/dist-cjs/normalization.js +1 -1
  2. package/dist-cjs/rateLimits/RedisCooldown.js +66 -0
  3. package/dist-cjs/rateLimits/constants.js +43 -0
  4. package/dist-cjs/rateLimits/createRateLimitedStreamProxy.js +92 -0
  5. package/dist-cjs/rateLimits/exception/createRateLimitExceededException.js +21 -0
  6. package/dist-cjs/rateLimits/exception/processStreamRateLimitException.js +47 -0
  7. package/dist-cjs/rateLimits/executeStreamRequestWithRateLimitHandling.js +94 -0
  8. package/dist-cjs/rateLimits/generatedMethodNames.js +320 -0
  9. package/dist-cjs/rateLimits/helpers/RedisCooldown.js +174 -0
  10. package/dist-cjs/rateLimits/helpers/createRateLimitExceededException.js +32 -0
  11. package/dist-cjs/rateLimits/helpers/executeWithRateLimitHandling.js +144 -0
  12. package/dist-cjs/rateLimits/helpers/headerUtils.js +40 -0
  13. package/dist-cjs/rateLimits/helpers/isStreamChannelLike.js +23 -0
  14. package/dist-cjs/rateLimits/helpers/processStreamBudgetHeaders.js +93 -0
  15. package/dist-cjs/rateLimits/helpers/processStreamRateLimitException.js +63 -0
  16. package/dist-cjs/rateLimits/helpers/processStreamRateLimitHeaders.js +50 -0
  17. package/dist-cjs/rateLimits/helpers/rateLimitSnapshot.js +31 -0
  18. package/dist-cjs/rateLimits/helpers/registerStreamBudgetInterceptors.js +48 -0
  19. package/dist-cjs/rateLimits/helpers/registerStreamInterceptors.js +58 -0
  20. package/dist-cjs/rateLimits/helpers/splitCallArgsAndOptions.js +21 -0
  21. package/dist-cjs/rateLimits/index.js +7 -0
  22. package/dist-cjs/rateLimits/types.js +3 -0
  23. package/dist-cjs/rateLimits/withStreamRateLimitOptions.js +10 -0
  24. package/dist-cjs/streamRateLimitHandlingProxy/helpers/executeWithRateLimitHandling.js +5 -4
  25. package/dist-cjs/streamRateLimitHandlingProxy/helpers/sleep.js +6 -0
  26. package/dist-es/normalization.js +1 -1
  27. package/dist-es/rateLimits/RedisCooldown.js +62 -0
  28. package/dist-es/rateLimits/constants.js +33 -0
  29. package/dist-es/rateLimits/createRateLimitedStreamProxy.js +88 -0
  30. package/dist-es/rateLimits/exception/createRateLimitExceededException.js +17 -0
  31. package/dist-es/rateLimits/exception/processStreamRateLimitException.js +37 -0
  32. package/dist-es/rateLimits/executeStreamRequestWithRateLimitHandling.js +93 -0
  33. package/dist-es/rateLimits/generatedMethodNames.js +317 -0
  34. package/dist-es/rateLimits/helpers/RedisCooldown.js +170 -0
  35. package/dist-es/rateLimits/helpers/createRateLimitExceededException.js +28 -0
  36. package/dist-es/rateLimits/helpers/executeWithRateLimitHandling.js +140 -0
  37. package/dist-es/rateLimits/helpers/headerUtils.js +34 -0
  38. package/dist-es/rateLimits/helpers/isStreamChannelLike.js +19 -0
  39. package/dist-es/rateLimits/helpers/processStreamBudgetHeaders.js +89 -0
  40. package/dist-es/rateLimits/helpers/processStreamRateLimitException.js +59 -0
  41. package/dist-es/rateLimits/helpers/processStreamRateLimitHeaders.js +46 -0
  42. package/dist-es/rateLimits/helpers/rateLimitSnapshot.js +26 -0
  43. package/dist-es/rateLimits/helpers/registerStreamBudgetInterceptors.js +44 -0
  44. package/dist-es/rateLimits/helpers/registerStreamInterceptors.js +54 -0
  45. package/dist-es/rateLimits/helpers/splitCallArgsAndOptions.js +17 -0
  46. package/dist-es/rateLimits/index.js +4 -0
  47. package/dist-es/rateLimits/types.js +1 -0
  48. package/dist-es/rateLimits/withStreamRateLimitOptions.js +6 -0
  49. package/dist-es/streamRateLimitHandlingProxy/helpers/executeWithRateLimitHandling.js +1 -1
  50. package/dist-es/streamRateLimitHandlingProxy/helpers/sleep.js +4 -0
  51. package/dist-types/rateLimits/RedisCooldown.d.ts +7 -0
  52. package/dist-types/rateLimits/constants.d.ts +29 -0
  53. package/dist-types/rateLimits/createRateLimitedStreamProxy.d.ts +11 -0
  54. package/dist-types/rateLimits/exception/createRateLimitExceededException.d.ts +12 -0
  55. package/dist-types/rateLimits/exception/processStreamRateLimitException.d.ts +8 -0
  56. package/dist-types/rateLimits/executeStreamRequestWithRateLimitHandling.d.ts +8 -0
  57. package/dist-types/rateLimits/generatedMethodNames.d.ts +11 -0
  58. package/dist-types/rateLimits/helpers/RedisCooldown.d.ts +11 -0
  59. package/dist-types/rateLimits/helpers/createRateLimitExceededException.d.ts +10 -0
  60. package/dist-types/rateLimits/helpers/executeWithRateLimitHandling.d.ts +2 -0
  61. package/dist-types/rateLimits/helpers/headerUtils.d.ts +4 -0
  62. package/dist-types/rateLimits/helpers/isStreamChannelLike.d.ts +6 -0
  63. package/dist-types/rateLimits/helpers/processStreamBudgetHeaders.d.ts +9 -0
  64. package/dist-types/rateLimits/helpers/processStreamRateLimitException.d.ts +3 -0
  65. package/dist-types/rateLimits/helpers/processStreamRateLimitHeaders.d.ts +6 -0
  66. package/dist-types/rateLimits/helpers/rateLimitSnapshot.d.ts +3 -0
  67. package/dist-types/rateLimits/helpers/registerStreamBudgetInterceptors.d.ts +2 -0
  68. package/dist-types/rateLimits/helpers/registerStreamInterceptors.d.ts +2 -0
  69. package/dist-types/rateLimits/helpers/splitCallArgsAndOptions.d.ts +6 -0
  70. package/dist-types/rateLimits/index.d.ts +4 -0
  71. package/dist-types/rateLimits/types.d.ts +68 -0
  72. package/dist-types/rateLimits/withStreamRateLimitOptions.d.ts +6 -0
  73. package/dist-types/streamRateLimitHandlingProxy/helpers/sleep.d.ts +2 -0
  74. package/package.json +1 -1
@@ -0,0 +1,88 @@
1
+ import { CHANNEL_SYNC_METHOD_NAMES, CHANNEL_SYNC_PROXY_RESULT_METHOD_NAMES, DEFAULT_OPTIONS, STREAM_CHANNEL_RESULT_METHOD_NAMES, STREAM_SYNC_CHANNEL_RESULT_METHOD_NAMES, STREAM_SYNC_METHOD_NAMES, } from './constants';
2
+ import { executeWithRateLimitHandling } from './helpers/executeWithRateLimitHandling';
3
+ import { isStreamChannelLike } from './helpers/isStreamChannelLike';
4
+ import { registerStreamInterceptors } from './helpers/registerStreamInterceptors';
5
+ import { splitCallArgsAndOptions } from './helpers/splitCallArgsAndOptions';
6
+ const STREAM_SYNC_METHODS = new Set(STREAM_SYNC_METHOD_NAMES);
7
+ const STREAM_CHANNEL_RESULT_METHODS = new Set(STREAM_CHANNEL_RESULT_METHOD_NAMES);
8
+ const STREAM_SYNC_CHANNEL_RESULT_METHODS = new Set(STREAM_SYNC_CHANNEL_RESULT_METHOD_NAMES);
9
+ const CHANNEL_SYNC_METHODS = new Set(CHANNEL_SYNC_METHOD_NAMES);
10
+ const CHANNEL_SYNC_PROXY_RESULT_METHODS = new Set(CHANNEL_SYNC_PROXY_RESULT_METHOD_NAMES);
11
+ function wrapKnownChannelResult(result, dependencies) {
12
+ if (Array.isArray(result)) {
13
+ return result.map((item) => wrapKnownChannelResult(item, dependencies));
14
+ }
15
+ if (typeof result !== 'object' || result === null) {
16
+ return result;
17
+ }
18
+ return wrapTarget(result, dependencies);
19
+ }
20
+ function normalizeStreamCallResult(result, dependencies, wrapAsChannelResult = false) {
21
+ if (wrapAsChannelResult) {
22
+ return wrapKnownChannelResult(result, dependencies);
23
+ }
24
+ if (Array.isArray(result)) {
25
+ return result.map((item) => normalizeStreamCallResult(item, dependencies));
26
+ }
27
+ if (!isStreamChannelLike(result)) {
28
+ return result;
29
+ }
30
+ return wrapTarget(result, dependencies);
31
+ }
32
+ function createRateLimitedMethodWrapper(target, value, operation, dependencies, wrapAsChannelResult) {
33
+ return async (...args) => {
34
+ const { callArgs, callOptions } = splitCallArgsAndOptions(args);
35
+ const result = await executeWithRateLimitHandling(() => Reflect.apply(value, target, callArgs), operation, dependencies.context, {
36
+ ...DEFAULT_OPTIONS,
37
+ ...callOptions,
38
+ });
39
+ return normalizeStreamCallResult(result, dependencies, wrapAsChannelResult);
40
+ };
41
+ }
42
+ function wrapTarget(target, dependencies) {
43
+ const cachedObject = dependencies.cache.get(target);
44
+ if (cachedObject) {
45
+ return cachedObject;
46
+ }
47
+ const proxy = new Proxy(target, {
48
+ get: (originalTarget, property, receiver) => {
49
+ const value = Reflect.get(originalTarget, property, receiver);
50
+ if (typeof property !== 'string' || typeof value !== 'function') {
51
+ return value;
52
+ }
53
+ if (STREAM_SYNC_CHANNEL_RESULT_METHODS.has(property)) {
54
+ return (...args) => {
55
+ const { callArgs } = splitCallArgsAndOptions(args);
56
+ const result = Reflect.apply(value, originalTarget, callArgs);
57
+ return normalizeStreamCallResult(result, dependencies, true);
58
+ };
59
+ }
60
+ if (CHANNEL_SYNC_PROXY_RESULT_METHODS.has(property)) {
61
+ return (...args) => {
62
+ const { callArgs } = splitCallArgsAndOptions(args);
63
+ const result = Reflect.apply(value, originalTarget, callArgs);
64
+ if (typeof result === 'object' && result !== null) {
65
+ return wrapTarget(result, dependencies);
66
+ }
67
+ return result;
68
+ };
69
+ }
70
+ if (STREAM_SYNC_METHODS.has(property) || CHANNEL_SYNC_METHODS.has(property)) {
71
+ return (...args) => {
72
+ const { callArgs } = splitCallArgsAndOptions(args);
73
+ return Reflect.apply(value, originalTarget, callArgs);
74
+ };
75
+ }
76
+ return createRateLimitedMethodWrapper(originalTarget, value, property, dependencies, STREAM_CHANNEL_RESULT_METHODS.has(property));
77
+ },
78
+ });
79
+ dependencies.cache.set(target, proxy);
80
+ return proxy;
81
+ }
82
+ export function createRateLimitedStreamProxy(stream, context) {
83
+ registerStreamInterceptors(stream, context);
84
+ return wrapTarget(stream, {
85
+ context,
86
+ cache: new WeakMap(),
87
+ });
88
+ }
@@ -0,0 +1,17 @@
1
+ import {RateLimitExceededException} from '@wildix/xbees-conversations-client';
2
+
3
+ import {DEFAULT_RETRY_AFTER_MS} from '../constants';
4
+
5
+ export function createRateLimitExceededException(options = {}) {
6
+ const {rateLimit, message, operation, retryAfterMs = DEFAULT_RETRY_AFTER_MS} = options;
7
+ const defaultMessage = operation ? `Rate limit exceeded for ${operation}` : 'Rate limit exceeded';
8
+
9
+ return new RateLimitExceededException({
10
+ $metadata: {},
11
+ message: message || defaultMessage,
12
+ rateLimitRemaining: rateLimit?.remaining || 0,
13
+ retryAfter: rateLimit?.reset ? rateLimit.reset - Date.now() : retryAfterMs,
14
+ rateLimit: rateLimit?.limit?.toString() || 'unknown',
15
+ rateLimitReset: rateLimit?.reset || Date.now() + retryAfterMs,
16
+ });
17
+ }
@@ -0,0 +1,37 @@
1
+ import {createRateLimitExceededException} from './createRateLimitExceededException';
2
+
3
+ function isStreamException(error) {
4
+ return (
5
+ typeof error === 'object' &&
6
+ error !== null &&
7
+ 'metadata' in error &&
8
+ typeof error.metadata === 'object' &&
9
+ error.metadata !== null &&
10
+ 'responseCode' in error.metadata
11
+ );
12
+ }
13
+
14
+ function isStreamAPIException(error) {
15
+ return typeof error === 'object' && !!error.code;
16
+ }
17
+
18
+ export function processStreamRateLimitException(error) {
19
+ if (isStreamException(error) && error.metadata?.responseCode === 429) {
20
+ const rateLimit = error.metadata?.rateLimit;
21
+ console.warn('Stream rate limit exceeded [StreamException]', {rateLimit});
22
+
23
+ return createRateLimitExceededException({rateLimit, message: error.message || 'Rate limit exceeded'});
24
+ }
25
+
26
+ if (isStreamAPIException(error) && (error.code === 429 || error.StatusCode === 429)) {
27
+ console.warn('Stream rate limit exceeded [StreamAPIException]', {code: error.code, StatusCode: error.StatusCode});
28
+
29
+ return createRateLimitExceededException({message: error.message || 'Rate limit exceeded'});
30
+ }
31
+
32
+ if (typeof error === 'object' && error !== null && 'status' in error && error.status === 429) {
33
+ console.warn('Stream rate limit exceeded [error.status === 429]');
34
+
35
+ return createRateLimitExceededException({message: 'Rate limit exceeded'});
36
+ }
37
+ }
@@ -0,0 +1,93 @@
1
+ import {setTimeout as sleep} from 'node:timers/promises';
2
+
3
+ import {
4
+ DEFAULT_FIXED_RATE_LIMIT_DELAY_MS,
5
+ DEFAULT_JITTER_MS,
6
+ DEFAULT_OPTS_1_ATTEMPT_NO_COOLDOWN,
7
+ DEFAULT_RETRY_AFTER_MS,
8
+ RETRY_AFTER_BUFFER_MS,
9
+ } from './constants';
10
+ import {createRateLimitExceededException} from './exception/createRateLimitExceededException';
11
+ import {processStreamRateLimitException} from './exception/processStreamRateLimitException';
12
+ import {RedisCooldown} from './RedisCooldown';
13
+
14
+ /** Computes actual backoff delay from rate-limit error and configured caps. */
15
+ function calculateRateLimitDelayMs(error, maxDelayMs) {
16
+ const retryAfterMs =
17
+ typeof error.retryAfter === 'number' ? error.retryAfter + RETRY_AFTER_BUFFER_MS : DEFAULT_RETRY_AFTER_MS;
18
+
19
+ if (retryAfterMs > 0) {
20
+ const jitterMs = Math.floor(Math.random() * DEFAULT_JITTER_MS);
21
+
22
+ return Math.min(maxDelayMs, retryAfterMs + jitterMs);
23
+ }
24
+
25
+ return Math.min(maxDelayMs, DEFAULT_FIXED_RATE_LIMIT_DELAY_MS);
26
+ }
27
+
28
+ /** Executes Stream request with cooldown check, retry policy and rate-limit normalization. */
29
+ export async function executeStreamRequestWithRateLimitHandling(execute, operation, context, options = {}) {
30
+ const {redis} = context;
31
+ const {enableCooldown, maxAttempts, maxDelayMs, maxRetryableDelayMs} = {
32
+ ...DEFAULT_OPTS_1_ATTEMPT_NO_COOLDOWN,
33
+ ...options,
34
+ };
35
+ let attempt = 1;
36
+
37
+ if (enableCooldown) {
38
+ const cooldownMs = await RedisCooldown.getRemainingMs(operation, {redis});
39
+
40
+ if (cooldownMs > 0) {
41
+ console.warn('Skipping stream request due to active rate-limit cooldown', {
42
+ operation,
43
+ cooldown: cooldownMs,
44
+ });
45
+ throw createRateLimitExceededException({operation, retryAfterMs: cooldownMs});
46
+ }
47
+ }
48
+
49
+ for (;;) {
50
+ try {
51
+ return await execute();
52
+ } catch (error) {
53
+ const rateLimitError = processStreamRateLimitException(error);
54
+
55
+ if (!rateLimitError) {
56
+ throw error;
57
+ }
58
+
59
+ const retryAfterMs = calculateRateLimitDelayMs(rateLimitError, maxDelayMs);
60
+
61
+ if (enableCooldown) {
62
+ await RedisCooldown.setRemainingMs(operation, retryAfterMs, {redis});
63
+ }
64
+
65
+ if (attempt < maxAttempts && retryAfterMs <= maxRetryableDelayMs) {
66
+ console.warn('Retrying stream request after rate limit', {
67
+ operation,
68
+ attempt,
69
+ maxAttempts,
70
+ retryAfterMs,
71
+ rateLimit: rateLimitError.rateLimit,
72
+ rateLimitRemaining: rateLimitError.rateLimitRemaining,
73
+ rateLimitReset: rateLimitError.rateLimitReset,
74
+ });
75
+ await sleep(retryAfterMs);
76
+ attempt++;
77
+ continue;
78
+ }
79
+
80
+ console.warn('Propagating stream rate limit w/o retry', {
81
+ operation,
82
+ attempt,
83
+ maxAttempts,
84
+ retryAfterMs,
85
+ maxRetryableDelayMs,
86
+ rateLimit: rateLimitError.rateLimit,
87
+ rateLimitRemaining: rateLimitError.rateLimitRemaining,
88
+ rateLimitReset: rateLimitError.rateLimitReset,
89
+ });
90
+ throw rateLimitError;
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,317 @@
1
+ export const STREAM_METHOD_NAMES = [
2
+ '_addChannelConfig',
3
+ '_buildWSPayload',
4
+ '_callClientListeners',
5
+ '_createImport',
6
+ '_createImportURL',
7
+ '_deleteUserMessageReference',
8
+ '_enrichAxiosOptions',
9
+ '_getConnectionID',
10
+ '_getImport',
11
+ '_getToken',
12
+ '_handleClientEvent',
13
+ '_handleUserEvent',
14
+ '_hasConnectionID',
15
+ '_isUsingServerAuth',
16
+ '_listImports',
17
+ '_logApiError',
18
+ '_logApiRequest',
19
+ '_logApiResponse',
20
+ '_muteStatus',
21
+ '_normalizeDate',
22
+ '_normalizeExpiration',
23
+ '_queryFlagReports',
24
+ '_queryFlags',
25
+ '_reviewFlagReport',
26
+ '_sayHi',
27
+ '_setToken',
28
+ '_setupConnection',
29
+ '_setUser',
30
+ '_startCleaning',
31
+ '_unblockMessage',
32
+ '_updateMemberWatcherReferences',
33
+ '_updateUserMessageReferences',
34
+ '_updateUserReferences',
35
+ '_validateAndGetMessageId',
36
+ 'addDevice',
37
+ 'banUser',
38
+ 'channel',
39
+ 'closeConnection',
40
+ 'commitMessage',
41
+ 'connect',
42
+ 'connectAnonymousUser',
43
+ 'connectUser',
44
+ 'createAbortControllerForNextRequest',
45
+ 'createBlockList',
46
+ 'createCampaign',
47
+ 'createChannelType',
48
+ 'createCommand',
49
+ 'createPermission',
50
+ 'createRole',
51
+ 'createSegment',
52
+ 'createToken',
53
+ 'deactivateUser',
54
+ 'deactivateUsers',
55
+ 'delete',
56
+ 'deleteBlockList',
57
+ 'deleteCampaign',
58
+ 'deleteChannels',
59
+ 'deleteChannelType',
60
+ 'deleteCommand',
61
+ 'deleteMessage',
62
+ 'deletePermission',
63
+ 'deletePushProvider',
64
+ 'deleteRole',
65
+ 'deleteSegment',
66
+ 'deleteUser',
67
+ 'deleteUsers',
68
+ 'devToken',
69
+ 'disconnect',
70
+ 'disconnectUser',
71
+ 'dispatchEvent',
72
+ 'doAxiosRequest',
73
+ 'enrichURL',
74
+ 'errorFromResponse',
75
+ 'exportChannel',
76
+ 'exportChannels',
77
+ 'exportUser',
78
+ 'exportUsers',
79
+ 'flagMessage',
80
+ 'flagUser',
81
+ 'get',
82
+ 'getAppSettings',
83
+ 'getAuthType',
84
+ 'getBlockList',
85
+ 'getCallToken',
86
+ 'getChannelById',
87
+ 'getChannelByMembers',
88
+ 'getChannelType',
89
+ 'getCommand',
90
+ 'getDevices',
91
+ 'getExportChannelStatus',
92
+ 'getMessage',
93
+ 'getPermission',
94
+ 'getRateLimits',
95
+ 'getTask',
96
+ 'getUnreadCount',
97
+ 'getUserAgent',
98
+ 'handleEvent',
99
+ 'handleResponse',
100
+ 'hydrateActiveChannels',
101
+ 'listBlockLists',
102
+ 'listChannelTypes',
103
+ 'listCommands',
104
+ 'listPermissions',
105
+ 'listPushProviders',
106
+ 'listRoles',
107
+ 'markAllRead',
108
+ 'markChannelsRead',
109
+ 'muteUser',
110
+ 'off',
111
+ 'on',
112
+ 'openConnection',
113
+ 'partialUpdateMessage',
114
+ 'partialUpdateUser',
115
+ 'partialUpdateUsers',
116
+ 'patch',
117
+ 'pinMessage',
118
+ 'post',
119
+ 'put',
120
+ 'queryBannedUsers',
121
+ 'queryCampaigns',
122
+ 'queryChannels',
123
+ 'queryMessageFlags',
124
+ 'queryRecipients',
125
+ 'querySegments',
126
+ 'queryUsers',
127
+ 'reactivateUser',
128
+ 'reactivateUsers',
129
+ 'recoverState',
130
+ 'removeDevice',
131
+ 'removeShadowBan',
132
+ 'restoreUsers',
133
+ 'resumeCampaign',
134
+ 'revokeTokens',
135
+ 'revokeUsersToken',
136
+ 'revokeUserToken',
137
+ 'scheduleCampaign',
138
+ 'search',
139
+ 'sendFile',
140
+ 'sendUserCustomEvent',
141
+ 'setAnonymousUser',
142
+ 'setBaseURL',
143
+ 'setGuestUser',
144
+ 'setLocalDevice',
145
+ 'setUser',
146
+ 'setUserAgent',
147
+ 'shadowBan',
148
+ 'stopCampaign',
149
+ 'sync',
150
+ 'testCampaign',
151
+ 'testPushSettings',
152
+ 'testSQSSettings',
153
+ 'translateMessage',
154
+ 'unbanUser',
155
+ 'unblockMessage',
156
+ 'unflagMessage',
157
+ 'unflagUser',
158
+ 'unmuteUser',
159
+ 'unpinMessage',
160
+ 'updateAppSettings',
161
+ 'updateBlockList',
162
+ 'updateCampaign',
163
+ 'updateChannelType',
164
+ 'updateCommand',
165
+ 'updateMessage',
166
+ 'updatePermission',
167
+ 'updateSegment',
168
+ 'updateUser',
169
+ 'updateUsers',
170
+ 'upsertPushProvider',
171
+ 'upsertUser',
172
+ 'upsertUsers',
173
+ 'userMuteStatus',
174
+ 'verifyWebhook',
175
+ ];
176
+ export const STREAM_SYNC_METHOD_NAMES = [
177
+ '_addChannelConfig',
178
+ '_buildWSPayload',
179
+ '_callClientListeners',
180
+ '_deleteUserMessageReference',
181
+ '_enrichAxiosOptions',
182
+ '_getConnectionID',
183
+ '_getToken',
184
+ '_handleClientEvent',
185
+ '_handleUserEvent',
186
+ '_hasConnectionID',
187
+ '_isUsingServerAuth',
188
+ '_logApiError',
189
+ '_logApiRequest',
190
+ '_logApiResponse',
191
+ '_muteStatus',
192
+ '_normalizeDate',
193
+ '_normalizeExpiration',
194
+ '_sayHi',
195
+ '_setUser',
196
+ '_startCleaning',
197
+ '_updateMemberWatcherReferences',
198
+ '_updateUserMessageReferences',
199
+ '_updateUserReferences',
200
+ '_validateAndGetMessageId',
201
+ 'createAbortControllerForNextRequest',
202
+ 'createToken',
203
+ 'devToken',
204
+ 'dispatchEvent',
205
+ 'errorFromResponse',
206
+ 'getAuthType',
207
+ 'getUserAgent',
208
+ 'handleEvent',
209
+ 'handleResponse',
210
+ 'off',
211
+ 'on',
212
+ 'setBaseURL',
213
+ 'setLocalDevice',
214
+ 'setUserAgent',
215
+ 'userMuteStatus',
216
+ 'verifyWebhook',
217
+ ];
218
+ export const STREAM_CHANNEL_RESULT_METHOD_NAMES = [
219
+ 'channel',
220
+ 'getChannelById',
221
+ 'getChannelByMembers',
222
+ 'hydrateActiveChannels',
223
+ 'queryChannels',
224
+ ];
225
+ export const STREAM_SYNC_CHANNEL_RESULT_METHOD_NAMES = [
226
+ 'channel',
227
+ 'getChannelById',
228
+ 'getChannelByMembers',
229
+ 'hydrateActiveChannels',
230
+ ];
231
+ export const CHANNEL_METHOD_NAMES = [
232
+ '_callChannelListeners',
233
+ '_channelURL',
234
+ '_checkInitialized',
235
+ '_countMessageAsUnread',
236
+ '_disconnect',
237
+ '_extendEventWithOwnReactions',
238
+ '_handleChannelEvent',
239
+ '_initializeState',
240
+ '_update',
241
+ 'acceptInvite',
242
+ 'addMembers',
243
+ 'addModerators',
244
+ 'assignRoles',
245
+ 'banUser',
246
+ 'clean',
247
+ 'countUnread',
248
+ 'countUnreadMentions',
249
+ 'create',
250
+ 'createCall',
251
+ 'delete',
252
+ 'deleteFile',
253
+ 'deleteImage',
254
+ 'deleteReaction',
255
+ 'demoteModerators',
256
+ 'disableSlowMode',
257
+ 'enableSlowMode',
258
+ 'getClient',
259
+ 'getConfig',
260
+ 'getMessagesById',
261
+ 'getPinnedMessages',
262
+ 'getReactions',
263
+ 'getReplies',
264
+ 'hide',
265
+ 'inviteMembers',
266
+ 'keystroke',
267
+ 'lastMessage',
268
+ 'lastRead',
269
+ 'markRead',
270
+ 'markUnread',
271
+ 'mute',
272
+ 'muteStatus',
273
+ 'off',
274
+ 'on',
275
+ 'query',
276
+ 'queryMembers',
277
+ 'rejectInvite',
278
+ 'removeMembers',
279
+ 'removeShadowBan',
280
+ 'search',
281
+ 'sendAction',
282
+ 'sendEvent',
283
+ 'sendFile',
284
+ 'sendImage',
285
+ 'sendMessage',
286
+ 'sendReaction',
287
+ 'shadowBan',
288
+ 'show',
289
+ 'stopTyping',
290
+ 'stopWatching',
291
+ 'truncate',
292
+ 'unbanUser',
293
+ 'unmute',
294
+ 'update',
295
+ 'updatePartial',
296
+ 'watch',
297
+ ];
298
+ export const CHANNEL_SYNC_METHOD_NAMES = [
299
+ '_callChannelListeners',
300
+ '_channelURL',
301
+ '_checkInitialized',
302
+ '_countMessageAsUnread',
303
+ '_disconnect',
304
+ '_extendEventWithOwnReactions',
305
+ '_handleChannelEvent',
306
+ '_initializeState',
307
+ 'clean',
308
+ 'countUnread',
309
+ 'countUnreadMentions',
310
+ 'getConfig',
311
+ 'lastMessage',
312
+ 'lastRead',
313
+ 'muteStatus',
314
+ 'off',
315
+ 'on',
316
+ ];
317
+ export const CHANNEL_SYNC_PROXY_RESULT_METHOD_NAMES = ['getClient'];