Browse Source

replay chat history

feature/dockerfile-arm
Evan Feenstra 5 years ago
parent
commit
d0f5d16971
  1. 27
      api/controllers/chatTribes.ts
  2. 4
      api/network/index.ts
  3. 2
      api/network/receive.ts
  4. 2
      api/network/send.ts
  5. 23
      dist/api/controllers/chatTribes.js
  6. 2
      dist/api/controllers/chatTribes.js.map
  7. 1
      dist/api/network/index.js
  8. 2
      dist/api/network/index.js.map
  9. 2
      dist/api/network/receive.js
  10. 2
      dist/api/network/receive.js.map
  11. 1
      dist/api/network/send.js
  12. 2
      dist/api/network/send.js.map

27
api/controllers/chatTribes.ts

@ -5,6 +5,7 @@ import * as network from '../network'
import * as rsa from '../crypto/rsa' import * as rsa from '../crypto/rsa'
import * as tribes from '../utils/tribes' import * as tribes from '../utils/tribes'
import * as path from 'path' import * as path from 'path'
import {personalizeMessage, decryptMessage} from '../utils/msg'
const constants = require(path.join(__dirname,'../../config/constants.json')) const constants = require(path.join(__dirname,'../../config/constants.json'))
@ -147,8 +148,24 @@ async function editTribe(req, res) {
async function replayChatHistory(chat, contact) { async function replayChatHistory(chat, contact) {
const msgs = await models.Message.findAll({ order: [['id', 'asc']], limit:40 }) const msgs = await models.Message.findAll({ order: [['id', 'asc']], limit:40 })
msgs.forEach(m=> console.log('m',m.dataValues)) const owner = await models.Contact.findOne({ where: { isOwner: true } })
asyncForEach(msgs, async m=>{
const sender = {
...owner.dataValues,
...m.senderAlias && {alias: m.senderAlias},
}
let msg = network.newmsg(m.type, chat, sender, {
content: m.remoteContent, // replace with the received content (u are owner)
mediaKey: m.mediaKey,
mediaType: m.mediaType,
mediaToken: m.mediaToken
})
msg = await decryptMessage(msg, chat)
const data = await personalizeMessage(msg, contact, true)
const mqttTopic = `${contact.publicKey}/${chat.uuid}`
await network.signAndSend({data}, owner.publicKey, mqttTopic)
})
} }
@ -184,4 +201,10 @@ export {
joinTribe, editTribe, joinTribe, editTribe,
replayChatHistory, replayChatHistory,
createTribeChatParams createTribeChatParams
}
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
} }

4
api/network/index.ts

@ -1,4 +1,4 @@
import {sendMessage,signAndSend} from './send' import {sendMessage,signAndSend,newmsg} from './send'
import {initGrpcSubscriptions,initTribesSubscriptions,parseKeysendInvoice} from './receive' import {initGrpcSubscriptions,initTribesSubscriptions,parseKeysendInvoice} from './receive'
/* /*
@ -6,7 +6,7 @@ Abstracts between lightning network and MQTT depending on Chat type and sender
*/ */
export { export {
sendMessage,signAndSend, sendMessage,signAndSend,newmsg,
initGrpcSubscriptions, initGrpcSubscriptions,
initTribesSubscriptions, initTribesSubscriptions,
parseKeysendInvoice, parseKeysendInvoice,

2
api/network/receive.ts

@ -58,7 +58,7 @@ async function doTheAction(data){
let payload = data let payload = data
if(payload.isTribeOwner) { if(payload.isTribeOwner) {
const ogContent = data.message && data.message.content const ogContent = data.message && data.message.content
// decrypt and re-encrypt with self pubkey // decrypt and re-encrypt with phone's pubkey for storage
const chat = await models.Chat.findOne({where:{uuid:payload.chat.uuid}}) const chat = await models.Chat.findOne({where:{uuid:payload.chat.uuid}})
const pld = await decryptMessage(data, chat) const pld = await decryptMessage(data, chat)
const me = await models.Contact.findOne({where:{isOwner:true}}) const me = await models.Contact.findOne({where:{isOwner:true}})

2
api/network/send.ts

@ -114,7 +114,7 @@ export function signAndSend(opts, pubkey, mqttTopic?:string){
}) })
} }
function newmsg(type, chat, sender, message){ export function newmsg(type, chat, sender, message){
const includeGroupKey = type===constants.message_types.group_create || type===constants.message_types.group_invite const includeGroupKey = type===constants.message_types.group_create || type===constants.message_types.group_invite
const includeAlias = sender && sender.alias && chat.type===constants.chat_types.tribe const includeAlias = sender && sender.alias && chat.type===constants.chat_types.tribe
return { return {

23
dist/api/controllers/chatTribes.js

@ -16,6 +16,7 @@ const network = require("../network");
const rsa = require("../crypto/rsa"); const rsa = require("../crypto/rsa");
const tribes = require("../utils/tribes"); const tribes = require("../utils/tribes");
const path = require("path"); const path = require("path");
const msg_1 = require("../utils/msg");
const constants = require(path.join(__dirname, '../../config/constants.json')); const constants = require(path.join(__dirname, '../../config/constants.json'));
function joinTribe(req, res) { function joinTribe(req, res) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
@ -144,7 +145,20 @@ exports.editTribe = editTribe;
function replayChatHistory(chat, contact) { function replayChatHistory(chat, contact) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const msgs = yield models_1.models.Message.findAll({ order: [['id', 'asc']], limit: 40 }); const msgs = yield models_1.models.Message.findAll({ order: [['id', 'asc']], limit: 40 });
msgs.forEach(m => console.log('m', m.dataValues)); const owner = yield models_1.models.Contact.findOne({ where: { isOwner: true } });
asyncForEach(msgs, (m) => __awaiter(this, void 0, void 0, function* () {
const sender = Object.assign(Object.assign({}, owner.dataValues), m.senderAlias && { alias: m.senderAlias });
let msg = network.newmsg(m.type, chat, sender, {
content: m.remoteContent,
mediaKey: m.mediaKey,
mediaType: m.mediaType,
mediaToken: m.mediaToken
});
msg = yield msg_1.decryptMessage(msg, chat);
const data = yield msg_1.personalizeMessage(msg, contact, true);
const mqttTopic = `${contact.publicKey}/${chat.uuid}`;
yield network.signAndSend({ data }, owner.publicKey, mqttTopic);
}));
}); });
} }
exports.replayChatHistory = replayChatHistory; exports.replayChatHistory = replayChatHistory;
@ -177,4 +191,11 @@ function createTribeChatParams(owner, contactIds, name, img, price_per_message,
}); });
} }
exports.createTribeChatParams = createTribeChatParams; exports.createTribeChatParams = createTribeChatParams;
function asyncForEach(array, callback) {
return __awaiter(this, void 0, void 0, function* () {
for (let index = 0; index < array.length; index++) {
yield callback(array[index], index, array);
}
});
}
//# sourceMappingURL=chatTribes.js.map //# sourceMappingURL=chatTribes.js.map

