stream-chat 9.24.0 → 9.26.0
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/dist/cjs/index.browser.js +100 -71
- package/dist/cjs/index.browser.js.map +3 -3
- package/dist/cjs/index.node.js +100 -71
- package/dist/cjs/index.node.js.map +3 -3
- package/dist/esm/index.mjs +100 -71
- package/dist/esm/index.mjs.map +3 -3
- package/dist/types/channel.d.ts +18 -0
- package/dist/types/client.d.ts +1 -1
- package/dist/types/messageDelivery/MessageDeliveryReporter.d.ts +1 -0
- package/dist/types/types.d.ts +19 -0
- package/package.json +1 -1
- package/src/channel.ts +41 -0
- package/src/channel_state.ts +9 -5
- package/src/client.ts +2 -5
- package/src/messageDelivery/MessageDeliveryReporter.ts +6 -2
- package/src/search/BaseSearchSource.ts +8 -0
- package/src/types.ts +19 -0
|
@@ -1362,10 +1362,8 @@ var ChannelState = class {
|
|
|
1362
1362
|
if (initializing && message.id && this.threads[message.id]) {
|
|
1363
1363
|
delete this.threads[message.id];
|
|
1364
1364
|
}
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
}
|
|
1368
|
-
if (message.created_at.getTime() > this.last_message_at.getTime()) {
|
|
1365
|
+
const shouldSkipLastMessageAtUpdate = this._channel.getConfig()?.skip_last_msg_update_for_system_msgs && message.type === "system";
|
|
1366
|
+
if (!shouldSkipLastMessageAtUpdate && (!this.last_message_at || message.created_at.getTime() > this.last_message_at.getTime())) {
|
|
1369
1367
|
this.last_message_at = new Date(message.created_at.getTime());
|
|
1370
1368
|
}
|
|
1371
1369
|
}
|
|
@@ -4651,6 +4649,62 @@ var createActiveCommandGuardMiddleware = () => ({
|
|
|
4651
4649
|
id: "stream-io/text-composer/active-command-guard"
|
|
4652
4650
|
});
|
|
4653
4651
|
|
|
4652
|
+
// src/errors.ts
|
|
4653
|
+
var APIErrorCodes = {
|
|
4654
|
+
"-1": { name: "InternalSystemError", retryable: true },
|
|
4655
|
+
"2": { name: "AccessKeyError", retryable: false },
|
|
4656
|
+
"3": { name: "AuthenticationFailedError", retryable: true },
|
|
4657
|
+
"4": { name: "InputError", retryable: false },
|
|
4658
|
+
"6": { name: "DuplicateUsernameError", retryable: false },
|
|
4659
|
+
"9": { name: "RateLimitError", retryable: true },
|
|
4660
|
+
"16": { name: "DoesNotExistError", retryable: false },
|
|
4661
|
+
"17": { name: "NotAllowedError", retryable: false },
|
|
4662
|
+
"18": { name: "EventNotSupportedError", retryable: false },
|
|
4663
|
+
"19": { name: "ChannelFeatureNotSupportedError", retryable: false },
|
|
4664
|
+
"20": { name: "MessageTooLongError", retryable: false },
|
|
4665
|
+
"21": { name: "MultipleNestingLevelError", retryable: false },
|
|
4666
|
+
"22": { name: "PayloadTooBigError", retryable: false },
|
|
4667
|
+
"23": { name: "RequestTimeoutError", retryable: true },
|
|
4668
|
+
"24": { name: "MaxHeaderSizeExceededError", retryable: false },
|
|
4669
|
+
"40": { name: "AuthErrorTokenExpired", retryable: false },
|
|
4670
|
+
"41": { name: "AuthErrorTokenNotValidYet", retryable: false },
|
|
4671
|
+
"42": { name: "AuthErrorTokenUsedBeforeIssuedAt", retryable: false },
|
|
4672
|
+
"43": { name: "AuthErrorTokenSignatureInvalid", retryable: false },
|
|
4673
|
+
"44": { name: "CustomCommandEndpointMissingError", retryable: false },
|
|
4674
|
+
"45": { name: "CustomCommandEndpointCallError", retryable: true },
|
|
4675
|
+
"46": { name: "ConnectionIDNotFoundError", retryable: false },
|
|
4676
|
+
"60": { name: "CoolDownError", retryable: true },
|
|
4677
|
+
"69": { name: "ErrWrongRegion", retryable: false },
|
|
4678
|
+
"70": { name: "ErrQueryChannelPermissions", retryable: false },
|
|
4679
|
+
"71": { name: "ErrTooManyConnections", retryable: true },
|
|
4680
|
+
"99": { name: "AppSuspendedError", retryable: false }
|
|
4681
|
+
};
|
|
4682
|
+
function isAPIError(error) {
|
|
4683
|
+
return error.code !== void 0;
|
|
4684
|
+
}
|
|
4685
|
+
function isErrorRetryable(error) {
|
|
4686
|
+
if (!error.code) return false;
|
|
4687
|
+
const err = APIErrorCodes[`${error.code}`];
|
|
4688
|
+
if (!err) return false;
|
|
4689
|
+
return err.retryable;
|
|
4690
|
+
}
|
|
4691
|
+
function isConnectionIDError(error) {
|
|
4692
|
+
return error.code === 46;
|
|
4693
|
+
}
|
|
4694
|
+
function isWSFailure(err) {
|
|
4695
|
+
if (typeof err.isWSFailure === "boolean") {
|
|
4696
|
+
return err.isWSFailure;
|
|
4697
|
+
}
|
|
4698
|
+
try {
|
|
4699
|
+
return JSON.parse(err.message).isWSFailure;
|
|
4700
|
+
} catch (_) {
|
|
4701
|
+
return false;
|
|
4702
|
+
}
|
|
4703
|
+
}
|
|
4704
|
+
function isErrorResponse(res) {
|
|
4705
|
+
return !res.status || res.status < 200 || 300 <= res.status;
|
|
4706
|
+
}
|
|
4707
|
+
|
|
4654
4708
|
// src/search/BaseSearchSource.ts
|
|
4655
4709
|
var DEFAULT_SEARCH_SOURCE_OPTIONS = {
|
|
4656
4710
|
debounceMs: 300,
|
|
@@ -4785,6 +4839,9 @@ var BaseSearchSource = class extends BaseSearchSourceBase {
|
|
|
4785
4839
|
stateUpdate.items = await this.filterQueryResults(items);
|
|
4786
4840
|
} catch (e) {
|
|
4787
4841
|
stateUpdate.lastQueryError = e;
|
|
4842
|
+
if (isAPIError(e) && !isErrorRetryable(e)) {
|
|
4843
|
+
stateUpdate.hasNext = false;
|
|
4844
|
+
}
|
|
4788
4845
|
} finally {
|
|
4789
4846
|
this.state.next(this.getStateAfterQuery(stateUpdate, hasNewSearchQuery));
|
|
4790
4847
|
}
|
|
@@ -4815,6 +4872,9 @@ var BaseSearchSourceSync = class extends BaseSearchSourceBase {
|
|
|
4815
4872
|
stateUpdate.items = this.filterQueryResults(items);
|
|
4816
4873
|
} catch (e) {
|
|
4817
4874
|
stateUpdate.lastQueryError = e;
|
|
4875
|
+
if (isAPIError(e) && !isErrorRetryable(e)) {
|
|
4876
|
+
stateUpdate.hasNext = false;
|
|
4877
|
+
}
|
|
4818
4878
|
} finally {
|
|
4819
4879
|
this.state.next(this.getStateAfterQuery(stateUpdate, hasNewSearchQuery));
|
|
4820
4880
|
}
|
|
@@ -7176,7 +7236,7 @@ var MARK_AS_DELIVERED_BUFFER_TIMEOUT = 1e3;
|
|
|
7176
7236
|
var MARK_AS_READ_THROTTLE_TIMEOUT2 = 1e3;
|
|
7177
7237
|
var isChannel = (item) => item instanceof Channel;
|
|
7178
7238
|
var isThread = (item) => item instanceof Thread;
|
|
7179
|
-
var MessageDeliveryReporter = class {
|
|
7239
|
+
var MessageDeliveryReporter = class _MessageDeliveryReporter {
|
|
7180
7240
|
constructor({ client }) {
|
|
7181
7241
|
this.deliveryReportCandidates = /* @__PURE__ */ new Map();
|
|
7182
7242
|
this.nextDeliveryReportCandidates = /* @__PURE__ */ new Map();
|
|
@@ -7290,6 +7350,10 @@ var MessageDeliveryReporter = class {
|
|
|
7290
7350
|
get hasDeliveryCandidates() {
|
|
7291
7351
|
return this.deliveryReportCandidates.size > 0;
|
|
7292
7352
|
}
|
|
7353
|
+
static hasPermissionToReportDeliveryFor(collection) {
|
|
7354
|
+
if (isChannel(collection)) return !!collection.getConfig()?.delivery_events;
|
|
7355
|
+
if (isThread(collection)) return !!collection.channel.getConfig()?.delivery_events;
|
|
7356
|
+
}
|
|
7293
7357
|
/**
|
|
7294
7358
|
* Build latest_delivered_messages payload from an arbitrary buffer (deliveryReportCandidates / nextDeliveryReportCandidates)
|
|
7295
7359
|
*/
|
|
@@ -7321,8 +7385,7 @@ var MessageDeliveryReporter = class {
|
|
|
7321
7385
|
* @param collection
|
|
7322
7386
|
*/
|
|
7323
7387
|
trackDeliveredCandidate(collection) {
|
|
7324
|
-
if (
|
|
7325
|
-
if (isThread(collection) && !collection.channel.getConfig()?.read_events) return;
|
|
7388
|
+
if (!_MessageDeliveryReporter.hasPermissionToReportDeliveryFor(collection)) return;
|
|
7326
7389
|
const candidate = this.getNextDeliveryReportCandidate(collection);
|
|
7327
7390
|
if (!candidate?.key) return;
|
|
7328
7391
|
const buffer = this.markDeliveredRequestInFlight ? this.nextDeliveryReportCandidates : this.deliveryReportCandidates;
|
|
@@ -8194,6 +8257,28 @@ var Channel = class {
|
|
|
8194
8257
|
async addMembers(members, message, options = {}) {
|
|
8195
8258
|
return await this._update({ add_members: members, message, ...options });
|
|
8196
8259
|
}
|
|
8260
|
+
/**
|
|
8261
|
+
* addFilterTags - add filter tags to the channel
|
|
8262
|
+
*
|
|
8263
|
+
* @param {string[]} tags An array of tags to add to the channel
|
|
8264
|
+
* @param {Message} [message] Optional message object for channel members notification
|
|
8265
|
+
* @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating
|
|
8266
|
+
* @return {Promise<UpdateChannelAPIResponse>} The server response
|
|
8267
|
+
*/
|
|
8268
|
+
async addFilterTags(tags, message, options = {}) {
|
|
8269
|
+
return await this._update({ add_filter_tags: tags, message, ...options });
|
|
8270
|
+
}
|
|
8271
|
+
/**
|
|
8272
|
+
* removeFilterTags - remove filter tags from the channel
|
|
8273
|
+
*
|
|
8274
|
+
* @param {string[]} tags An array of tags to remove from the channel
|
|
8275
|
+
* @param {Message} [message] Optional message object for channel members notification
|
|
8276
|
+
* @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating
|
|
8277
|
+
* @return {Promise<UpdateChannelAPIResponse>} The server response
|
|
8278
|
+
*/
|
|
8279
|
+
async removeFilterTags(tags, message, options = {}) {
|
|
8280
|
+
return await this._update({ remove_filter_tags: tags, message, ...options });
|
|
8281
|
+
}
|
|
8197
8282
|
/**
|
|
8198
8283
|
* addModerators - add moderators to the channel
|
|
8199
8284
|
*
|
|
@@ -9137,6 +9222,11 @@ var Channel = class {
|
|
|
9137
9222
|
deliveredAt: event.created_at,
|
|
9138
9223
|
lastDeliveredMessageId: event.last_delivered_message_id
|
|
9139
9224
|
});
|
|
9225
|
+
const client = this.getClient();
|
|
9226
|
+
const isOwnEvent = event.user?.id === client.user?.id;
|
|
9227
|
+
if (isOwnEvent) {
|
|
9228
|
+
client.syncDeliveredCandidates([this]);
|
|
9229
|
+
}
|
|
9140
9230
|
}
|
|
9141
9231
|
break;
|
|
9142
9232
|
case "user.watching.start":
|
|
@@ -10240,64 +10330,6 @@ var TokenManager = class {
|
|
|
10240
10330
|
|
|
10241
10331
|
// src/connection_fallback.ts
|
|
10242
10332
|
var import_axios2 = __toESM(require("axios"));
|
|
10243
|
-
|
|
10244
|
-
// src/errors.ts
|
|
10245
|
-
var APIErrorCodes = {
|
|
10246
|
-
"-1": { name: "InternalSystemError", retryable: true },
|
|
10247
|
-
"2": { name: "AccessKeyError", retryable: false },
|
|
10248
|
-
"3": { name: "AuthenticationFailedError", retryable: true },
|
|
10249
|
-
"4": { name: "InputError", retryable: false },
|
|
10250
|
-
"6": { name: "DuplicateUsernameError", retryable: false },
|
|
10251
|
-
"9": { name: "RateLimitError", retryable: true },
|
|
10252
|
-
"16": { name: "DoesNotExistError", retryable: false },
|
|
10253
|
-
"17": { name: "NotAllowedError", retryable: false },
|
|
10254
|
-
"18": { name: "EventNotSupportedError", retryable: false },
|
|
10255
|
-
"19": { name: "ChannelFeatureNotSupportedError", retryable: false },
|
|
10256
|
-
"20": { name: "MessageTooLongError", retryable: false },
|
|
10257
|
-
"21": { name: "MultipleNestingLevelError", retryable: false },
|
|
10258
|
-
"22": { name: "PayloadTooBigError", retryable: false },
|
|
10259
|
-
"23": { name: "RequestTimeoutError", retryable: true },
|
|
10260
|
-
"24": { name: "MaxHeaderSizeExceededError", retryable: false },
|
|
10261
|
-
"40": { name: "AuthErrorTokenExpired", retryable: false },
|
|
10262
|
-
"41": { name: "AuthErrorTokenNotValidYet", retryable: false },
|
|
10263
|
-
"42": { name: "AuthErrorTokenUsedBeforeIssuedAt", retryable: false },
|
|
10264
|
-
"43": { name: "AuthErrorTokenSignatureInvalid", retryable: false },
|
|
10265
|
-
"44": { name: "CustomCommandEndpointMissingError", retryable: false },
|
|
10266
|
-
"45": { name: "CustomCommandEndpointCallError", retryable: true },
|
|
10267
|
-
"46": { name: "ConnectionIDNotFoundError", retryable: false },
|
|
10268
|
-
"60": { name: "CoolDownError", retryable: true },
|
|
10269
|
-
"69": { name: "ErrWrongRegion", retryable: false },
|
|
10270
|
-
"70": { name: "ErrQueryChannelPermissions", retryable: false },
|
|
10271
|
-
"71": { name: "ErrTooManyConnections", retryable: true },
|
|
10272
|
-
"99": { name: "AppSuspendedError", retryable: false }
|
|
10273
|
-
};
|
|
10274
|
-
function isAPIError(error) {
|
|
10275
|
-
return error.code !== void 0;
|
|
10276
|
-
}
|
|
10277
|
-
function isErrorRetryable(error) {
|
|
10278
|
-
if (!error.code) return false;
|
|
10279
|
-
const err = APIErrorCodes[`${error.code}`];
|
|
10280
|
-
if (!err) return false;
|
|
10281
|
-
return err.retryable;
|
|
10282
|
-
}
|
|
10283
|
-
function isConnectionIDError(error) {
|
|
10284
|
-
return error.code === 46;
|
|
10285
|
-
}
|
|
10286
|
-
function isWSFailure(err) {
|
|
10287
|
-
if (typeof err.isWSFailure === "boolean") {
|
|
10288
|
-
return err.isWSFailure;
|
|
10289
|
-
}
|
|
10290
|
-
try {
|
|
10291
|
-
return JSON.parse(err.message).isWSFailure;
|
|
10292
|
-
} catch (_) {
|
|
10293
|
-
return false;
|
|
10294
|
-
}
|
|
10295
|
-
}
|
|
10296
|
-
function isErrorResponse(res) {
|
|
10297
|
-
return !res.status || res.status < 200 || 300 <= res.status;
|
|
10298
|
-
}
|
|
10299
|
-
|
|
10300
|
-
// src/connection_fallback.ts
|
|
10301
10333
|
var WSConnectionFallback = class {
|
|
10302
10334
|
constructor({ client }) {
|
|
10303
10335
|
/** @private */
|
|
@@ -14639,7 +14671,7 @@ var StreamChat = class _StreamChat {
|
|
|
14639
14671
|
if (this.userAgent) {
|
|
14640
14672
|
return this.userAgent;
|
|
14641
14673
|
}
|
|
14642
|
-
const version = "9.
|
|
14674
|
+
const version = "9.26.0";
|
|
14643
14675
|
const clientBundle = "browser-cjs";
|
|
14644
14676
|
let userAgentString = "";
|
|
14645
14677
|
if (this.sdkIdentifier) {
|
|
@@ -15788,17 +15820,14 @@ var StreamChat = class _StreamChat {
|
|
|
15788
15820
|
return this.delete(`${this.baseURL}/uploads/image`, { url });
|
|
15789
15821
|
}
|
|
15790
15822
|
/**
|
|
15791
|
-
*
|
|
15823
|
+
* Mark the channels delivered for the given messages and the user
|
|
15792
15824
|
*
|
|
15793
15825
|
* @param {MarkDeliveredOptions} data
|
|
15794
15826
|
* @return {Promise<EventAPIResponse | void>} Description
|
|
15795
15827
|
*/
|
|
15796
15828
|
async markChannelsDelivered(data) {
|
|
15797
15829
|
if (!data?.latest_delivered_messages?.length) return;
|
|
15798
|
-
return await this.post(
|
|
15799
|
-
this.baseURL + "/channels/delivered",
|
|
15800
|
-
data ?? {}
|
|
15801
|
-
);
|
|
15830
|
+
return await this.post(this.baseURL + "/channels/delivered", data);
|
|
15802
15831
|
}
|
|
15803
15832
|
syncDeliveredCandidates(collections) {
|
|
15804
15833
|
this.messageDeliveryReporter.syncDeliveredCandidates(collections);
|