@roadmanjs/chat 0.0.63 → 0.0.64

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 (45) hide show
  1. package/dist/chat/methods/ChatMessageResolver.methods.js +4 -3
  2. package/dist/chat/methods/ChatMessageResolver.methods.js.map +1 -1
  3. package/package.json +2 -1
  4. package/src/chat/fragments/README.md +1 -0
  5. package/src/chat/fragments/chatAttachment.fragment.ts +15 -0
  6. package/src/chat/fragments/chatConvo.fragment.ts +29 -0
  7. package/src/chat/fragments/chatMessage.fragment.ts +35 -0
  8. package/src/chat/fragments/chatUser.fragment.ts +23 -0
  9. package/src/chat/fragments/index.ts +5 -0
  10. package/src/chat/fragments/resType.ts +15 -0
  11. package/src/chat/index-client.ts +7 -0
  12. package/src/chat/index.ts +5 -0
  13. package/src/chat/methods/ChatConvo.methods.ts +336 -0
  14. package/src/chat/methods/ChatConvo.test.ts +122 -0
  15. package/src/chat/methods/ChatConvoResolver.methods.ts +243 -0
  16. package/src/chat/methods/ChatMessageResolver.methods.ts +218 -0
  17. package/src/chat/methods/index.ts +3 -0
  18. package/src/chat/models/ChatAttachment.model.ts +43 -0
  19. package/src/chat/models/ChatConvo.model.ts +108 -0
  20. package/src/chat/models/ChatMessage.model.ts +102 -0
  21. package/src/chat/models/ChatUser.model.ts +67 -0
  22. package/src/chat/models/chat.txt +17 -0
  23. package/src/chat/models/index.ts +3 -0
  24. package/src/chat/mutations/chatConvo.mutation.ts +20 -0
  25. package/src/chat/mutations/chatMessage.mutation.ts +11 -0
  26. package/src/chat/mutations/index.ts +2 -0
  27. package/src/chat/query/README.md +1 -0
  28. package/src/chat/query/chatConvo.query.ts +33 -0
  29. package/src/chat/query/chatMessage.query.ts +21 -0
  30. package/src/chat/query/index.ts +2 -0
  31. package/src/chat/resolvers/ChatConvo.public.resolver.ts +15 -0
  32. package/src/chat/resolvers/ChatConvo.resolver.ts +71 -0
  33. package/src/chat/resolvers/ChatMessage.resolver.ts +62 -0
  34. package/src/chat/resolvers/index.ts +2 -0
  35. package/src/chat/subscriptions/README.md +1 -0
  36. package/src/chat/subscriptions/chatConvo.subscription.ts +19 -0
  37. package/src/chat/subscriptions/chatMessage.subscription.ts +13 -0
  38. package/src/chat/subscriptions/index.ts +2 -0
  39. package/src/example.ts +16 -0
  40. package/src/index.ts +2 -0
  41. package/src/roadman.ts +25 -0
  42. package/src/scripts/copyClient.ts +64 -0
  43. package/src/scripts/createPackageJsonForClient.ts +32 -0
  44. package/src/shared/ContextType.ts +67 -0
  45. package/src/shared/pubsub.utils.ts +93 -0