2
dist/api/controllers/chatTribes.js.map

File diff suppressed because one or more lines are too long

1
dist/api/network/index.js

@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const send_1 = require("./send"); const send_1 = require("./send");
exports.sendMessage = send_1.sendMessage; exports.sendMessage = send_1.sendMessage;
exports.signAndSend = send_1.signAndSend; exports.signAndSend = send_1.signAndSend;
exports.newmsg = send_1.newmsg;
const receive_1 = require("./receive"); const receive_1 = require("./receive");
exports.initGrpcSubscriptions = receive_1.initGrpcSubscriptions; exports.initGrpcSubscriptions = receive_1.initGrpcSubscriptions;
exports.initTribesSubscriptions = receive_1.initTribesSubscriptions; exports.initTribesSubscriptions = receive_1.initTribesSubscriptions;

2
dist/api/network/index.js.map

@ -1 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../api/network/index.ts"],"names":[],"mappings":";;AAAA,iCAA8C;AAQ1C,sBARI,kBAAW,CAQJ;AAAC,sBARI,kBAAW,CAQJ;AAP3B,uCAA2F;AAQvF,gCARI,+BAAqB,CAQJ;AACrB,kCAT0B,iCAAuB,CAS1B;AACvB,8BAVkD,6BAAmB,CAUlD"} {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../api/network/index.ts"],"names":[],"mappings":";;AAAA,iCAAqD;AAQjD,sBARI,kBAAW,CAQJ;AAAC,sBARI,kBAAW,CAQJ;AAAC,iBARI,aAAM,CAQJ;AAPlC,uCAA2F;AAQvF,gCARI,+BAAqB,CAQJ;AACrB,kCAT0B,iCAAuB,CAS1B;AACvB,8BAVkD,6BAAmB,CAUlD"}

2
dist/api/network/receive.js

@ -75,7 +75,7 @@ function doTheAction(data) {
let payload = data; let payload = data;
if (payload.isTribeOwner) { if (payload.isTribeOwner) {
const ogContent = data.message && data.message.content; const ogContent = data.message && data.message.content;
// decrypt and re-encrypt with self pubkey // decrypt and re-encrypt with phone's pubkey for storage
const chat = yield models_1.models.Chat.findOne({ where: { uuid: payload.chat.uuid } }); const chat = yield models_1.models.Chat.findOne({ where: { uuid: payload.chat.uuid } });
const pld = yield msg_1.decryptMessage(data, chat); const pld = yield msg_1.decryptMessage(data, chat);
const me = yield models_1.models.Contact.findOne({ where: { isOwner: true } }); const me = yield models_1.models.Contact.findOne({ where: { isOwner: true } });

2
dist/api/network/receive.js.map

File diff suppressed because one or more lines are too long

1
dist/api/network/send.js

@ -134,6 +134,7 @@ function newmsg(type, chat, sender, message) {
sender: Object.assign(Object.assign({}, includeAlias && { alias: sender.alias }), { pub_key: sender.publicKey }) sender: Object.assign(Object.assign({}, includeAlias && { alias: sender.alias }), { pub_key: sender.publicKey })
}; };
} }
exports.newmsg = newmsg;
function asyncForEach(array, callback) { function asyncForEach(array, callback) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
for (let index = 0; index < array.length; index++) { for (let index = 0; index < array.length; index++) {

2
dist/api/network/send.js.map

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save