@roadmanjs/chat 0.0.45 → 0.0.47
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/chat/methods/ChatMessageResolver.methods.d.ts +22 -0
- package/dist/chat/methods/ChatMessageResolver.methods.js +170 -0
- package/dist/chat/methods/ChatMessageResolver.methods.js.map +1 -0
- package/dist/chat/resolvers/ChatMessage.resolver.d.ts +1 -1
- package/dist/chat/resolvers/ChatMessage.resolver.js +6 -124
- package/dist/chat/resolvers/ChatMessage.resolver.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ChatMessage, ChatMessageType } from '../models/ChatMessage.model';
|
|
2
|
+
import { ChatResType, ContextType } from '../../shared/ContextType';
|
|
3
|
+
export declare const chatTyping: (ctx: ContextType, convoId: string, time: Date) => Promise<boolean>;
|
|
4
|
+
export declare const getConvoOwnerNAuth: (convoId: string, ctx: any) => Promise<{
|
|
5
|
+
owner: string;
|
|
6
|
+
isPublic: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
interface ChatMessageArgs {
|
|
9
|
+
ctx: ContextType;
|
|
10
|
+
convoId: string;
|
|
11
|
+
sort?: string;
|
|
12
|
+
before: Date;
|
|
13
|
+
after: Date;
|
|
14
|
+
limit?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare const chatMessage: (args: ChatMessageArgs) => Promise<{
|
|
17
|
+
items: ChatMessage[];
|
|
18
|
+
hasNext: boolean;
|
|
19
|
+
params: any;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const createChatMessage: (ctx: ContextType, args: ChatMessageType) => Promise<ChatResType>;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.createChatMessage = exports.chatMessage = exports.getConvoOwnerNAuth = exports.chatTyping = void 0;
|
|
30
|
+
const ChatMessage_model_1 = __importStar(require("../models/ChatMessage.model"));
|
|
31
|
+
const couchset_1 = require("@roadmanjs/couchset");
|
|
32
|
+
const _1 = require(".");
|
|
33
|
+
const ChatConvo_model_1 = __importDefault(require("../models/ChatConvo.model"));
|
|
34
|
+
const get_1 = __importDefault(require("lodash/get"));
|
|
35
|
+
const client_graphql_1 = require("@stoqey/client-graphql");
|
|
36
|
+
const identity_1 = __importDefault(require("lodash/identity"));
|
|
37
|
+
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
38
|
+
const logs_1 = require("@roadmanjs/logs");
|
|
39
|
+
const pickBy_1 = __importDefault(require("lodash/pickBy"));
|
|
40
|
+
const __1 = require("..");
|
|
41
|
+
const auth_1 = require("@roadmanjs/auth");
|
|
42
|
+
const chatTyping = async (ctx, convoId, time // just to make the client HOT
|
|
43
|
+
) => {
|
|
44
|
+
const owner = (0, get_1.default)(ctx, 'payload.userId', ''); // loggedIn user
|
|
45
|
+
await (0, _1.updateConvoSubscriptions)({
|
|
46
|
+
sender: owner,
|
|
47
|
+
convoId,
|
|
48
|
+
data: { typing: owner, time },
|
|
49
|
+
context: ctx,
|
|
50
|
+
}); // send a typing subscription
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
exports.chatTyping = chatTyping;
|
|
54
|
+
const getConvoOwnerNAuth = async (convoId, ctx) => {
|
|
55
|
+
let isPublic = false;
|
|
56
|
+
const authorization = (0, get_1.default)(ctx, 'req.headers.authorization', '');
|
|
57
|
+
const token = authorization.split(' ')[1];
|
|
58
|
+
const [err, convo] = await ChatConvo_model_1.default.pagination({
|
|
59
|
+
where: {
|
|
60
|
+
convoId,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
if (err) {
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
if (convo.length) {
|
|
67
|
+
const selectedConvo = convo[0];
|
|
68
|
+
isPublic = selectedConvo.isPublic;
|
|
69
|
+
if (isPublic) {
|
|
70
|
+
return { owner: selectedConvo.owner, isPublic };
|
|
71
|
+
}
|
|
72
|
+
if ((0, isEmpty_1.default)(token)) {
|
|
73
|
+
throw new Error('not authorized');
|
|
74
|
+
}
|
|
75
|
+
// throw error if token is not valid
|
|
76
|
+
const payload = (0, auth_1.verifyAuthToken)(token);
|
|
77
|
+
return { owner: payload.userId, isPublic };
|
|
78
|
+
}
|
|
79
|
+
throw new Error('conversation not found');
|
|
80
|
+
};
|
|
81
|
+
exports.getConvoOwnerNAuth = getConvoOwnerNAuth;
|
|
82
|
+
const chatMessage = async (args) => {
|
|
83
|
+
const { ctx, convoId, before, after, limit: limitArg } = args;
|
|
84
|
+
// TODO add sort, by default it's just new to old
|
|
85
|
+
const bucket = couchset_1.connectionOptions.bucketName;
|
|
86
|
+
const sign = before ? '<=' : '>=';
|
|
87
|
+
const time = new Date(before || after);
|
|
88
|
+
const limit = limitArg || 10;
|
|
89
|
+
const limitPassed = limit + 1;
|
|
90
|
+
const copyParams = (0, pickBy_1.default)({
|
|
91
|
+
convoId,
|
|
92
|
+
before,
|
|
93
|
+
after,
|
|
94
|
+
limit,
|
|
95
|
+
}, identity_1.default);
|
|
96
|
+
try {
|
|
97
|
+
const { owner, isPublic } = await (0, exports.getConvoOwnerNAuth)(convoId, ctx);
|
|
98
|
+
const query = `
|
|
99
|
+
SELECT *
|
|
100
|
+
FROM \`${bucket}\` chat
|
|
101
|
+
LET owner = (SELECT o.* FROM \`${bucket}\` AS o USE KEYS chat.owner),
|
|
102
|
+
attachments = (SELECT m.* FROM \`${bucket}\` AS m USE KEYS chat.attachments)
|
|
103
|
+
WHERE chat._type = "${ChatMessage_model_1.ChatMessageModelName}"
|
|
104
|
+
AND chat.convoId = "${convoId}"
|
|
105
|
+
AND chat.createdAt ${sign} "${time.toISOString()}"
|
|
106
|
+
ORDER BY chat.createdAt DESC
|
|
107
|
+
LIMIT ${limitPassed};
|
|
108
|
+
`;
|
|
109
|
+
const [errorFetching, data = []] = await (0, client_graphql_1.awaitTo)(ChatMessage_model_1.default.customQuery({
|
|
110
|
+
limit: limitPassed,
|
|
111
|
+
query,
|
|
112
|
+
params: copyParams,
|
|
113
|
+
}));
|
|
114
|
+
if (errorFetching) {
|
|
115
|
+
throw errorFetching;
|
|
116
|
+
}
|
|
117
|
+
const [rows = []] = data;
|
|
118
|
+
const hasNext = rows.length > limit;
|
|
119
|
+
if (hasNext) {
|
|
120
|
+
rows.pop(); // remove last element
|
|
121
|
+
}
|
|
122
|
+
const dataToSend = rows.map((d) => {
|
|
123
|
+
const { chat, attachments, owner } = d;
|
|
124
|
+
return ChatMessage_model_1.default.parse(Object.assign(Object.assign({}, chat), { attachments, owner: owner[0] || null }));
|
|
125
|
+
});
|
|
126
|
+
// TODO just add as a queue non-blocking queries
|
|
127
|
+
if (!isPublic) {
|
|
128
|
+
await (0, _1.removeUnreadCount)(owner, convoId);
|
|
129
|
+
}
|
|
130
|
+
return { items: dataToSend, params: copyParams, hasNext };
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
(0, logs_1.log)('error getting chat messages', error);
|
|
134
|
+
return { items: [], hasNext: false, params: copyParams };
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
exports.chatMessage = chatMessage;
|
|
138
|
+
const createChatMessage = async (ctx, args) => {
|
|
139
|
+
const owner = (0, get_1.default)(ctx, 'payload.userId', '');
|
|
140
|
+
try {
|
|
141
|
+
// If updating
|
|
142
|
+
const createdOrUpdate = await (0, couchset_1.createUpdate)(Object.assign({ model: ChatMessage_model_1.default, data: Object.assign({}, args) }, args));
|
|
143
|
+
// Error when creating message
|
|
144
|
+
// update conversation with new lastMessage
|
|
145
|
+
// update message
|
|
146
|
+
if (createdOrUpdate) {
|
|
147
|
+
const message = createdOrUpdate.id;
|
|
148
|
+
const convoId = createdOrUpdate.convoId;
|
|
149
|
+
await (0, __1.updateConvoLastMessage)({
|
|
150
|
+
sender: owner,
|
|
151
|
+
convoId,
|
|
152
|
+
lastMessageId: message,
|
|
153
|
+
}); // update all convos
|
|
154
|
+
await (0, _1.updateConvoSubscriptions)({
|
|
155
|
+
sender: owner,
|
|
156
|
+
convoId,
|
|
157
|
+
data: { message },
|
|
158
|
+
context: ctx,
|
|
159
|
+
});
|
|
160
|
+
return { success: true, data: createdOrUpdate };
|
|
161
|
+
}
|
|
162
|
+
throw new Error('error creating chat message method ');
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.error(err && err.message, err);
|
|
166
|
+
return { success: false, message: err && err.message };
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
exports.createChatMessage = createChatMessage;
|
|
170
|
+
//# sourceMappingURL=ChatMessageResolver.methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessageResolver.methods.js","sourceRoot":"","sources":["../../../src/chat/methods/ChatMessageResolver.methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { ChatMessage, ChatMessageType, OnChatMessage } from '../models/ChatMessa
|
|
|
3
3
|
export declare class ChatMessageResolver {
|
|
4
4
|
onChatMessage(data: OnChatMessage, owner: string, convoId: string, time: Date): OnChatMessage;
|
|
5
5
|
chatTyping(ctx: ContextType, convoId: string, time: Date): Promise<boolean>;
|
|
6
|
-
chatMessage(ctx: ContextType, convoId: string, before: Date, after: Date,
|
|
6
|
+
chatMessage(ctx: ContextType, convoId: string, before: Date, after: Date, limit: any): Promise<{
|
|
7
7
|
items: ChatMessage[];
|
|
8
8
|
hasNext: boolean;
|
|
9
9
|
params: any;
|
|
@@ -1,53 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
7
|
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
-
if (mod && mod.__esModule) return mod;
|
|
26
|
-
var result = {};
|
|
27
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
-
__setModuleDefault(result, mod);
|
|
29
|
-
return result;
|
|
30
|
-
};
|
|
31
8
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
32
9
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
33
10
|
};
|
|
34
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
-
};
|
|
37
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
12
|
exports.ChatMessageResolver = void 0;
|
|
39
13
|
const couchset_1 = require("couchset");
|
|
40
|
-
const client_graphql_1 = require("@stoqey/client-graphql");
|
|
41
14
|
const ContextType_1 = require("../../shared/ContextType");
|
|
42
|
-
const identity_1 = __importDefault(require("lodash/identity"));
|
|
43
|
-
const pickBy_1 = __importDefault(require("lodash/pickBy"));
|
|
44
|
-
const logs_1 = require("@roadmanjs/logs");
|
|
45
|
-
const get_1 = __importDefault(require("lodash/get"));
|
|
46
15
|
const auth_1 = require("@roadmanjs/auth");
|
|
47
|
-
const ChatMessage_model_1 =
|
|
48
|
-
const
|
|
49
|
-
const __1 = require("..");
|
|
50
|
-
const methods_1 = require("../methods");
|
|
16
|
+
const ChatMessage_model_1 = require("../models/ChatMessage.model");
|
|
17
|
+
const ChatMessageResolver_methods_1 = require("../methods/ChatMessageResolver.methods");
|
|
51
18
|
const ChatPagination = (0, ContextType_1.getPagination)(ChatMessage_model_1.ChatMessage);
|
|
52
19
|
let ChatMessageResolver = class ChatMessageResolver {
|
|
53
20
|
// TODO subscriptions and auth middleware
|
|
@@ -57,99 +24,15 @@ let ChatMessageResolver = class ChatMessageResolver {
|
|
|
57
24
|
}
|
|
58
25
|
async chatTyping(ctx, convoId, time // just to make the client HOT
|
|
59
26
|
) {
|
|
60
|
-
|
|
61
|
-
await (0, methods_1.updateConvoSubscriptions)({
|
|
62
|
-
sender: owner,
|
|
63
|
-
convoId,
|
|
64
|
-
data: { typing: owner, time },
|
|
65
|
-
context: ctx,
|
|
66
|
-
}); // send a typing subscription
|
|
67
|
-
return true;
|
|
27
|
+
return (0, ChatMessageResolver_methods_1.chatTyping)(ctx, convoId, time);
|
|
68
28
|
}
|
|
69
29
|
async chatMessage(ctx, convoId,
|
|
70
30
|
// @Arg('sort', () => String, {nullable: true}) sortArg?: string,
|
|
71
|
-
before, after,
|
|
72
|
-
|
|
73
|
-
// TODO add sort, by default it's just new to old
|
|
74
|
-
const bucket = couchset_2.connectionOptions.bucketName;
|
|
75
|
-
const sign = before ? '<=' : '>=';
|
|
76
|
-
const time = new Date(before || after);
|
|
77
|
-
const limit = limitArg || 10;
|
|
78
|
-
const limitPassed = limit + 1;
|
|
79
|
-
const copyParams = (0, pickBy_1.default)({
|
|
80
|
-
convoId,
|
|
81
|
-
before,
|
|
82
|
-
after,
|
|
83
|
-
limit,
|
|
84
|
-
}, identity_1.default);
|
|
85
|
-
try {
|
|
86
|
-
const query = `
|
|
87
|
-
SELECT *
|
|
88
|
-
FROM \`${bucket}\` chat
|
|
89
|
-
LET owner = (SELECT o.* FROM \`${bucket}\` AS o USE KEYS chat.owner),
|
|
90
|
-
attachments = (SELECT m.* FROM \`${bucket}\` AS m USE KEYS chat.attachments)
|
|
91
|
-
WHERE chat._type = "${ChatMessage_model_1.ChatMessageModelName}"
|
|
92
|
-
AND chat.convoId = "${convoId}"
|
|
93
|
-
AND chat.createdAt ${sign} "${time.toISOString()}"
|
|
94
|
-
ORDER BY chat.createdAt DESC
|
|
95
|
-
LIMIT ${limitPassed};
|
|
96
|
-
`;
|
|
97
|
-
const [errorFetching, data = []] = await (0, client_graphql_1.awaitTo)(ChatMessage_model_1.default.customQuery({
|
|
98
|
-
limit: limitPassed,
|
|
99
|
-
query,
|
|
100
|
-
params: copyParams,
|
|
101
|
-
}));
|
|
102
|
-
if (errorFetching) {
|
|
103
|
-
throw errorFetching;
|
|
104
|
-
}
|
|
105
|
-
const [rows = []] = data;
|
|
106
|
-
const hasNext = rows.length > limit;
|
|
107
|
-
if (hasNext) {
|
|
108
|
-
rows.pop(); // remove last element
|
|
109
|
-
}
|
|
110
|
-
const dataToSend = rows.map((d) => {
|
|
111
|
-
const { chat, attachments, owner } = d;
|
|
112
|
-
return ChatMessage_model_1.default.parse(Object.assign(Object.assign({}, chat), { attachments, owner: owner[0] || null }));
|
|
113
|
-
});
|
|
114
|
-
// TODO just add as a queue non-blocking queries
|
|
115
|
-
await (0, methods_1.removeUnreadCount)(owner, convoId);
|
|
116
|
-
return { items: dataToSend, params: copyParams, hasNext };
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
(0, logs_1.log)('error getting chat messages', error);
|
|
120
|
-
return { items: [], hasNext: false, params: copyParams };
|
|
121
|
-
}
|
|
31
|
+
before, after, limit) {
|
|
32
|
+
return (0, ChatMessageResolver_methods_1.chatMessage)({ ctx, convoId, before, after, limit });
|
|
122
33
|
}
|
|
123
34
|
async createChatMessage(ctx, args) {
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
// If updating
|
|
127
|
-
const createdOrUpdate = await (0, couchset_2.createUpdate)(Object.assign({ model: ChatMessage_model_1.default, data: Object.assign({}, args) }, args));
|
|
128
|
-
// Error when creating message
|
|
129
|
-
// update conversation with new lastMessage
|
|
130
|
-
// update message
|
|
131
|
-
if (createdOrUpdate) {
|
|
132
|
-
const message = createdOrUpdate.id;
|
|
133
|
-
const convoId = createdOrUpdate.convoId;
|
|
134
|
-
await (0, __1.updateConvoLastMessage)({
|
|
135
|
-
sender: owner,
|
|
136
|
-
convoId,
|
|
137
|
-
lastMessageId: message,
|
|
138
|
-
}); // update all convos
|
|
139
|
-
await (0, methods_1.updateConvoSubscriptions)({
|
|
140
|
-
sender: owner,
|
|
141
|
-
convoId,
|
|
142
|
-
data: { message },
|
|
143
|
-
context: ctx,
|
|
144
|
-
});
|
|
145
|
-
return { success: true, data: createdOrUpdate };
|
|
146
|
-
}
|
|
147
|
-
throw new Error('error creating chat message method ');
|
|
148
|
-
}
|
|
149
|
-
catch (err) {
|
|
150
|
-
console.error(err && err.message, err);
|
|
151
|
-
return { success: false, message: err && err.message };
|
|
152
|
-
}
|
|
35
|
+
return (0, ChatMessageResolver_methods_1.createChatMessage)(ctx, args);
|
|
153
36
|
}
|
|
154
37
|
};
|
|
155
38
|
__decorate([
|
|
@@ -171,7 +54,6 @@ __decorate([
|
|
|
171
54
|
], ChatMessageResolver.prototype, "chatTyping", null);
|
|
172
55
|
__decorate([
|
|
173
56
|
(0, couchset_1.Query)(() => ChatPagination),
|
|
174
|
-
(0, couchset_1.UseMiddleware)(auth_1.isAuth),
|
|
175
57
|
__param(0, (0, couchset_1.Ctx)()),
|
|
176
58
|
__param(1, (0, couchset_1.Arg)('convoId', () => String, { nullable: false })),
|
|
177
59
|
__param(2, (0, couchset_1.Arg)('before', () => Date, { nullable: true })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.resolver.js","sourceRoot":"","sources":["../../../src/chat/resolvers/ChatMessage.resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatMessage.resolver.js","sourceRoot":"","sources":["../../../src/chat/resolvers/ChatMessage.resolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roadmanjs/chat",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
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",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"typescript": ">=2.0"
|
|
76
76
|
},
|
|
77
77
|
"dependencies": {
|
|
78
|
-
"@roadmanjs/auth": "^0.0.
|
|
78
|
+
"@roadmanjs/auth": "^0.0.25",
|
|
79
79
|
"@roadmanjs/couchset": "^0.0.8",
|
|
80
80
|
"@roadmanjs/firebase-admin": "^0.0.12",
|
|
81
81
|
"@roadmanjs/logs": "^0.0.1",
|