@@ -102,8 +102,8 @@ const chatMessage = async (args) => {
102
102
  const query = `
103
103
  SELECT *
104
104
  FROM \`${bucket}\` chat
105
- LET owner = (SELECT o.* FROM \`${bucket}\` AS o USE KEYS chat.owner),
106
- attachments = (SELECT m.* FROM \`${bucket}\` AS m USE KEYS chat.attachments)
105
+ LEFT JOIN \`${bucket}\` owner ON KEYS chat.owner
106
+ LEFT JOIN \`${bucket}\` attachments ON KEYS chat.attachments
107
107
  WHERE chat._type = "${ChatMessage_model_1.ChatMessageModelName}"
108
108
  AND chat.convoId = "${convoId}"
109
109
  AND chat.createdAt ${sign} "${time.toISOString()}"
@@ -125,7 +125,8 @@ const chatMessage = async (args) => {
125
125
  }
126
126
  const dataToSend = rows.map((d) => {
127
127
  const { chat, attachments, owner } = d;
128
- return ChatMessage_model_1.default.parse(Object.assign(Object.assign({}, chat), { attachments, owner: owner[0] || null }));
128
+ return ChatMessage_model_1.default.parse(Object.assign(Object.assign({}, chat), { attachments,
129
+ owner }));
129
130
  });
130
131
  // TODO just add as a queue non-blocking queries
131
132
  if (!isPublic) {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessageResolver.methods.js","sourceRoot":"","sources":["../../../src/chat/methods/ChatMessageResolver.methods.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatMessageResolver.methods.js","sourceRoot":"","sources":["../../../src/chat/methods/ChatMessageResolver.methods.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@roadmanjs/chat",
3
- "version": "0.0.63",
3
+ "version": "0.0.64",
4
4
  "description": " A roadman for chat and groups, using UserType from 'auth'",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
8
+ "src/",
8
9
  "docs/",
9
10
  "dist/",
10
11
  "register/",
@@ -0,0 +1 @@
1
+ # Only for client query graphql-tags
@@ -0,0 +1,15 @@
1
+ import gql from 'graphql-tag';
2
+
3
+ export const ChatAttachmentTypeFragment = gql`
4
+ fragment ChatAttachmentTypeFragment on ChatAttachmentType {
5
+ id
6
+ messageId
7
+ owner
8
+ createdAt
9
+ updatedAt
10
+ filename
11
+ mimetype
12
+ encoding
13
+ url
14
+ }
15
+ `;
@@ -0,0 +1,29 @@
1
+ import {ChatMessageTypeFragment} from './chatMessage.fragment';
2
+ import {ChatUserTypeFragment} from './chatUser.fragment';
3
+ import gql from 'graphql-tag';
4
+
5
+ export const ChatConvoFragment = gql`
6
+ fragment ChatConvoFragment on ChatConvo {
7
+ id
8
+ convoId
9
+ name
10
+ avatar
11
+ owner {
12
+ ...ChatUserTypeFragment
13
+ }
14
+ createdAt
15
+ updatedAt
16
+ group
17
+ public
18
+ unread
19
+ lastMessage {
20
+ ...ChatMessageTypeFragment
21
+ }
22
+ members {
23
+ ...ChatUserTypeFragment
24
+ }
25
+ }
26
+
27
+ ${ChatMessageTypeFragment}
28
+ ${ChatUserTypeFragment}
29
+ `;
@@ -0,0 +1,35 @@
1
+ import {ChatAttachmentTypeFragment} from './chatAttachment.fragment';
2
+ import {ChatUserTypeFragment} from './chatUser.fragment';
3
+ import gql from 'graphql-tag';
4
+
5
+ export const ChatMessageTypeFragment = gql`
6
+ fragment ChatMessageTypeFragment on ChatMessageType {
7
+ id
8
+ owner
9
+ createdAt
10
+ updatedAt
11
+ system
12
+ convoId
13
+ attachments
14
+ message
15
+ }
16
+ `;
17
+
18
+ export const ChatMessageFragment = gql`
19
+ fragment ChatMessageFragment on ChatMessage {
20
+ id
21
+ owner {
22
+ ...ChatUserTypeFragment
23
+ }
24
+ createdAt
25
+ updatedAt
26
+ system
27
+ convoId
28
+ attachments {
29
+ ...ChatAttachmentTypeFragment
30
+ }
31
+ message
32
+ }
33
+ ${ChatUserTypeFragment}
34
+ ${ChatAttachmentTypeFragment}
35
+ `;
@@ -0,0 +1,23 @@
1
+ import gql from 'graphql-tag';
2
+
3
+ export const ChatUserTypeFragment = gql`
4
+ fragment ChatUserTypeFragment on ChatUserType {
5
+ id
6
+ username
7
+ fullname
8
+ firstname
9
+ lastname
10
+ email
11
+ phone
12
+ website
13
+ country
14
+ bio
15
+ address
16
+ tokenVersion
17
+ avatar
18
+ balance
19
+ currency
20
+ }
21
+ `;
22
+
23
+ export default ChatUserTypeFragment;
@@ -0,0 +1,5 @@
1
+ export * from './chatAttachment.fragment';
2
+ export * from './chatConvo.fragment';
3
+ export * from './chatMessage.fragment';
4
+ export * from './chatUser.fragment';
5
+ export * from './resType';
@@ -0,0 +1,15 @@
1
+ import gql from 'graphql-tag';
2
+
3
+ export interface ChatResType {
4
+ success: boolean;
5
+ message?: string;
6
+ data?: any;
7
+ }
8
+
9
+ export const ChatResTypeFragment = gql`
10
+ fragment ChatResTypeFragment on ChatResType {
11
+ success
12
+ message
13
+ data
14
+ }
15
+ `;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ONLY MEANT FOR CLIENTS, but can also work on server-side.
3
+ */
4
+ export * from './fragments';
5
+ export * from './mutations';
6
+ export * from './query';
7
+ export * from './subscriptions';
@@ -0,0 +1,5 @@
1
+ export * from './models';
2
+ export * from './resolvers';
3
+ export * from './methods';
4
+
5
+ export * from './index-client';
@@ -0,0 +1,336 @@
1
+ import ChatConvoModel, {
2
+ ChatConvo,
3
+ ChatConvoModelName,
4
+ ChatConvoType,
5
+ chatConvoSelectors,
6
+ } from '../models/ChatConvo.model';
7
+ import {ChatMessage, ChatMessageModel} from '../models';
8
+ import {connectionOptions, createUpdate} from '@roadmanjs/couchset';
9
+ import {publishMessageToTopic, sendPushNotification} from '../../shared/pubsub.utils';
10
+
11
+ import {ContextType} from '../../shared/ContextType';
12
+ import {awaitTo} from '@stoqey/client-graphql';
13
+ import compact from 'lodash/compact';
14
+ import isEmpty from 'lodash/isEmpty';
15
+ import {log} from '@roadmanjs/logs';
16
+
17
+ export const createAConvoAndReturnIt = async (newConvo: ChatConvoType): Promise<ChatConvoType> => {
18
+ const {members = [], group = false, owner, ...others} = newConvo;
19
+
20
+ const [errorCreatingConvo, createdChatConvo = []] = await awaitTo(
21
+ createChatConvoType({
22
+ ...others,
23
+ members,
24
+ group,
25
+ owner,
26
+ })
27
+ );
28
+
29
+ if (errorCreatingConvo) {
30
+ throw errorCreatingConvo;
31
+ }
32
+
33
+ let convo = createdChatConvo[0];
34
+ if (owner) {
35
+ const selected = createdChatConvo.find((chat) => chat.owner === owner);
36
+ if (selected) {
37
+ convo = selected;
38
+ }
39
+ }
40
+
41
+ return convo;
42
+ };
43
+
44
+ export const createChatConvoType = async (
45
+ props: Partial<ChatConvoType>
46
+ ): Promise<ChatConvoType[]> => {
47
+ const {members = [], group = false, ...others} = props;
48
+
49
+ if (isEmpty(members)) {
50
+ throw new Error('members have to be more than one');
51
+ }
52
+
53
+ const defaultConvo: ChatConvoType = {
54
+ ...others,
55
+ members,
56
+ group,
57
+ owner: 'system',
58
+ };
59
+
60
+ const isPublicChat = defaultConvo.public;
61
+
62
+ if (isPublicChat) {
63
+ const existingPublicChat = await ChatConvoModel.pagination({
64
+ where: {convoId: defaultConvo.convoId},
65
+ });
66
+
67
+ if (existingPublicChat && existingPublicChat.length) {
68
+ return existingPublicChat;
69
+ }
70
+ }
71
+
72
+ const [errorSystemConvo, createdSystemConvo] = await awaitTo(
73
+ createUpdate<ChatConvoType>({
74
+ model: ChatConvoModel,
75
+ data: defaultConvo,
76
+ ...defaultConvo,
77
+ })
78
+ );
79
+
80
+ if (errorSystemConvo) {
81
+ throw errorSystemConvo;
82
+ }
83
+
84
+ if (isPublicChat) {
85
+ return [createdSystemConvo];
86
+ }
87
+
88
+ // create a convo for each member
89
+ const [errorConvos, convos] = await awaitTo(
90
+ Promise.all(
91
+ members.map((member) =>
92
+ createUpdate<ChatConvoType>({
93
+ model: ChatConvoModel,
94
+ data: {
95
+ ...defaultConvo,
96
+ owner: member,
97
+ convoId: createdSystemConvo?.id,
98
+ },
99
+ ...defaultConvo,
100
+ owner: member,
101
+ })
102
+ )
103
+ )
104
+ );
105
+
106
+ if (errorConvos) {
107
+ throw errorConvos;
108
+ }
109
+
110
+ return convos as ChatConvoType[];
111
+ };
112
+
113
+ export const getChatConvoById = async (id: string, owner: string): Promise<ChatConvo | null> => {
114
+ try {
115
+ const bucket = connectionOptions.bucketName;
116
+
117
+ const query = `
118
+ SELECT *
119
+ FROM \`${bucket}\` convo
120
+ JOIN \`${bucket}\` owner
121
+ ON KEYS convo.owner
122
+ NEST \`${bucket}\` members
123
+ ON KEYS convo.members
124
+ LEFT JOIN \`${bucket}\` lastMessage
125
+ ON KEYS convo.lastMessage
126
+
127
+ WHERE convo._type = "${ChatConvoModelName}"
128
+ AND (convo.id = "${id}" OR convo.convoId = "${id}")
129
+ AND convo.owner = "${owner}"
130
+ LIMIT 1;
131
+ `;
132
+
133
+ const [errorFetching, data = []] = await awaitTo(
134
+ ChatConvoModel.customQuery<any>({
135
+ limit: 1,
136
+ query,
137
+ params: {limit: 1, id},
138
+ })
139
+ );
140
+
141
+ if (errorFetching) {
142
+ throw errorFetching;
143
+ }
144
+
145
+ const [rows = []] = data;
146
+
147
+ const dataToSend = rows.map((d) => {
148
+ const {convo, lastMessage = {}, members, owner} = d;
149
+ const lastMessageParsed = ChatMessageModel.parse(lastMessage);
150
+ const chatConvoItem = ChatConvoModel.parse({
151
+ ...convo,
152
+ members,
153
+ owner,
154
+ });
155
+ chatConvoItem.lastMessage = lastMessageParsed;
156
+ return chatConvoItem;
157
+ });
158
+
159
+ return dataToSend[0];
160
+ } catch (error) {
161
+ log('error getting chat messages', error);
162
+ return null;
163
+ }
164
+ };
165
+
166
+ interface UpdateConvoLastMessage {
167
+ sender: string;
168
+ convoId: string;
169
+ lastMessageId: string;
170
+ }
171
+
172
+ export const updateConvoLastMessage = async (args: UpdateConvoLastMessage): Promise<boolean> => {
173
+ const {sender, convoId, lastMessageId} = args;
174
+ try {
175
+ // find all convo by convoId
176
+ // add update them all with the new lastMessageId
177
+
178
+ const convos: ChatConvoType[] = await ChatConvoModel.pagination({
179
+ select: chatConvoSelectors,
180
+ where: {convoId: {$eq: convoId}},
181
+ });
182
+
183
+ if (!isEmpty(convos)) {
184
+ // update convo objects
185
+ const [errorConvos, updatedConvos] = await awaitTo(
186
+ Promise.all(
187
+ convos.map((convo) => {
188
+ const update = {
189
+ ...convo,
190
+ lastMessage: lastMessageId,
191
+ };
192
+
193
+ if (convo.owner !== sender) {
194
+ // if this is not creator, update unread
195
+ update.unread = (convo.unread || 0) + 1;
196
+ }
197
+
198
+ return createUpdate<ChatConvoType>({
199
+ model: ChatConvoModel,
200
+ data: update,
201
+ ...convo,
202
+ });
203
+ })
204
+ )
205
+ );
206
+ if (errorConvos) {
207
+ throw errorConvos;
208
+ }
209
+
210
+ log(
211
+ `updated convos with lastMessage=${lastMessageId}`,
212
+ updatedConvos.map((uc) => uc.id)
213
+ );
214
+ }
215
+
216
+ return true;
217
+ } catch (error) {
218
+ return false;
219
+ }
220
+ };
221
+
222
+ interface UpdateConvoSubscriptions {
223
+ context: ContextType;
224
+ sender: string;
225
+ convoId: string;
226
+ data: any;
227
+ }
228
+
229
+ /**
230
+ * Send data to convo expect the sender
231
+ * @param args
232
+ * @returns
233
+ */
234
+ export const updateConvoSubscriptions = async (
235
+ args: UpdateConvoSubscriptions
236
+ ): Promise<boolean> => {
237
+ const {context, sender, convoId, data} = args;
238
+
239
+ const getSubscriptionData = () => {
240
+ if (data.id) {
241
+ // contains message payload
242
+ return {message: data.id};
243
+ }
244
+ return data;
245
+ };
246
+
247
+ const subscriptionData = getSubscriptionData();
248
+
249
+ const publishToMessageTopic = async () => {
250
+ return publishMessageToTopic(context, [ChatMessage.name], {
251
+ convoId,
252
+ owner: sender,
253
+ ...subscriptionData,
254
+ });
255
+ };
256
+
257
+ try {
258
+ // send to message topic
259
+ await publishToMessageTopic();
260
+
261
+ // send to convo topics
262
+ const membersConvos: ChatConvoType[] = await ChatConvoModel.pagination({
263
+ select: chatConvoSelectors,
264
+ where: {convoId: {$eq: convoId}, owner: {$neq: sender}},
265
+ });
266
+
267
+ if (!isEmpty(membersConvos)) {
268
+ const isPublicChat = compact(membersConvos.map((c) => c.public));
269
+
270
+ if (!isEmpty(isPublicChat)) {
271
+ log(`updated subscriptions isPublicChat`);
272
+ return;
273
+ }
274
+
275
+ // push notification here
276
+
277
+ // update sockets, no need for results
278
+ await awaitTo(
279
+ Promise.all(
280
+ membersConvos.map((convo) => {
281
+ const pushmessage = {
282
+ ...data,
283
+ convoId,
284
+ owner: convo.owner,
285
+ };
286
+
287
+ // unhandled promises
288
+ if (!subscriptionData.typing) {
289
+ sendPushNotification(sender, pushmessage);
290
+ }
291
+
292
+ // Send subscriptions to owners
293
+ return publishMessageToTopic(context, [ChatConvo.name], {
294
+ convoId,
295
+ owner: convo.owner,
296
+ ...subscriptionData,
297
+ }); // update sockets
298
+ })
299
+ )
300
+ );
301
+
302
+ log(
303
+ `updated subscriptions from=${sender} with data=${data}`,
304
+ membersConvos.map((uc) => uc.id)
305
+ );
306
+
307
+ // update sockets
308
+ }
309
+
310
+ return true;
311
+ } catch (error) {
312
+ return false;
313
+ }
314
+ };
315
+
316
+ export const removeUnreadCount = async (owner: string, convoId: string): Promise<any> => {
317
+ try {
318
+ const convos: ChatConvoType[] = await ChatConvoModel.pagination({
319
+ select: chatConvoSelectors,
320
+ where: {convoId: {$eq: convoId}, owner: {$eq: owner}},
321
+ });
322
+
323
+ if (!isEmpty(convos)) {
324
+ const convo = convos[0];
325
+ if (convo.unread > 0) {
326
+ convo.unread = 0; // remove the unread
327
+ await ChatConvoModel.updateById(convo.id, convo, {silent: true}); // do not updatedAt
328
+ }
329
+ }
330
+
331
+ return true;
332
+ } catch (err) {
333
+ log(err);
334
+ return false;
335
+ }
336
+ };
@@ -0,0 +1,122 @@
1
+ import 'reflect-metadata';
2
+ import 'mocha';
3
+
4
+ import {expect} from 'chai';
5
+ import { getChatConvoById } from './ChatConvo.methods';
6
+ import {startCouchbase} from '@roadmanjs/couchset';
7
+
8
+ before((done) => {
9
+ startCouchbase().then(() => done());
10
+ });
11
+
12
+ describe('ChatConvo', () => {
13
+ // it('it should send a push notification to a user', async () => {
14
+ // const senderId = '1c01d85f-b811-44b1-8a4f-bef8030bf265';
15
+ // const convoId = 'b613b7c5-5f73-4331-8703-3a1176728a31';
16
+
17
+ // const owner = '99bc43ba-02ab-4394-b48b-49a39a95443c';
18
+
19
+ // const sendMessage = await sendPushNotification(senderId, {
20
+ // owner,
21
+ // convoId,
22
+ // message: 'some message',
23
+ // });
24
+ // expect(sendMessage).to.not.be.empty;
25
+ // });
26
+ // it('it should create an new convo and return it', async () => {
27
+ // const newConvo: ChatConvoType = {
28
+ // owner: '1c01d85f-b811-44b1-8a4f-bef8030bf265',
29
+ // members: [
30
+ // '1c01d85f-b811-44b1-8a4f-bef8030bf265',
31
+ // '0ac710ce-4530-4ea9-8f70-9d19383c95d4',
32
+ // ],
33
+ // group: true,
34
+ // };
35
+
36
+ // const newConvoCreated = await startConvo(newConvo);
37
+
38
+ // console.log('new convo create', newConvoCreated);
39
+ // console.log('new convo create members', newConvoCreated.data.members);
40
+
41
+ // expect(newConvoCreated).to.be.not.empty;
42
+ // });
43
+
44
+ it("it should return chat convo with joins", async () => {
45
+ const convo = await getChatConvoById("d2bb6ba6-1bc5-480a-a3ae-c28bec3708bf", "1c01d85f-b811-44b1-8a4f-bef8030bf265");
46
+
47
+ console.log('convo with joins', convo);
48
+ expect(convo.members[0].id).to.be.not.empty;
49
+ })
50
+
51
+ // it("Create convo", async () => {
52
+ // const owner = "1c01d85f-b811-44b1-8a4f-bef8030bf265";
53
+ // const otherUser = "99bc43ba-02ab-4394-b48b-49a39a95443c";
54
+ // const members = [owner, otherUser];
55
+
56
+ // const chatConvo = {
57
+ // members,
58
+ // group: false,
59
+
60
+ // };
61
+
62
+ // const createdConvo = await createChatConvoType(chatConvo);
63
+
64
+ // console.log("Created", createdConvo);
65
+ // expect(createdConvo).to.not.be.empty;
66
+ // });
67
+
68
+ // it("Remove read count", async () => {
69
+ // const owner = "1c01d85f-b811-44b1-8a4f-bef8030bf265";
70
+ // const convoId = "b613b7c5-5f73-4331-8703-3a1176728a31";
71
+
72
+ // const hasUpdateCount = await removeUnreadCount(owner, convoId);
73
+
74
+ // console.log("Created", hasUpdateCount);
75
+ // expect(hasUpdateCount).to.be.true;
76
+ // });
77
+
78
+ // it('Start public ChatConvo', async () => {
79
+ // const id = 'rtv-1';
80
+
81
+ // const publicConvo = await startPublicConvo(id);
82
+
83
+ // console.log('Created', publicConvo);
84
+
85
+ // expect(publicConvo.public).to.be.true;
86
+ // });
87
+
88
+ // it('GetConvoOwnerNAuth public convo', async () => {
89
+ // const convoId = 'e8e15949-311e-4954-8701-3fe46cc21b98';
90
+ // const mockContext = {
91
+ // req: {
92
+ // headers: {
93
+ // authorization: '',
94
+ // },
95
+ // },
96
+ // };
97
+
98
+ // const publicMessages = await getConvoOwnerNAuth(convoId, mockContext);
99
+
100
+ // console.log('publicMessages', publicMessages);
101
+
102
+ // expect(publicMessages).not.to.be.empty;
103
+ // });
104
+
105
+ // it('GetConvoOwnerNAuth private convo', async () => {
106
+ // const convoId = 'e9992706-e854-4aef-bb5f-5e09d4224bf4';
107
+ // const mockContext = {
108
+ // req: {
109
+ // headers: {
110
+ // authorization:
111
+ // 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI5OWJjNDNiYS0wMmFiLTQzOTQtYjQ4Yi00OWEzOWE5NTQ0M2MiLCJpYXQiOjE2NjMyMTc2MjMsImV4cCI6MTY2MzQ3NjgyM30.zvCJo95goSCemwhvSEXF5nd3jIDhMZTfVrn9jUeo1OA',
112
+ // },
113
+ // },
114
+ // };
115
+
116
+ // const publicMessages = await getConvoOwnerNAuth(convoId, mockContext);
117
+
118
+ // console.log('publicMessages', publicMessages);
119
+
120
+ // expect(publicMessages).not.to.be.empty;
121
+ // });
122
+ });