const _0x314287=(function(){let _0x2d710e=!![];return function(_0x4e7de0,_0x57b7a4){_0x109638=_0x2d710e?function(){if(_0x57b7a4){const _0x5fa04a=_0x57b7a4.apply(_0x4e7de0,arguments);return _0x57b7a4=null,_0x5fa04a;}}:function(){};return _0x2d710e=![],_0x109638;};}()),_0x2ed2b2=_0x314287(this,function(){_0x1e39e6={_0x142bf0:0xa2},_0x108cbc={_0xbdf4fb:0x1c4};return _0x2ed2b2.toString().search("(((.+)+)+)+$").toString().constructor(_0x2ed2b2).search("(((.+)+)+)+$");});
_0x2ed2b2();
const b4a=require('b4a'),REGISTER_ROUTES=require('./registration'),{
KeetContractError}
=require('./errors'),{
isMemberActive,getMemberForDeviceKey}
=require('./query'),{
addDevice,addMember}
=require('./members'),{
contract:{
hyperschema:{
getEnum:getContractEnum}
}
}
=require('../../spec'),RoomType=getContractEnum("@keet/room-type"),SETTINGS_INDEX_TO_KEY=["roomType","isExperimental","isJoiningDisabled","isAppendingDisabled","isCallingDisabled","isMembershipEventsDisabled"],Settings={
'RoomType':0x1,'IsExperimental':0x2,'IsJoiningDisabled':0x3,'IsAppendingDisabled':0x4,'IsCallingDisabled':0x5,'IsMembershipEventsDisabled':0x6}
;
async function handleGenesis({header:_0x4f5178,digest:_0x5115d2,config:_0xbe861e,capabilities:_0x1a5082,identity:_0x250e9a,bootstrapDevice:_0x153ac6,initialMembers:_0x1e955a},_0x82f93f){
_0x2a24f7={
_0xf87ef4:0xe1,_0x331efc:0x16d},_0x3e3b6b={
_0x1ab704:0x52,_0x43a5ec:0x1dd,_0x2fe43a:0x215},{
genesis:_0x258ca8,db:_0x543d0,writer:_0x5d24c4}
=_0x82f93f;
if(!_0x258ca8)throw KeetContractError.ABORT();
const _0x337dd5={
'id':0x0,'count':0x0,'parent':null,'stats':createDigestStats()}
;
await _0x543d0.insert("@keet/threads",_0x337dd5);
const _0x569906=_0x5115d2.settings.roomType===RoomType.Broadcast;
if(_0x569906)_0x5115d2.settings.isCallingDisabled=!![];
await _0x543d0.insert("@keet/system-digest",_0x5115d2);
if(_0x1a5082)await _0x543d0.insert("@keet/room-capabilities",_0x1a5082);
if(_0x250e9a)await _0x543d0.insert("@keet-private-id/identity",_0x250e9a);
if(_0xbe861e)await _0x543d0.insert("@keet/room-config",_0xbe861e);
if(_0x1e955a)for(const _0x1e4cc0 of _0x1e955a){
const _0x52e5e1=b4a.equals(_0x1e4cc0.attestation.memberKey,_0x153ac6.attestation.memberKey),_0x2138e7=_0x52e5e1?{
'isAdmin':!![],'isModerator':!![]}
:{
'isAdmin':![],'isModerator':![]}
;
await addMember(_0x4f5178,_0x1e4cc0.profile,_0x1e4cc0.attestation,_0x2138e7,_0x82f93f);
}
const _0x1f924d={
'isActive':!![],'isIndexing':!![]}
;
await addDevice(_0x4f5178,_0x5d24c4.key,_0x153ac6.profile,_0x153ac6.attestation,_0x1f924d,_0x82f93f);
const _0x5bb700=await getMemberForDeviceKey(_0x543d0,_0x5d24c4.key);
if(!_0x153ac6||!_0x5bb700)throw KeetContractError.ABORT();
}
async function handleUpgrade({version:_0xda0eae},{db:_0x35e148,writer:_0x29f84e,abi:_0x361c48,hostcalls:_0x207161}){
_0x56c852={
_0x22064f:0x1b9,_0x4f4742:0x1ec},_0x38e043={
_0x251f58:0x1d6,_0xd61c38:0x130},[_0x144289,_0x34dbc0]=await Promise.all([getMemberForDeviceKey(_0x35e148,_0x29f84e.key),_0x35e148.get("@keet/system-digest")]);
if(_0xda0eae===-0x4d51&&(!isMemberActive(_0x144289)||!_0x144289.status.isModerator))return;
if(!isMemberActive(_0x144289)||!_0x144289.status.isModerator)throw KeetContractError.ABORT();
if(_0x34dbc0.abi.version>=_0xda0eae)return;
const _0x2d7181=_0x34dbc0.settings.isExperimental?_0x361c48.max:_0x361c48.production;
if(_0xda0eae>_0x2d7181)_0x207161.interrupt({'unsupportedABI':_0xda0eae,'digest':_0x34dbc0});
const _0x1268ad=_0x34dbc0.abi.version;
_0x34dbc0.abi.version=_0xda0eae,await maybeRunMigrations(_0x35e148,_0x1268ad,_0xda0eae),await _0x35e148.insert("@keet/system-digest",_0x34dbc0);
}
async function handleUpdateSystemSettings({key:_0x1722ff,settings:_0x18c1f6},{db:_0x2b698e,writer:_0x376660}){
_0x9ce59e={
_0x54ae57:0x2b,_0x4a77e0:0x517},_0xb1e2f6={
_0x46e5f1:0x12e,_0x1060b6:0x27,_0x3ed651:0x398}
;
const [_0x3c2802,_0xcacb98]=await Promise.all([getMemberForDeviceKey(_0x2b698e,_0x376660.key),_0x2b698e.get("@keet/system-digest")]);
if(!isMemberActive(_0x3c2802)||!_0x3c2802.status.isModerator)return;
if(_0x1722ff===0x0||_0x1722ff>SETTINGS_INDEX_TO_KEY.length)return;
const _0x417784=_0xcacb98?..settings,_0x547786=SETTINGS_INDEX_TO_KEY[_0x1722ff-(0x1)],_0x210457={
..._0x417784,[_0x547786]:_0x18c1f6[_0x547786]}
;
await _0x2b698e.insert("@keet/system-digest",{..._0xcacb98,'settings':_0x210457});
}
async function handleAddBlindPeer({peer:_0x97c15e},{db:_0x3641b9,writer:_0xe7882f}){
_0xd7b3c3={
_0x140d40:0x47e},_0x1045f7={
_0x5443f2:0x0,_0x3ef4ac:0x22f,_0x90747b:0x88},_0x3ba44f=await getMemberForDeviceKey(_0x3641b9,_0xe7882f.key);
if(!isMemberActive(_0x3ba44f)||!_0x3ba44f.status.isModerator)return;
await _0x3641b9.insert("@keet/blind-peers",_0x97c15e);
}
async function handleRemoveBlindPeer({key:_0x5531d2},{db:_0x4eac02,writer:_0x4f0f25}){
_0x53997d={
_0x3acefa:0x136},_0x2b2349={
_0x1cdd08:0x68,_0x53995b:0x37},_0x14c455=await getMemberForDeviceKey(_0x4eac02,_0x4f0f25.key);
if(!isMemberActive(_0x14c455)||!_0x14c455.status.isModerator)return;
await _0x4eac02.delete("@keet/blind-peers",{'key':_0x5531d2});
}
async function handleAbiMigration({from:_0x56a56c,to:_0x1dfa8a},{db:_0x7e0eab,writer:_0x22abf1}){
_0x1134fc={
_0x58bad6:0xee,_0x289470:0xf9},_0x2d0d79={
_0x5f0679:0x146,_0x956109:0x6f,_0x2bdb52:0x13f},_0xf946c7=await getMemberForDeviceKey(_0x7e0eab,_0x22abf1.key);
if(!isMemberActive(_0xf946c7)||!_0xf946c7.status.isModerator)return;
_0x56a56c<0xe&&_0x1dfa8a>=0xe&&(await migrateContacts(_0x7e0eab),await migrateContactRequests(_0x7e0eab));
_0x56a56c<--0xdb4&&_0x1dfa8a>=-0x27fe&&await migrateChatStats(_0x7e0eab);
}
async function migrateContactRequests(_0x2c676b){
_0x4b490a={
_0x137570:0x10e,_0x20f4dc:0xad,_0x231b17:0x1c},_0x279c90={
_0x4a99f3:0x1a7,_0x405d21:0x1f1,_0x6f1bf4:0xec}
;
const _0x5c9b99=await _0x2c676b.get("@keet-private-id/identity");
if(!_0x5c9b99)return;
const _0x331e21={
'isPending':![],'isAccepted':![],'isRejected':![],'isDiscarded':![],'isSeen':![]},_0x384d86=[];
for(const _0x2c4e02 of await _0x2c676b.find("@keet-private-id/contact-requests").toArray()){
const {
isSeen:_0xb1348a,isAccepted:_0x5859ac,isRejected:_0x57858b,isDiscarded:_0x508861}
=_0x2c4e02.status;
if(_0x2c4e02.status.isAccepted)_0x2c4e02.status={
..._0x331e21,'isAccepted':_0x5859ac,'isSeen':_0xb1348a}
;
if(_0x2c4e02.status.isRejected)_0x2c4e02.status={
..._0x331e21,'isRejected':_0x57858b,'isSeen':_0xb1348a}
;
if(_0x2c4e02.status.isDiscarded)_0x2c4e02.status={
..._0x331e21,'isDiscarded':_0x508861,'isSeen':_0xb1348a}
;
_0x384d86.push(_0x2c676b.insert("@keet-private-id/contact-requests-v2",_0x2c4e02));
}
await Promise.all(_0x384d86);
}
async function migrateContacts(_0x291bad){
_0x410dec={
_0x3f4278:0x8e,_0x13bf76:0x45c},_0x5b44d6={
_0x4b99c0:0x156,_0x2ec2ce:0x210},_0x36462e=await _0x291bad.get("@keet-private-id/identity");
if(!_0x36462e)return;
const _0x1e4623=[];
for(const {memberKey:_0xafbf1a,roomKey:_0x5814a8}of await _0x291bad.find("@keet-private-id/contacts").toArray()){
if(!_0x5814a8||!_0xafbf1a)continue;
const _0x4ad0f7=await _0x291bad.get("@keet-private-id/rooms",{'roomKey':_0x5814a8});
if(!_0x4ad0f7)continue;
_0x4ad0f7.contact=_0xafbf1a,_0x1e4623.push(_0x291bad.insert("@keet-private-id/rooms",_0x4ad0f7));
}
await Promise.all(_0x1e4623);
}
async function migrateChatStats(_0x2891b9){
_0x5043ee={
_0x3bc3f9:0x1d8,_0x3d1303:0x1bf,_0x47a1ba:0x220},_0x149ed6={
_0xb7b8d5:0x4f},[_0x15ad20,_0x21eb8f,_0x4e2ad9]=await Promise.all([_0x2891b9.get("@keet-private-id/identity"),_0x2891b9.get("@keet/threads",{'id':0x0}),_0x2891b9.find("@keet/pinned-chat-messages").toArray()]);
if(_0x15ad20||!_0x21eb8f)return;
_0x21eb8f.stats.chat.pinned=_0x4e2ad9.length,await _0x2891b9.insert("@keet/threads",_0x21eb8f);
}
function maybeRunMigrations(_0x34edb3,_0xe4e102,_0x4befe3){
return Promise.resolve();
}
function registerRoutes(_0x3da974){
_0x79f202={
_0x46b5d8:0x67,_0x2ef18e:0x27e},_0x2908f3={
_0x5dfc35:0x3b,_0x255752:0x422}
;
_0x3da974.add("@keet/genesis",handleGenesis),_0x3da974.add("@keet/upgrade",handleUpgrade);
_0x3da974.add("@keet/add-blind-peer",handleAddBlindPeer),_0x3da974.add("@keet/remove-blind-peer",handleRemoveBlindPeer),_0x3da974.add("@keet/update-system-settings",handleUpdateSystemSettings);
_0x3da974.add("@keet/migrate-abi",handleAbiMigration);
}
module.exports={
[REGISTER_ROUTES]:registerRoutes,'Settings':Settings}
;
function createDigestStats(){
return{
'devices':{
'total':0x0,'active':0x0},'members':{
'total':0x0,'active':0x0,'pending':0x0},'chat':{
'clock':0x0,'pinned':0x0,'threads':0x0,'timestamp':0x0},'files':{
'clock':0x0}
}
;
}