@brightchain/brightchain-lib 0.29.27 → 0.30.1
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/package.json +2 -2
- package/src/lib/constants.d.ts +3 -26
- package/src/lib/constants.d.ts.map +1 -1
- package/src/lib/constants.js +2 -1
- package/src/lib/constants.js.map +1 -1
- package/src/lib/db/collection.d.ts +1 -1
- package/src/lib/db/collection.d.ts.map +1 -1
- package/src/lib/db/collection.js +2 -1
- package/src/lib/db/collection.js.map +1 -1
- package/src/lib/enumerations/brightChainStrings.d.ts +18 -0
- package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightChainStrings.js +20 -0
- package/src/lib/enumerations/brightChainStrings.js.map +1 -1
- package/src/lib/enumerations/friendRequestStatus.d.ts +7 -0
- package/src/lib/enumerations/friendRequestStatus.d.ts.map +1 -0
- package/src/lib/enumerations/friendRequestStatus.js +11 -0
- package/src/lib/enumerations/friendRequestStatus.js.map +1 -0
- package/src/lib/enumerations/friendsErrorCode.d.ts +10 -0
- package/src/lib/enumerations/friendsErrorCode.d.ts.map +1 -0
- package/src/lib/enumerations/friendsErrorCode.js +14 -0
- package/src/lib/enumerations/friendsErrorCode.js.map +1 -0
- package/src/lib/enumerations/friendshipStatus.d.ts +7 -0
- package/src/lib/enumerations/friendshipStatus.d.ts.map +1 -0
- package/src/lib/enumerations/friendshipStatus.js +11 -0
- package/src/lib/enumerations/friendshipStatus.js.map +1 -0
- package/src/lib/enumerations/index.d.ts +3 -0
- package/src/lib/enumerations/index.d.ts.map +1 -1
- package/src/lib/enumerations/index.js +4 -0
- package/src/lib/enumerations/index.js.map +1 -1
- package/src/lib/errors/friendsServiceError.d.ts +20 -0
- package/src/lib/errors/friendsServiceError.d.ts.map +1 -0
- package/src/lib/errors/friendsServiceError.js +48 -0
- package/src/lib/errors/friendsServiceError.js.map +1 -0
- package/src/lib/errors/index.d.ts +5 -0
- package/src/lib/errors/index.d.ts.map +1 -1
- package/src/lib/errors/index.js +8 -0
- package/src/lib/errors/index.js.map +1 -1
- package/src/lib/i18n/strings/englishUs.d.ts.map +1 -1
- package/src/lib/i18n/strings/englishUs.js +20 -0
- package/src/lib/i18n/strings/englishUs.js.map +1 -1
- package/src/lib/i18n/strings/french.d.ts.map +1 -1
- package/src/lib/i18n/strings/french.js +20 -0
- package/src/lib/i18n/strings/french.js.map +1 -1
- package/src/lib/i18n/strings/german.d.ts.map +1 -1
- package/src/lib/i18n/strings/german.js +20 -0
- package/src/lib/i18n/strings/german.js.map +1 -1
- package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
- package/src/lib/i18n/strings/japanese.js +20 -0
- package/src/lib/i18n/strings/japanese.js.map +1 -1
- package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
- package/src/lib/i18n/strings/mandarin.js +20 -0
- package/src/lib/i18n/strings/mandarin.js.map +1 -1
- package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
- package/src/lib/i18n/strings/spanish.js +20 -0
- package/src/lib/i18n/strings/spanish.js.map +1 -1
- package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
- package/src/lib/i18n/strings/ukrainian.js +20 -0
- package/src/lib/i18n/strings/ukrainian.js.map +1 -1
- package/src/lib/interfaces/appSubsystemPlugin.d.ts +69 -0
- package/src/lib/interfaces/appSubsystemPlugin.d.ts.map +1 -0
- package/src/lib/interfaces/appSubsystemPlugin.js +3 -0
- package/src/lib/interfaces/appSubsystemPlugin.js.map +1 -0
- package/src/lib/interfaces/communication.d.ts +2 -0
- package/src/lib/interfaces/communication.d.ts.map +1 -1
- package/src/lib/interfaces/constants.d.ts +2 -0
- package/src/lib/interfaces/constants.d.ts.map +1 -1
- package/src/lib/interfaces/friends/baseFriendRequest.d.ts +13 -0
- package/src/lib/interfaces/friends/baseFriendRequest.d.ts.map +1 -0
- package/src/lib/interfaces/friends/baseFriendRequest.js +3 -0
- package/src/lib/interfaces/friends/baseFriendRequest.js.map +1 -0
- package/src/lib/interfaces/friends/baseFriendship.d.ts +11 -0
- package/src/lib/interfaces/friends/baseFriendship.d.ts.map +1 -0
- package/src/lib/interfaces/friends/baseFriendship.js +3 -0
- package/src/lib/interfaces/friends/baseFriendship.js.map +1 -0
- package/src/lib/interfaces/friends/friendsService.d.ts +32 -0
- package/src/lib/interfaces/friends/friendsService.d.ts.map +1 -0
- package/src/lib/interfaces/friends/friendsService.js +3 -0
- package/src/lib/interfaces/friends/friendsService.js.map +1 -0
- package/src/lib/interfaces/friends/friendsSuggestionProvider.d.ts +17 -0
- package/src/lib/interfaces/friends/friendsSuggestionProvider.d.ts.map +1 -0
- package/src/lib/interfaces/friends/friendsSuggestionProvider.js +3 -0
- package/src/lib/interfaces/friends/friendsSuggestionProvider.js.map +1 -0
- package/src/lib/interfaces/friends/index.d.ts +6 -0
- package/src/lib/interfaces/friends/index.d.ts.map +1 -0
- package/src/lib/interfaces/friends/index.js +3 -0
- package/src/lib/interfaces/friends/index.js.map +1 -0
- package/src/lib/interfaces/friends/pagination.d.ts +11 -0
- package/src/lib/interfaces/friends/pagination.d.ts.map +1 -0
- package/src/lib/interfaces/friends/pagination.js +3 -0
- package/src/lib/interfaces/friends/pagination.js.map +1 -0
- package/src/lib/interfaces/index.d.ts +2 -0
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/storage/documentTypes.d.ts +4 -0
- package/src/lib/interfaces/storage/documentTypes.d.ts.map +1 -1
- package/src/lib/services/communication/channelService.d.ts +16 -2
- package/src/lib/services/communication/channelService.d.ts.map +1 -1
- package/src/lib/services/communication/channelService.js +78 -13
- package/src/lib/services/communication/channelService.js.map +1 -1
- package/src/lib/services/communication/conversationService.d.ts.map +1 -1
- package/src/lib/services/communication/conversationService.js +32 -2
- package/src/lib/services/communication/conversationService.js.map +1 -1
- package/src/lib/services/communication/groupService.d.ts.map +1 -1
- package/src/lib/services/communication/groupService.js +28 -2
- package/src/lib/services/communication/groupService.js.map +1 -1
- package/src/lib/services/communication/serverService.js +4 -6
- package/src/lib/services/communication/serverService.js.map +1 -1
- package/src/lib/services/copyOnWrite.service.d.ts +110 -0
- package/src/lib/services/copyOnWrite.service.d.ts.map +1 -0
- package/src/lib/services/copyOnWrite.service.js +256 -0
- package/src/lib/services/copyOnWrite.service.js.map +1 -0
- package/src/lib/services/index.d.ts +1 -0
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +1 -0
- package/src/lib/services/index.js.map +1 -1
- package/src/lib/services/memberStore.d.ts +7 -1
- package/src/lib/services/memberStore.d.ts.map +1 -1
- package/src/lib/services/memberStore.js +57 -1
- package/src/lib/services/memberStore.js.map +1 -1
- package/src/lib/utils/index.d.ts +6 -0
- package/src/lib/utils/index.d.ts.map +1 -1
- package/src/lib/utils/index.js +9 -0
- package/src/lib/utils/index.js.map +1 -1
- package/src/lib/utils/sortPair.d.ts +6 -0
- package/src/lib/utils/sortPair.d.ts.map +1 -0
- package/src/lib/utils/sortPair.js +11 -0
- package/src/lib/utils/sortPair.js.map +1 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FriendRequestStatus } from '../../enumerations/friendRequestStatus';
|
|
2
|
+
/**
|
|
3
|
+
* Represents a directional friend request from one member to another.
|
|
4
|
+
*/
|
|
5
|
+
export interface IBaseFriendRequest<TId> {
|
|
6
|
+
_id: TId;
|
|
7
|
+
requesterId: TId;
|
|
8
|
+
recipientId: TId;
|
|
9
|
+
message?: string;
|
|
10
|
+
status: FriendRequestStatus;
|
|
11
|
+
createdAt: TId extends string ? string : Date;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=baseFriendRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseFriendRequest.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/baseFriendRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,GAAG;IACrC,GAAG,EAAE,GAAG,CAAC;IACT,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseFriendRequest.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/baseFriendRequest.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a symmetric friendship between two members.
|
|
3
|
+
* `memberIdA` is always the lexicographically smaller ID.
|
|
4
|
+
*/
|
|
5
|
+
export interface IBaseFriendship<TId> {
|
|
6
|
+
_id: TId;
|
|
7
|
+
memberIdA: TId;
|
|
8
|
+
memberIdB: TId;
|
|
9
|
+
createdAt: TId extends string ? string : Date;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=baseFriendship.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseFriendship.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/baseFriendship.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,GAAG;IAClC,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseFriendship.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/baseFriendship.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { FriendshipStatus } from '../../enumerations/friendshipStatus';
|
|
2
|
+
import { IBaseFriendRequest } from './baseFriendRequest';
|
|
3
|
+
import { IBaseFriendship } from './baseFriendship';
|
|
4
|
+
import { IPaginatedResult, IPaginationOptions } from './pagination';
|
|
5
|
+
/**
|
|
6
|
+
* Result of a send-friend-request operation.
|
|
7
|
+
*/
|
|
8
|
+
export interface IFriendRequestResult {
|
|
9
|
+
success: boolean;
|
|
10
|
+
autoAccepted?: boolean;
|
|
11
|
+
friendship?: IBaseFriendship<string>;
|
|
12
|
+
friendRequest?: IBaseFriendRequest<string>;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Platform-agnostic Friends service contract consumed by all dApps.
|
|
17
|
+
*/
|
|
18
|
+
export interface IFriendsService {
|
|
19
|
+
sendFriendRequest(requesterId: string, recipientId: string, message?: string): Promise<IFriendRequestResult>;
|
|
20
|
+
acceptFriendRequest(userId: string, requestId: string): Promise<void>;
|
|
21
|
+
rejectFriendRequest(userId: string, requestId: string): Promise<void>;
|
|
22
|
+
cancelFriendRequest(userId: string, requestId: string): Promise<void>;
|
|
23
|
+
removeFriend(userId: string, friendId: string): Promise<void>;
|
|
24
|
+
getFriends(userId: string, options?: IPaginationOptions): Promise<IPaginatedResult<IBaseFriendship<string>>>;
|
|
25
|
+
getReceivedFriendRequests(userId: string, options?: IPaginationOptions): Promise<IPaginatedResult<IBaseFriendRequest<string>>>;
|
|
26
|
+
getSentFriendRequests(userId: string, options?: IPaginationOptions): Promise<IPaginatedResult<IBaseFriendRequest<string>>>;
|
|
27
|
+
getFriendshipStatus(userId: string, otherUserId: string): Promise<FriendshipStatus>;
|
|
28
|
+
areFriends(userIdA: string, userIdB: string): Promise<boolean>;
|
|
29
|
+
getMutualFriends(userId: string, otherUserId: string, options?: IPaginationOptions): Promise<IPaginatedResult<IBaseFriendship<string>>>;
|
|
30
|
+
onUserBlocked(blockerId: string, blockedId: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=friendsService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsService.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/friendsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAE9B,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGtE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG9D,UAAU,CACR,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtD,yBAAyB,CACvB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzD,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzD,mBAAmB,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D,gBAAgB,CACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAGtD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsService.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/friendsService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IBaseFriendship } from './baseFriendship';
|
|
2
|
+
import { IPaginatedResult, IPaginationOptions } from './pagination';
|
|
3
|
+
/**
|
|
4
|
+
* Provides friend suggestions for recipient/attendee pickers across dApps.
|
|
5
|
+
* Wraps IFriendsService.getFriends() with search filtering.
|
|
6
|
+
*/
|
|
7
|
+
export interface IFriendsSuggestionProvider {
|
|
8
|
+
/**
|
|
9
|
+
* Get friends for display in a suggestion picker.
|
|
10
|
+
* @param userId The member requesting suggestions
|
|
11
|
+
* @param searchQuery Optional search string to filter by displayName/username
|
|
12
|
+
* @param options Pagination options
|
|
13
|
+
* @returns Paginated friends matching the query (or all friends if no query)
|
|
14
|
+
*/
|
|
15
|
+
getFriendSuggestions(userId: string, searchQuery?: string, options?: IPaginationOptions): Promise<IPaginatedResult<IBaseFriendship<string>>>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=friendsSuggestionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsSuggestionProvider.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/friendsSuggestionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;;;OAMG;IACH,oBAAoB,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CACvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsSuggestionProvider.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/friendsSuggestionProvider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,6BAA6B,CAAC;AACjD,mBAAmB,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for cursor-based pagination.
|
|
3
|
+
*/
|
|
4
|
+
export interface IPaginationOptions {
|
|
5
|
+
/** Cursor for pagination */
|
|
6
|
+
cursor?: string;
|
|
7
|
+
/** Maximum number of items to return */
|
|
8
|
+
limit?: number;
|
|
9
|
+
}
|
|
10
|
+
export type { IPaginatedResult } from '../communication';
|
|
11
|
+
//# sourceMappingURL=pagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/pagination.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/friends/pagination.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/interfaces/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/interfaces/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,12 +69,16 @@ export interface IMinimalCollection<T extends BsonDocument = BsonDocument> {
|
|
|
69
69
|
toArray(): Promise<T[]>;
|
|
70
70
|
};
|
|
71
71
|
insertOne(doc: T): Promise<unknown>;
|
|
72
|
+
updateOne(filter: Partial<T>, update: Record<string, unknown>): Promise<unknown>;
|
|
73
|
+
deleteOne(filter: Partial<T>): Promise<unknown>;
|
|
72
74
|
}
|
|
73
75
|
/**
|
|
74
76
|
* Minimal database interface used by MemberStore for DB-backed queries.
|
|
75
77
|
* Implemented by BrightDb (structural compatibility — no import needed).
|
|
76
78
|
*/
|
|
77
79
|
export interface IMemberStoreDb {
|
|
80
|
+
/** Database name (pool name). */
|
|
81
|
+
readonly name: string;
|
|
78
82
|
collection<T extends BsonDocument = BsonDocument>(name: string): IMinimalCollection<T>;
|
|
79
83
|
}
|
|
80
84
|
//# sourceMappingURL=documentTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentTypes.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/storage/documentTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,wEAAwE;AACxE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,IAAI,CAAC,EACD,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,mBAAmB,GACnB,mBAAmB,GACnB,KAAK,CACD,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,mBAAmB,GACnB,mBAAmB,CACtB,CAAC;IACN,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;IAChD,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACvE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;IACtD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"documentTypes.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/interfaces/storage/documentTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,wEAAwE;AACxE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,IAAI,CAAC,EACD,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,mBAAmB,GACnB,mBAAmB,GACnB,KAAK,CACD,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,KAAK,GACL,mBAAmB,GACnB,mBAAmB,CACtB,CAAC;IACN,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;IAChD,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACvE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;IACtD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,SAAS,CACP,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC9C,IAAI,EAAE,MAAM,GACX,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAC1B"}
|
|
@@ -81,8 +81,14 @@ export declare class ChannelService {
|
|
|
81
81
|
private readonly keyEpochStates;
|
|
82
82
|
/** token string → IInviteToken */
|
|
83
83
|
private readonly inviteTokens;
|
|
84
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* Per-server channel name uniqueness index.
|
|
86
|
+
* Outer key = serverId (or '__standalone__' for channels without a server).
|
|
87
|
+
* Inner key = normalized channel name → channelId.
|
|
88
|
+
*/
|
|
85
89
|
private readonly nameIndex;
|
|
90
|
+
/** Sentinel key for channels that don't belong to any server. */
|
|
91
|
+
private static readonly STANDALONE_KEY;
|
|
86
92
|
/** Whether init() has already been called (idempotency guard). */
|
|
87
93
|
private initialized;
|
|
88
94
|
private readonly permissionService;
|
|
@@ -159,6 +165,14 @@ export declare class ChannelService {
|
|
|
159
165
|
*/
|
|
160
166
|
private assertEpochExists;
|
|
161
167
|
private normalizeChannelName;
|
|
168
|
+
/** Get the nameIndex scope key for a channel's server (or standalone). */
|
|
169
|
+
private nameScope;
|
|
170
|
+
/** Check if a channel name is taken within a given server scope. */
|
|
171
|
+
private isNameTaken;
|
|
172
|
+
/** Register a channel name in the scoped index. */
|
|
173
|
+
private registerName;
|
|
174
|
+
/** Remove a channel name from the scoped index. */
|
|
175
|
+
private unregisterName;
|
|
162
176
|
/**
|
|
163
177
|
* Create a new channel.
|
|
164
178
|
* Generates a shared symmetric key and encrypts it for the creator.
|
|
@@ -167,7 +181,7 @@ export declare class ChannelService {
|
|
|
167
181
|
*
|
|
168
182
|
* Requirements: 10.3, 1.3, 2.1, 9.1
|
|
169
183
|
*/
|
|
170
|
-
createChannel(name: string, creatorId: string, visibility: ChannelVisibility, topic?: string): Promise<IChannel>;
|
|
184
|
+
createChannel(name: string, creatorId: string, visibility: ChannelVisibility, topic?: string, serverId?: string): Promise<IChannel>;
|
|
171
185
|
/**
|
|
172
186
|
* List channels visible to a member.
|
|
173
187
|
* Returns public channels, plus private/secret/invisible channels
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channelService.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/services/communication/channelService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EACL,iBAAiB,EAGjB,UAAU,EACX,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,QAAQ,EAER,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAEL,oBAAoB,EACrB,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EACL,0BAA0B,EAE3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQxD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;;CAK/C;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,iBAAiB,EAAE,UAAU,CAAC;gBAClC,UAAU,EAAE,UAAU;CAKnC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD;AAED,qBAAa,qBAAsB,SAAQ,KAAK;;CAK/C;AAED,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,UAAU,EAAE,MAAM;CAI/B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,QAAQ,EAAE,MAAM;CAI7B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,KAAK,EAAE,MAAM;CAI1B;AAED;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG,CACxC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,UAAU,KACrB,MAAM,CAAC;AAiBZ;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAS1E;AAED,qBAAa,cAAc;IACzB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IAExD,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IAEvE,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6C;IAE5E,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAEhE
|
|
1
|
+
{"version":3,"file":"channelService.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/services/communication/channelService.ts"],"names":[],"mappings":"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"}
|
|
@@ -151,8 +151,14 @@ class ChannelService {
|
|
|
151
151
|
keyEpochStates = new Map();
|
|
152
152
|
/** token string → IInviteToken */
|
|
153
153
|
inviteTokens = new Map();
|
|
154
|
-
/**
|
|
154
|
+
/**
|
|
155
|
+
* Per-server channel name uniqueness index.
|
|
156
|
+
* Outer key = serverId (or '__standalone__' for channels without a server).
|
|
157
|
+
* Inner key = normalized channel name → channelId.
|
|
158
|
+
*/
|
|
155
159
|
nameIndex = new Map();
|
|
160
|
+
/** Sentinel key for channels that don't belong to any server. */
|
|
161
|
+
static STANDALONE_KEY = '__standalone__';
|
|
156
162
|
/** Whether init() has already been called (idempotency guard). */
|
|
157
163
|
initialized = false;
|
|
158
164
|
permissionService;
|
|
@@ -210,8 +216,8 @@ class ChannelService {
|
|
|
210
216
|
}
|
|
211
217
|
for (const channel of loadedChannels) {
|
|
212
218
|
this.channels.set(channel.id, channel);
|
|
213
|
-
// Rebuild name index
|
|
214
|
-
this.
|
|
219
|
+
// Rebuild name index (scoped by serverId)
|
|
220
|
+
this.registerName(this.nameScope(channel.serverId), channel.name.toLowerCase(), channel.id);
|
|
215
221
|
// Reconstruct key epoch state
|
|
216
222
|
const epochState = (0, rehydrationHelpers_1.reconstructKeyEpochState)(channel.encryptedSharedKey);
|
|
217
223
|
if (epochState) {
|
|
@@ -377,6 +383,37 @@ class ChannelService {
|
|
|
377
383
|
normalizeChannelName(name) {
|
|
378
384
|
return name.toLowerCase().replace(/\s+/g, '-');
|
|
379
385
|
}
|
|
386
|
+
/** Get the nameIndex scope key for a channel's server (or standalone). */
|
|
387
|
+
nameScope(serverId) {
|
|
388
|
+
return serverId ?? ChannelService.STANDALONE_KEY;
|
|
389
|
+
}
|
|
390
|
+
/** Check if a channel name is taken within a given server scope. */
|
|
391
|
+
isNameTaken(scope, normalized, excludeChannelId) {
|
|
392
|
+
const scopeMap = this.nameIndex.get(scope);
|
|
393
|
+
if (!scopeMap)
|
|
394
|
+
return false;
|
|
395
|
+
const existingId = scopeMap.get(normalized);
|
|
396
|
+
return !!existingId && existingId !== excludeChannelId;
|
|
397
|
+
}
|
|
398
|
+
/** Register a channel name in the scoped index. */
|
|
399
|
+
registerName(scope, normalized, channelId) {
|
|
400
|
+
let scopeMap = this.nameIndex.get(scope);
|
|
401
|
+
if (!scopeMap) {
|
|
402
|
+
scopeMap = new Map();
|
|
403
|
+
this.nameIndex.set(scope, scopeMap);
|
|
404
|
+
}
|
|
405
|
+
scopeMap.set(normalized, channelId);
|
|
406
|
+
}
|
|
407
|
+
/** Remove a channel name from the scoped index. */
|
|
408
|
+
unregisterName(scope, normalized) {
|
|
409
|
+
const scopeMap = this.nameIndex.get(scope);
|
|
410
|
+
if (scopeMap) {
|
|
411
|
+
scopeMap.delete(normalized);
|
|
412
|
+
if (scopeMap.size === 0) {
|
|
413
|
+
this.nameIndex.delete(scope);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
380
417
|
// ─── Channel lifecycle ──────────────────────────────────────────────────
|
|
381
418
|
/**
|
|
382
419
|
* Create a new channel.
|
|
@@ -386,9 +423,10 @@ class ChannelService {
|
|
|
386
423
|
*
|
|
387
424
|
* Requirements: 10.3, 1.3, 2.1, 9.1
|
|
388
425
|
*/
|
|
389
|
-
async createChannel(name, creatorId, visibility, topic = '') {
|
|
426
|
+
async createChannel(name, creatorId, visibility, topic = '', serverId) {
|
|
390
427
|
const normalized = this.normalizeChannelName(name);
|
|
391
|
-
|
|
428
|
+
const scope = this.nameScope(serverId);
|
|
429
|
+
if (this.isNameTaken(scope, normalized)) {
|
|
392
430
|
throw new ChannelNameConflictError(name);
|
|
393
431
|
}
|
|
394
432
|
const now = new Date();
|
|
@@ -415,11 +453,12 @@ class ChannelService {
|
|
|
415
453
|
lastMessageAt: now,
|
|
416
454
|
pinnedMessageIds: [],
|
|
417
455
|
historyVisibleToNewMembers: true,
|
|
456
|
+
serverId,
|
|
418
457
|
};
|
|
419
458
|
this.channels.set(channelId, channel);
|
|
420
459
|
this.messages.set(channelId, []);
|
|
421
460
|
this.keyEpochStates.set(channelId, epochState);
|
|
422
|
-
this.
|
|
461
|
+
this.registerName(scope, normalized, channelId);
|
|
423
462
|
this.permissionService.assignRole(creatorId, channelId, communication_1.DefaultRole.OWNER);
|
|
424
463
|
// Persist to storage provider if available
|
|
425
464
|
if (this.channelCollection) {
|
|
@@ -463,13 +502,13 @@ class ChannelService {
|
|
|
463
502
|
this.assertPermission(requesterId, channelId, communication_1.Permission.MANAGE_CHANNEL);
|
|
464
503
|
if (updates.name !== undefined) {
|
|
465
504
|
const normalized = this.normalizeChannelName(updates.name);
|
|
466
|
-
const
|
|
467
|
-
if (
|
|
505
|
+
const scope = this.nameScope(channel.serverId);
|
|
506
|
+
if (this.isNameTaken(scope, normalized, channelId)) {
|
|
468
507
|
throw new ChannelNameConflictError(updates.name);
|
|
469
508
|
}
|
|
470
|
-
this.
|
|
509
|
+
this.unregisterName(scope, channel.name);
|
|
471
510
|
channel.name = normalized;
|
|
472
|
-
this.
|
|
511
|
+
this.registerName(scope, normalized, channelId);
|
|
473
512
|
}
|
|
474
513
|
if (updates.topic !== undefined) {
|
|
475
514
|
channel.topic = updates.topic;
|
|
@@ -494,7 +533,7 @@ class ChannelService {
|
|
|
494
533
|
const channel = this.assertChannelExists(channelId);
|
|
495
534
|
this.assertIsMember(channel, requesterId);
|
|
496
535
|
this.assertPermission(requesterId, channelId, communication_1.Permission.MANAGE_CHANNEL);
|
|
497
|
-
this.
|
|
536
|
+
this.unregisterName(this.nameScope(channel.serverId), channel.name);
|
|
498
537
|
this.channels.delete(channelId);
|
|
499
538
|
this.messages.delete(channelId);
|
|
500
539
|
this.keyEpochStates.delete(channelId);
|
|
@@ -683,7 +722,11 @@ class ChannelService {
|
|
|
683
722
|
await this.channelCollection.update(channelId, channel);
|
|
684
723
|
}
|
|
685
724
|
this.eventEmitter.emitMessageSent('channel', channelId, message.id, senderId);
|
|
686
|
-
|
|
725
|
+
// Return the message with the original readable content for display,
|
|
726
|
+
// while the stored version retains the block reference (magnet URL)
|
|
727
|
+
return this.blockContentStore
|
|
728
|
+
? { ...message, encryptedContent: content }
|
|
729
|
+
: message;
|
|
687
730
|
}
|
|
688
731
|
/**
|
|
689
732
|
* Get messages in a channel with cursor-based pagination.
|
|
@@ -702,7 +745,29 @@ class ChannelService {
|
|
|
702
745
|
for (const msg of msgs) {
|
|
703
746
|
this.assertEpochExists(channelId, msg.keyEpoch);
|
|
704
747
|
}
|
|
705
|
-
|
|
748
|
+
const result = (0, pagination_1.paginateItems)(msgs, cursor, limit);
|
|
749
|
+
// Resolve block references (magnet URLs) back to readable content
|
|
750
|
+
if (this.blockContentStore) {
|
|
751
|
+
const resolved = await Promise.all(result.items.map(async (msg) => {
|
|
752
|
+
if (msg.deleted)
|
|
753
|
+
return msg;
|
|
754
|
+
try {
|
|
755
|
+
const contentBytes = await this.blockContentStore.retrieveContent(msg.encryptedContent);
|
|
756
|
+
if (contentBytes) {
|
|
757
|
+
return {
|
|
758
|
+
...msg,
|
|
759
|
+
encryptedContent: new TextDecoder().decode(contentBytes),
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
catch {
|
|
764
|
+
// Fall back to stored value if retrieval fails
|
|
765
|
+
}
|
|
766
|
+
return msg;
|
|
767
|
+
}));
|
|
768
|
+
return { ...result, items: resolved };
|
|
769
|
+
}
|
|
770
|
+
return result;
|
|
706
771
|
}
|
|
707
772
|
/**
|
|
708
773
|
* Search messages in a channel by keyword.
|