@wowok/wowok 3.1.4 → 3.1.7

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 (102) hide show
  1. package/README.md +13 -9
  2. package/dist/esm/{arb-Bt71te9D.mjs → arb-BISAJD8v.mjs} +1 -1
  3. package/dist/esm/{call-CQWetJH4.mjs → call-n-f848pr.mjs} +1 -1
  4. package/dist/esm/client/index.d.mts +1 -1
  5. package/dist/esm/client/index.mjs +1 -1
  6. package/dist/esm/{client-dGG40Xsh.mjs → client-LNQzEd6a.mjs} +1 -1
  7. package/dist/esm/{common-Xdn-Z6c9.mjs → common-byv0_xtC.mjs} +1 -1
  8. package/dist/esm/cryptography/index.d.mts +1 -1
  9. package/dist/esm/exception-DvUO8Ds-.mjs +1 -0
  10. package/dist/esm/{fund-approval-BeJzE3D_.mjs → fund-approval-CQzGOlHx.mjs} +1 -1
  11. package/dist/esm/graphql/index.d.mts +1 -1
  12. package/dist/esm/graphql/index.mjs +1 -1
  13. package/dist/esm/{graphql-xofKFBJU.mjs → graphql-DYdoViOj.mjs} +1 -1
  14. package/dist/esm/grpc/index.d.mts +1 -1
  15. package/dist/esm/grpc/index.mjs +1 -1
  16. package/dist/esm/{grpc-C8cx_zww.mjs → grpc-B7Ea7mSn.mjs} +1 -1
  17. package/dist/esm/{index-B_hZ2EHL.d.mts → index-DE428i0f.d.mts} +166 -9
  18. package/dist/esm/index.d.mts +2 -2
  19. package/dist/esm/index.mjs +1 -1
  20. package/dist/esm/jsonRpc/index.d.mts +1 -1
  21. package/dist/esm/jsonRpc/index.mjs +1 -1
  22. package/dist/esm/keypairs/ed25519/index.d.mts +1 -1
  23. package/dist/esm/keypairs/falcon512/index.d.mts +1 -1
  24. package/dist/esm/keypairs/passkey/index.d.mts +1 -1
  25. package/dist/esm/keypairs/secp256k1/index.d.mts +1 -1
  26. package/dist/esm/keypairs/secp256r1/index.d.mts +1 -1
  27. package/dist/esm/{messenger-BOFGcc-r.mjs → messenger-DnDqwFyd.mjs} +1 -1
  28. package/dist/esm/{messenger-api-DALvHoZz.mjs → messenger-api-5mlzUZ9q.mjs} +1 -1
  29. package/dist/esm/multisig/index.d.mts +1 -1
  30. package/dist/esm/{proof-Cz6xEdPc.mjs → proof-CPQCqZTr.mjs} +1 -1
  31. package/dist/esm/{received-CAzlc4_p.mjs → received-ticKG-QG.mjs} +1 -1
  32. package/dist/esm/service-BfMD4m0P.mjs +1 -0
  33. package/dist/esm/transactions/index.d.mts +1 -1
  34. package/dist/esm/{util-C39oHQ7Y.mjs → util-BEeK2b0Y.mjs} +1 -1
  35. package/dist/esm/util-CTyT-c3I.mjs +1 -0
  36. package/dist/esm/verify/index.d.mts +1 -1
  37. package/dist/esm/w/call/allocation.d.mts +2 -2
  38. package/dist/esm/w/call/allocation.mjs +1 -1
  39. package/dist/esm/w/call/arbitration.d.mts +1 -1
  40. package/dist/esm/w/call/arbitration.mjs +1 -1
  41. package/dist/esm/w/call/base.d.mts +1 -1
  42. package/dist/esm/w/call/base.mjs +1 -1
  43. package/dist/esm/w/call/demand.d.mts +1 -1
  44. package/dist/esm/w/call/demand.mjs +1 -1
  45. package/dist/esm/w/call/guard.d.mts +2 -2
  46. package/dist/esm/w/call/guard.mjs +1 -1
  47. package/dist/esm/w/call/index.d.mts +1 -1
  48. package/dist/esm/w/call/index.mjs +1 -1
  49. package/dist/esm/w/call/machine.d.mts +1 -1
  50. package/dist/esm/w/call/machine.mjs +1 -1
  51. package/dist/esm/w/call/passport.d.mts +2 -2
  52. package/dist/esm/w/call/passport.mjs +1 -1
  53. package/dist/esm/w/call/payment.d.mts +1 -1
  54. package/dist/esm/w/call/payment.mjs +1 -1
  55. package/dist/esm/w/call/permission.d.mts +1 -1
  56. package/dist/esm/w/call/permission.mjs +1 -1
  57. package/dist/esm/w/call/progress.d.mts +1 -1
  58. package/dist/esm/w/call/progress.mjs +1 -1
  59. package/dist/esm/w/call/repository.d.mts +1 -1
  60. package/dist/esm/w/call/repository.mjs +1 -1
  61. package/dist/esm/w/call/reward.d.mts +1 -1
  62. package/dist/esm/w/call/reward.mjs +1 -1
  63. package/dist/esm/w/call/service.d.mts +2 -2
  64. package/dist/esm/w/call/service.mjs +1 -1
  65. package/dist/esm/w/call/treasury.d.mts +1 -1
  66. package/dist/esm/w/call/treasury.mjs +1 -1
  67. package/dist/esm/w/common.d.mts +1 -1
  68. package/dist/esm/w/common.mjs +1 -1
  69. package/dist/esm/w/index.d.mts +2 -2
  70. package/dist/esm/w/index.mjs +1 -1
  71. package/dist/esm/w/local/account.d.mts +1 -1
  72. package/dist/esm/w/local/account.mjs +1 -1
  73. package/dist/esm/w/local/evm-account.mjs +1 -1
  74. package/dist/esm/w/local/fund-approval.mjs +1 -1
  75. package/dist/esm/w/local/index.d.mts +2 -2
  76. package/dist/esm/w/local/index.mjs +1 -1
  77. package/dist/esm/w/local/local.mjs +1 -1
  78. package/dist/esm/w/local/token.d.mts +1 -1
  79. package/dist/esm/w/local/token.mjs +1 -1
  80. package/dist/esm/w/local/wip.d.mts +1 -1
  81. package/dist/esm/w/local/wip.mjs +1 -1
  82. package/dist/esm/w/messenger/attachment.d.mts +1 -1
  83. package/dist/esm/w/messenger/index.d.mts +1 -1
  84. package/dist/esm/w/messenger/index.mjs +1 -1
  85. package/dist/esm/w/messenger/messenger-api.d.mts +1 -1
  86. package/dist/esm/w/messenger/messenger-api.mjs +1 -1
  87. package/dist/esm/w/messenger/messenger.d.mts +1 -1
  88. package/dist/esm/w/messenger/messenger.mjs +1 -1
  89. package/dist/esm/w/messenger/reply.d.mts +1 -1
  90. package/dist/esm/w/messenger/storage.d.mts +1 -1
  91. package/dist/esm/w/messenger/types.d.mts +1 -1
  92. package/dist/esm/w/messenger/utils.d.mts +1 -1
  93. package/dist/esm/w/query/index.d.mts +1 -1
  94. package/dist/esm/w/query/index.mjs +1 -1
  95. package/dist/esm/w/query/object.d.mts +1 -1
  96. package/dist/esm/w/query/object.mjs +1 -1
  97. package/dist/esm/{w-Dw07_fxr.mjs → w-CKj791Jq.mjs} +1 -1
  98. package/dist/esm/{wip-Cq6OttmQ.d.mts → wip-DhB4F5t8.d.mts} +4 -0
  99. package/package.json +3 -3
  100. package/dist/esm/exception-CUK4T4UJ.mjs +0 -1
  101. package/dist/esm/service-lkfEGHxx.mjs +0 -1
  102. package/dist/esm/util-C7Z-7kSn.mjs +0 -1
@@ -1 +1 @@
1
- import{o as a34a}from'./wow-types-DctQuD2J.mjs';import{r as a34b}from'./logger-Da7dKX2V.mjs';import{MessageStorage,SessionStateStorage,getDatabase}from'./w/messenger/storage.mjs';import{PQSessionCipher}from'./w/messenger/pq/session.mjs';import{PQSessionStoreAdapter}from'./w/messenger/pq/store-adapter.mjs';import{DEFAULT_MESSENGER_CONFIG,MessengerError,NORMAL_MESSAGE_BYTES_LIMIT,WTS_FILE_BYTES_LIMIT}from'./w/messenger/types.mjs';import{base64ToBytes,bytesToBase64,hashPlaintext,verifyMessage}from'./w/messenger/crypto.mjs';import{REPLY_HEADER,buildReplyPlaintext,parseReplyPlaintext}from'./w/messenger/reply.mjs';import{buildAttachmentEnvelope}from'./w/messenger/attachment.mjs';import{canonicalizeJson}from'./w/messenger/utils.mjs';import{randomBytes}from'@noble/hashes/utils.js';import*as a34c from'path';import*as a34d from'fs';import{createHash}from'crypto';const logger$1=a34b('messenger:server');var MessengerServerClient=class{constructor(a){this['config']={...DEFAULT_MESSENGER_CONFIG,...a};}async['fetchWithTimeout'](a,b={},c){const d=c??this['config']['requestTimeoutMs']??0x7530,e=new AbortController(),f=setTimeout(()=>e['abort'](),d);try{return await fetch(a,{...b,'signal':e['signal']});}finally{clearTimeout(f);}}async['registerDevice'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/register',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](a)});if(!b['ok']){const d=await b['text']();if(b['status']===0x199){if(d['includes']('different\x20key'))throw new MessengerError('IDENTITY_CONFLICT','Identity\x20already\x20exists\x20with\x20different\x20key:\x20'+d);return{'success':!![],'uploadedCount':0x0,'failedPrekeys':[],'currentTotal':0x0,'maxAllowed':0x64};}throw new MessengerError('SERVER_ERROR','Registration\x20failed:\x20'+b['status']+'\x20'+b['statusText']+'\x20-\x20'+d);}const c=await b['json']();if(c['failedPrekeys']&&c['failedPrekeys']['length']>0x0){}return{'success':c['success'],'uploadedCount':c['uploaded_count'],'failedPrekeys':c['failed_prekeys']||[],'currentTotal':c['current_total'],'maxAllowed':c['max_allowed']};}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20register\x20device',e);}}async['uploadPreKeys'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/prekeys/upload',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](a)});if(!b['ok']){const d=await b['text']();throw new MessengerError('SERVER_ERROR','Failed\x20to\x20upload\x20prekeys:\x20'+b['status']+'\x20'+b['statusText']+'\x20-\x20'+d);}const c=await b['json']();if(c['failedPrekeys']&&c['failedPrekeys']['length']>0x0)throw new MessengerError('SERVER_ERROR','Some\x20prekeys\x20failed\x20to\x20upload:\x20'+JSON['stringify'](c['failedPrekeys']));return{'success':c['success'],'uploadedCount':c['uploaded_count'],'failedPrekeys':c['failed_prekeys']||[],'currentTotal':c['current_total'],'maxAllowed':c['max_allowed']};}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20upload\x20prekeys',e);}}async['fetchRemoteBundle'](a,b,c,d,e){try{const f=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/bundle/'+a,{'headers':{'X-PublicKey':c,'X-SignatureScheme':d['signatureScheme'],'X-Signature':d['signature'],'X-Timestamp':d['timestamp']['toString'](),'X-Nonce':d['nonce']}});if(!f['ok']){if(f['status']===0x194)throw new MessengerError('IDENTITY_NOT_FOUND','User\x20'+a+'\x20not\x20found\x20on\x20server');throw new MessengerError('SERVER_ERROR','Failed\x20to\x20fetch\x20remote\x20bundle:\x20'+f['statusText']);}return await f['json']();}catch(g){if(g instanceof MessengerError)throw g;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20fetch\x20remote\x20bundle',g);}}async['sendMessage'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/message',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](a)}),c=await b['json']();if(!b['ok']){const d=new MessengerError('SERVER_ERROR',c?.['error']?.['message']||c?.['message']||b['statusText']),e=c?.['error']?.['guard_list']??c?.['guard_list'];d['guardList']=Array['isArray'](e)?e['map'](f=>{if(typeof f==='string')return f;const h=f,i=h?.['guardAddress']??h?.['guard_address'];return typeof i==='string'?i:'';})['filter'](f=>typeof f==='string'&&f['length']>0x0):void 0x0;throw d;}return c;}catch(f){if(f instanceof MessengerError)throw f;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20send\x20message',f);}}async['queryMessageStatus'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/message/status/'+encodeURIComponent(a['messageId']),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'messageId':a['messageId'],'publicKey':a['publicKey'],'signature':a['signature'],'timestamp':a['timestamp'],'nonce':a['nonce']})}),c=await b['json']();if(!b['ok'])throw new MessengerError('SERVER_ERROR',c?.['error']?.['message']||c?.['message']||b['statusText']);return c;}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20query\x20message\x20status',d);}}async['pullMessages'](a,b,c,d){try{const e=new URL(this['config']['serverUrl']+'/v1/messages/'+a);if(d!==void 0x0)e['searchParams']['set']('limit',d['toString']());const f=await this['fetchWithTimeout'](e['toString'](),{'headers':{'X-PublicKey':b,'X-SignatureScheme':c['signatureScheme'],'X-Signature':c['signature'],'X-Timestamp':c['timestamp']['toString'](),'X-Nonce':c['nonce']}});if(!f['ok']){let g;try{g=(await f['json']())?.['error']?.['message'];}catch{g=void 0x0;}throw new MessengerError('SERVER_ERROR','Failed\x20to\x20pull\x20messages:\x20'+(typeof g==='string'&&g||f['statusText']||'HTTP\x20'+f['status']));}return await f['json']();}catch(h){if(h instanceof MessengerError)throw h;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20pull\x20messages',h);}}async['popPreKey'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/prekeys/'+a+'/one',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'publicKey':b['publicKey'],'signatureScheme':b['signatureScheme'],'signature':b['signature'],'timestamp':b['timestamp'],'nonce':b['nonce']})});if(c['status']===0x1ad)throw new MessengerError('SERVER_ERROR','Rate\x20limited:\x20too\x20many\x20pop\x20prekey\x20requests');if(c['status']===0x191)throw new MessengerError('SERVER_ERROR','Unauthorized:\x20signature\x20verification\x20failed\x20or\x20address\x20mismatch');if(!c['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20pop\x20prekey:\x20'+c['statusText']);return await c['json']();}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20pop\x20prekey',d);}}async['getPrekeyStatus'](a,b,c){try{const d=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/prekeys/'+a+'/status',{'headers':{'X-PublicKey':b,'X-SignatureScheme':c['signatureScheme'],'X-Signature':c['signature'],'X-Timestamp':c['timestamp']['toString'](),'X-Nonce':c['nonce']}});if(!d['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20prekey\x20status:\x20'+d['statusText']);const e=await d['json']();return{'currentCount':e['currentCount'],'maxAllowed':e['maxAllowed'],'threshold':e['threshold'],'shouldRefill':e['shouldRefill']};}catch(f){if(f instanceof MessengerError)throw f;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20prekey\x20status',f);}}async['acknowledgeMessages'](a,b,c){try{const d=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/messages/ack',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'publicKey':c['publicKey'],'messageIds':a,'senderPublicKey':b,'signatureScheme':c['signatureScheme'],'signature':c['signature'],'timestamp':c['timestamp'],'nonce':c['nonce']})});if(!d['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20acknowledge\x20messages:\x20'+d['statusText']);}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20acknowledge\x20messages',e);}}async['addToBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist',b,'POST');}async['removeFromBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist',b,'DELETE');}async['clearBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist/clear',b,'POST');}async['getBlacklist'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok']){const d=await c['text']();logger$1['error']('getBlacklist\x20error\x20response:',d);throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20blacklist:\x20'+c['statusText']+'\x20-\x20'+d);}return await c['json']();}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20blacklist',e);}}async['existInBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist/exist',b,'POST');}async['addToFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list',b,'POST');}async['removeFromFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list',b,'DELETE');}async['clearFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list/clear',b,'POST');}async['getFriendsList'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20friends\x20list:\x20'+c['statusText']);return await c['json']();}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20friends\x20list',d);}}async['existInFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list/exist',b,'POST');}async['addToGuardList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/guard-list',b,'POST');}async['removeFromGuardList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/guard-list',b,'DELETE');}async['getGuardList'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/guard-list/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20guard\x20list:\x20'+c['statusText']);return await c['json']();}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20guard\x20list',d);}}async['updateSettings'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/settings',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok']){const d=await c['text']();throw new MessengerError('SERVER_ERROR','Failed\x20to\x20update\x20settings:\x20'+c['statusText']+'\x20-\x20'+d);}return(await c['json']())['success'];}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20update\x20settings',e);}}async['getSettings'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/settings/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok']){const d=await c['text']();throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20settings:\x20'+c['statusText']+'\x20-\x20'+d);}return await c['json']();}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20settings',e);}}async['_listOperation'](a,b,c='POST'){try{const d=await this['fetchWithTimeout'](a,{'method':c,'headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!d['ok']){const e=await d['text']();throw new MessengerError('SERVER_ERROR','List\x20operation\x20failed:\x20'+d['statusText']+'\x20-\x20'+e);}return await d['json']();}catch(f){if(f instanceof MessengerError)throw f;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20perform\x20list\x20operation',f);}}};new MessengerServerClient();async function getAccount$1(){const {Account:a}=await import('./w/local/account.mjs');return a['Instance']();}var MessengerSession=class{constructor(a,b){this['identity']=null,this['config']={...DEFAULT_MESSENGER_CONFIG,...b},this['serverClient']=new MessengerServerClient(this['config']),this['userAddress']=a;const c=getDatabase(a);this['pqStore']=new PQSessionStoreAdapter(c,a),this['pqCipher']=new PQSessionCipher(this['pqStore'],async()=>{return(await(await getAccount$1())['deriveX25519Identity'](a))['falcon512KeyPair'];});}get['store'](){return this['pqStore'];}get['cipher'](){return this['pqCipher'];}async['ensureIdentity'](a){if(this['identity'])return this['identity'];const b=await this['pqStore']['getIdentityKeyPair'](),c=await this['pqStore']['getRegistrationId']();if(b&&c)return this['identity']={'x25519KeyPair':b,'registrationId':c},this['identity'];const d=await(await getAccount$1())['deriveX25519Identity'](this['userAddress']);return await this['pqStore']['setIdentityKeyPair'](d['x25519KeyPair']),await this['pqStore']['setRegistrationId'](d['registrationId']),this['identity']={'x25519KeyPair':d['x25519KeyPair'],'registrationId':d['registrationId']},this['identity'];}['deriveRegistrationId'](a){const b=a[0x0]<<0x8|a[0x1];return b===0x0?0x1:b;}async['registerDevice'](a){const b=await this['ensureIdentity'](a),c=0x1,d=0x1;let e,f;const g=await this['pqStore']['getSignedPreKeySignature'](c),h=await this['pqStore']['getSignedPreKey'](c),i=await this['pqStore']['getPQPreKey'](d),j=await this['pqStore']['getPQPreKeySignature'](d);if(h&&g&&i&&j)e=h['publicKey'],f=g;else{const u=await this['pqCipher']['generatePreKeyBundle'](c,d,this['config']['prekey_count']);e=u['signedPreKey']['keyPair']['publicKey'],f=u['signedPreKey']['signature'];}const k=await this['generatePreKeyBatch'](this['config']['prekey_count'],a),l=await(await getAccount$1())['get'](a,![],!![]);if(!l?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const m=Date['now'](),n=this['generateNonce'](),o='register:'+l['pubkey']+':'+m+':'+n,p=await(await getAccount$1())['signData'](a,o),q=Buffer['from'](p['signature']['slice'](0x2),'hex'),r=await this['pqStore']['getPQPreKey'](d),s=await this['pqStore']['getPQPreKeySignature'](d),t={'userAddress':a,'deviceId':0x1,'registrationId':b['registrationId'],'identityKey':bytesToBase64(b['x25519KeyPair']['publicKey']),'falcon512PublicKey':bytesToBase64(base64ToBytes(l['pubkey'])['slice'](0x1)),'signedPrekey':{'keyId':c,'publicKey':bytesToBase64(e),'signature':bytesToBase64(f)},'prekeys':k,'publicKey':l['pubkey'],'signatureScheme':'Falcon512','signature':bytesToBase64(q),'timestamp':m,'nonce':n};if(r&&s)t['pqPrekey']={'keyId':d,'publicKey':bytesToBase64(r['publicKey']),'signature':bytesToBase64(s)};if(h){let v=null;try{const w=Date['now'](),x=this['generateNonce'](),y='get_bundle:'+a+':'+w+':'+x,z=await(await getAccount$1())['signData'](a,y),A=Buffer['from'](z['signature']['slice'](0x2),'hex'),B=await this['serverClient']['fetchRemoteBundle'](a,a,l['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(A)),'timestamp':w,'nonce':x});if(B?.['signedPrekey']?.['publicKey'])v=B['signedPrekey']['publicKey'];}catch(C){if(!(C instanceof MessengerError&&C['code']==='IDENTITY_NOT_FOUND'))v=bytesToBase64(h['publicKey']);}if(v){const D=new TextEncoder()['encode'](v),E=await(await getAccount$1())['signData'](a,D),F=Buffer['from'](E['signature']['slice'](0x2),'hex');t['oldSignedPrekeySignature']=bytesToBase64(new Uint8Array(F));}}await this['serverClient']['registerDevice'](t),await this['verifyRegistrationComplete'](a);}async['verifyRegistrationComplete'](a,b=0xa,c=0x1f4){for(let d=0x0;d<b;d++)try{const e=await(await getAccount$1())['get'](a,![],!![]);if(!e?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const f=Date['now'](),g=this['generateNonce'](),h='prekey_status:'+a+':'+f+':'+g,j=await(await getAccount$1())['signData'](a,h),k=Buffer['from'](j['signature']['slice'](0x2),'hex');await this['serverClient']['getPrekeyStatus'](a,e['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(k)),'timestamp':f,'nonce':g});return;}catch(l){if(l?.['message']?.['includes']('404')||l?.['status']===0x194){if(d<b-0x1){await new Promise(m=>setTimeout(m,c));continue;}}throw l;}throw new MessengerError('REGISTRATION_FAILED','Registration\x20verification\x20failed\x20after\x20'+b+'\x20attempts');}async['isDeviceRegistered'](a){try{if(!await this['pqStore']['getSignedPreKeySignature'](0x1))return![];const b=await(await getAccount$1())['get'](a,![],!![]);if(!b?.['pubkey'])return![];const c=Date['now'](),d=this['generateNonce'](),e='prekey_status:'+a+':'+c+':'+d,f=await(await getAccount$1())['signData'](a,e),g=Buffer['from'](f['signature']['slice'](0x2),'hex');return await this['serverClient']['getPrekeyStatus'](a,b['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(g)),'timestamp':c,'nonce':d}),!![];}catch(h){if(h?.['message']?.['includes']('404')||h?.['status']===0x194)return![];return![];}}async['generatePreKeyBatch'](a,b){if(a<=0x0)return[];const c=[],{generateX25519KeyPair:d}=await import('./w/messenger/pq/crypto.mjs'),e=randomBytes(0x4),f=(e[0x0]<<0x18|e[0x1]<<0x10|e[0x2]<<0x8|e[0x3])&0x7fffff00;for(let g=0x0;g<a;g++){const h=f+g,j=await this['pqStore']['getOneTimePreKey'](h);if(j){const n=bytesToBase64(j['publicKey']),o=await(await getAccount$1())['signData'](b,j['publicKey']),p=Buffer['from'](o['signature']['slice'](0x2),'hex');c['push']({'keyId':h,'publicKey':n,'signature':bytesToBase64(p)});continue;}const k=d(),l=await(await getAccount$1())['signData'](b,k['publicKey']),m=Buffer['from'](l['signature']['slice'](0x2),'hex');await this['pqStore']['setOneTimePreKey'](h,k),c['push']({'keyId':h,'publicKey':bytesToBase64(k['publicKey']),'signature':bytesToBase64(m)});}return c;}async['getPreKeyStatus'](a){const b=await(await getAccount$1())['get'](a,![],!![]);if(!b?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const c=Date['now'](),d=this['generateNonce'](),e='prekey_status:'+a+':'+c+':'+d,f=await(await getAccount$1())['signData'](a,e),g=Buffer['from'](f['signature']['slice'](0x2),'hex');return this['serverClient']['getPrekeyStatus'](a,b['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(g)),'timestamp':c,'nonce':d});}async['ensurePreKeys'](a,b=![]){const c=await(await getAccount$1())['get'](a,![],!![]);if(!c?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const d=await this['getPreKeyStatus'](a);if(!b&&d['currentCount']>=d['maxAllowed'])return;const e=d['maxAllowed']-d['currentCount'];if(e<=0x0)return;await this['ensureIdentity'](a);const f=await this['generatePreKeyBatch'](e,a);if(f['length']===0x0)return;const g=Date['now'](),h=this['generateNonce'](),i='upload_prekeys:'+c['pubkey']+':'+g+':'+h,j=await(await getAccount$1())['signData'](a,i),k=Buffer['from'](j['signature']['slice'](0x2),'hex');await this['serverClient']['uploadPreKeys']({'userAddress':a,'prekeys':f,'publicKey':c['pubkey'],'signatureScheme':'Falcon512','signature':bytesToBase64(k),'timestamp':g,'nonce':h});}['generateNonce'](){const a=new Uint8Array(0x10);return crypto['getRandomValues'](a),Array['from'](a,c=>c['toString'](0x10)['padStart'](0x2,'0'))['join']('');}async['establishSession'](a,b,c=0x1,d){if(await this['pqCipher']['hasSession'](b,c))return;if(!d){const k=await(await getAccount$1())['get'](a,![],!![]);if(!k?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const l=Date['now'](),m=this['generateNonce'](),n=k['pubkey'],o='get_bundle:'+a+':'+l+':'+m,p=await(await getAccount$1())['signData'](a,o),q=Buffer['from'](p['signature']['slice'](0x2),'hex');d=await this['serverClient']['fetchRemoteBundle'](b,a,n,{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(q)),'timestamp':l,'nonce':m},c);}const e=d['signedPrekey'];if(!e)throw new MessengerError('IDENTITY_NOT_FOUND','No\x20signed\x20prekey\x20available\x20for\x20'+b);const f=base64ToBytes(d['identityKey']),g=d['falcon512PublicKey']?base64ToBytes(d['falcon512PublicKey']):f,h=base64ToBytes(e['publicKey']),i=base64ToBytes(e['signature']),j={'registrationId':d['registrationId'],'deviceId':c,'identityKey':f,'falcon512PublicKey':g,'signedPreKey':{'keyId':e['keyId'],'publicKey':h,'signature':i},'pqPreKey':d['pqPrekey']?{'keyId':d['pqPrekey']['keyId'],'publicKey':base64ToBytes(d['pqPrekey']['publicKey']),'signature':base64ToBytes(d['pqPrekey']['signature'])}:void 0x0};if(d['oneTimePrekey']){const r=base64ToBytes(d['oneTimePrekey']['publicKey']);j['oneTimePreKey']={'keyId':d['oneTimePrekey']['keyId'],'publicKey':r};}if(d['pqPrekey']){const s=base64ToBytes(d['pqPrekey']['publicKey']),t=base64ToBytes(d['pqPrekey']['signature']);j['pqPreKey']={'keyId':d['pqPrekey']['keyId'],'publicKey':s,'signature':t};}await this['pqCipher']['processPreKeyBundle'](b,c,j);}async['encryptMessage'](a,b,c,d=0x1){let e=0x0;const f=0x5;while(e<=f)try{if(!await this['pqCipher']['hasSession'](b,d))await this['establishSession'](a,b,d);const g=new TextEncoder()['encode'](c),h=await this['pqCipher']['encryptMessage'](b,g,d);return{'type':h['type'],'body':h['body']['buffer'],'registrationId':h['registrationId']};}catch(i){if(e>=f)throw i;try{await this['pqStore']['removeSession'](b,d),e++,await new Promise(j=>setTimeout(j,0x64));}catch(j){throw i;}}throw new MessengerError('ENCRYPTION_FAILED','Encryption\x20failed\x20after\x20multiple\x20attempts');}async['decryptMessage'](a,b,c,d,e=0x1){const f=new TextDecoder(),g=new Uint8Array(c);let h=0x0;const i=0x5,j=await this['pqCipher']['hasSession'](b,e);if(d!==0x3&&!j)throw new Error('收到\x20WHISPER_MESSAGE\x20但无现有会话,需要等待\x20PREKEY_MESSAGE');while(h<=i)try{let k;if(d===0x3)try{return k=await this['pqCipher']['decryptMessage'](b,g,e),f['decode'](k);}catch(l){if(j&&h===0x0){if(a['toLowerCase']()<b['toLowerCase']())throw new Error('PREKEY\x20竞争:我的地址较小,保留我的会话');else return await this['pqStore']['removeSession'](b,e),k=await this['pqCipher']['decryptMessage'](b,g,e),f['decode'](k);}else throw l;}else k=await this['pqCipher']['decryptMessage'](b,g,e);return f['decode'](k);}catch(m){if(h>=i)throw m;try{if(j)await this['pqStore']['removeSession'](b,e);if(d===0x3){}h++,await new Promise(n=>setTimeout(n,0x64));}catch(n){throw m;}}throw new MessengerError('DECRYPTION_FAILED','Decryption\x20failed\x20after\x20multiple\x20attempts');}async['getIdentityKey'](){return bytesToBase64((await this['ensureIdentity']())['x25519KeyPair']['publicKey']);}async['getRegistrationId'](){return(await this['ensureIdentity']())['registrationId'];}},SessionStateManager=class{constructor(a){this['store']=a;}async['snapshotSession'](a,b){const c=await this['store']['getSession'](a,b);return{'sessionData':c?JSON['stringify'](c):null,'timestamp':Date['now']()};}async['rollbackSession'](a,b,c){if(c['sessionData']){const d=JSON['parse'](c['sessionData']);await this['store']['setSession'](a,b,d);}else await this['store']['removeSession'](a,b);}async['commitSession'](a,b){}},DecryptionEngine=class{constructor(a,b){this['store']=a,this['cipher']=new PQSessionCipher(a,b),this['sessionManager']=new SessionStateManager(a);}async['decryptMessage'](a,b,c,d,e=0x1){const f=await this['sessionManager']['snapshotSession'](b,e);try{if(d===0x3)return await this['handlePreKeyMessage'](a,b,c,e,f);else return await this['handleWhisperMessage'](a,b,c,e,f);}catch(g){return await this['sessionManager']['rollbackSession'](b,e,f),{'success':![],'sessionUpdated':![],'sessionRolledBack':!![],'messageType':d===0x3?'PREKEY':'WHISPER','error':g instanceof Error?g['message']:String(g)};}}async['handlePreKeyMessage'](a,b,c,d,e){const f=new TextDecoder(),g=new Uint8Array(c),h=await this['cipher']['decryptMessage'](b,g,d),i=f['decode'](h);await this['sessionManager']['commitSession'](b,d);if(a['toLowerCase']()<b['toLowerCase']()){}return{'success':!![],'plaintext':i,'sessionUpdated':!![],'sessionRolledBack':![],'messageType':'PREKEY'};}async['handleWhisperMessage'](a,b,c,d,e){if(!await this['cipher']['hasSession'](b,d))throw new Error('No\x20session\x20for\x20WHISPER_MESSAGE');const f=new TextDecoder(),g=new Uint8Array(c),h=await this['cipher']['decryptMessage'](b,g,d);return{'success':!![],'plaintext':f['decode'](h),'sessionUpdated':!![],'sessionRolledBack':![],'messageType':'WHISPER'};}};const PULL_COALESCE_TTL_MS=0x5dc,logger=a34b('messenger:messenger');async function getAccount(){const {Account:a}=await import('./w/local/account.mjs');return a['Instance']();}var Messenger=class{['withSendLock'](a){const b=this['sendPromise'];let c;return this['sendPromise']=new Promise(d=>{c=d;}),b['then'](a)['finally'](c);}constructor(a,b){this['userAddress']=null,this['onMessageCallback']=null,this['pollingTimer']=null,this['messageConsecutiveEmptyPulls']=0x0,this['prekeyConsecutiveOkCount']=0x0,this['isPollingRunning']=![],this['emergencyMode']=![],this['pollInProgress']=![],this['waitingMessages']=new Map(),this['failedMessages']=new Map(),this['waitingMessageRetries']=new Map(),this['sendPromise']=Promise['resolve'](),this['pullInFlight']=null,this['lastPullCompletedAt']=0x0,this['guardStatusWaiters']=new Set(),this['userAddress']=a,this['config']={...DEFAULT_MESSENGER_CONFIG,...b},this['session']=new MessengerSession(a,this['config']),this['serverClient']=new MessengerServerClient(this['config']),this['messageStorage']=new MessageStorage(a),this['sessionStateStorage']=new SessionStateStorage(a),this['decryptionEngine']=new DecryptionEngine(this['session']['store'],async()=>{return(await(await getAccount())['deriveX25519Identity'](a))['falcon512KeyPair'];}),this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0xb4*0x3e8;}['getUserAddress'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');return this['userAddress'];}async['getPublicKey'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');return(await(await getAccount())['get'](this['userAddress'],![],!![]))?.['pubkey']||'';}['isValidGuardMessage'](a,b){return Boolean(a&&b&&a34a(a)&&a34a(b));}['generateNonce'](){const a=new Uint8Array(0x10);return crypto['getRandomValues'](a),Array['from'](a,c=>c['toString'](0x10)['padStart'](0x2,'0'))['join']('');}['scheduleGuardStatusWait'](a){if(!a||this['guardStatusWaiters']['has'](a))return;this['guardStatusWaiters']['add'](a),this['awaitGuardStatus'](a)['finally'](()=>{this['guardStatusWaiters']['delete'](a);});}async['awaitGuardStatus'](a){const b=0xfa0,c=0x1d4c0,d=0xea60,e=0x2*0x36ee80,f=Date['now']();while(Date['now']()-f<e){const h=Date['now']()-f<c;await new Promise(i=>setTimeout(i,h?b:d));try{const i=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!i)return;const j=Date['now'](),k=this['generateNonce'](),l='query_status:'+a+':'+i['pubkey']+':'+j+':'+k,m=await(await getAccount())['signData'](this['userAddress'],l),n=bytesToBase64(new Uint8Array(Buffer['from'](m['signature']['slice'](0x2),'hex'))),o=await this['serverClient']['queryMessageStatus']({'messageId':a,'publicKey':i['pubkey'],'signature':n,'timestamp':j,'nonce':k}),p=this['messageStorage']['getMessage'](a);if(!p||p['status']!=='pending')return;if(o['status']==='confirmed'||o['status']==='not_found'||o['status']==='notfound'){const q=o['merkleData'];this['messageStorage']['updateMessageStatus'](a,'confirmed',q?{'leafIndex':q['leafIndex'],'newRoot':q['newRoot'],'prevRoot':q['prevRoot'],'serverSignature':q['serverSignature'],'serverTimestamp':q['serverTimestamp'],'serverPublicKey':q['serverPublicKey']}:void 0x0);if(q&&p['toAddress'])this['sessionStateStorage']['updateSessionState'](this['userAddress'],p['toAddress'],{'currentRoot':q['newRoot'],'prevRoot':q['prevRoot'],'lastLeafIndex':q['leafIndex'],'lastSyncAt':Date['now']()});this['triggerFastPoll']();return;}if(o['status']==='rejected'){this['messageStorage']['updateMessageStatus'](a,'rejected');return;}}catch{}}const g=this['messageStorage']['getMessage'](a);if(g&&g['status']==='pending')this['messageStorage']['updateMessageStatus'](a,'failed');}async['initialize'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');await this['session']['ensureIdentity'](this['userAddress']),await this['session']['registerDevice'](this['userAddress']),await this['session']['ensurePreKeys'](this['userAddress']),this['startPollingTimer']();try{for(const a of this['messageStorage']['getPendingMessages'](this['userAddress']))if(a['direction']==='sent'&&a['guardAddress']&&a['messageId']&&!a['messageId']['startsWith']('local-'))this['scheduleGuardStatusWait'](a['messageId']);}catch{}}async['getPreKeyStatus'](){return this['session']['getPreKeyStatus'](this['userAddress']);}async['isPeerRegistered'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses']([a]);if(c['length']>0x0)throw new MessengerError('SERVER_ERROR','Invalid\x20peer\x20address:\x20'+a);const d=b[0x0],e=Date['now'](),f=this['generateNonce'](),g='get_bundle:'+this['userAddress']+':'+e+':'+f,h=await(await getAccount())['signData'](this['userAddress'],g),i=bytesToBase64(new Uint8Array(Buffer['from'](h['signature']['slice'](0x2),'hex'))),j=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!j?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20public\x20key\x20not\x20found');try{return await this['serverClient']['fetchRemoteBundle'](d,this['userAddress'],j['pubkey'],{'signatureScheme':'Falcon512','signature':i,'timestamp':e,'nonce':f}),!![];}catch(k){if(k instanceof MessengerError&&k['code']==='IDENTITY_NOT_FOUND')return![];throw k;}}['startPollingTimer'](){if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['isPollingRunning']=!![],this['scheduleNextPoll']();}['stopPollingTimer'](){this['isPollingRunning']=![],this['pollingTimer']&&(clearTimeout(this['pollingTimer']),this['pollingTimer']=null);}['scheduleNextPoll'](){if(!this['isPollingRunning'])return;if(this['pollInProgress'])return;const a=this['getNextPollInterval']();this['pollingTimer']=setTimeout(()=>{this['runPollChain']();},a);}async['runPollChain'](){this['pollInProgress']=!![];try{await this['poll']();}catch{}finally{this['pollInProgress']=![],this['scheduleNextPoll']();}}['getNextPollInterval'](){if(this['waitingMessages']['size']>0x0)return this['config']['message_poll_waiting_interval_ms']??0x3*0x3e8;return this['currentMessageInterval'];}async['poll'](){if(!this['userAddress'])return;try{const a=await this['pullMessages']();if(a['skipped'])return;a['messages']['length']>0x0?(this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8):(this['messageConsecutiveEmptyPulls']++,this['messageConsecutiveEmptyPulls']>=(this['config']['message_poll_consecutive_empty_limit']??0x3)&&(this['currentMessageInterval']=this['emergencyMode']?this['config']['message_poll_urgent_interval_ms']??0x1e*0x3e8:this['config']['message_poll_default_interval_ms']??0xb4*0x3e8,this['messageConsecutiveEmptyPulls']=0x0));if(a['prekey_status']){if(a['prekey_status']['shouldRefill'])this['prekeyConsecutiveOkCount']=0x0,await this['session']['ensurePreKeys'](this['userAddress'],![]);else{this['prekeyConsecutiveOkCount']++;if(this['prekeyConsecutiveOkCount']>=(this['config']['prekey_poll_consecutive_ok_limit']??0x3))this['prekeyConsecutiveOkCount']=0x0;}}}catch(b){}}['triggerFastPoll'](){this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['messageConsecutiveEmptyPulls']=0x0;if(this['isPollingRunning']){if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['scheduleNextPoll']();}}['triggerEmergencyPull'](){this['emergencyMode']=!![],this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8;if(!this['isPollingRunning']){this['startPollingTimer']();return;}if(this['pollInProgress'])return;if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['pollingTimer']=setTimeout(()=>{this['runPollChain']();},0x0);}['stopEmergencyPull'](){if(!this['emergencyMode'])return;this['emergencyMode']=![],this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0xb4*0x3e8;if(!this['isPollingRunning']||this['pollInProgress'])return;if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['scheduleNextPoll']();}['isInEmergencyMode'](){return this['emergencyMode'];}async['sendMessage'](a,b,c){return this['withSendLock'](async()=>{if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');if(c?.['replyTo']){const z=this['messageStorage']['getMessageById'](c['replyTo']['messageId']);if(!z)throw new MessengerError('INVALID_INPUT','sendMessage.replyTo.messageId\x20'+c['replyTo']['messageId']+'\x20not\x20found\x20in\x20local\x20storage');const A=this['userAddress']['toLowerCase'](),B=a['toLowerCase'](),C=z['fromAddress']['toLowerCase'](),D=z['toAddress']['toLowerCase']();if(!(C===A&&D===B||C===B&&D===A))throw new MessengerError('INVALID_INPUT','sendMessage.replyTo.messageId\x20'+c['replyTo']['messageId']+'\x20does\x20not\x20belong\x20to\x20this\x20conversation');}else{if(b['startsWith']('@REPLY@'))throw new MessengerError('INVALID_INPUT','Message\x20content\x20cannot\x20start\x20with\x20the\x20reserved\x20prefix\x20\x22'+REPLY_HEADER+'\x22.\x20Use\x20the\x20reply\x20feature\x20to\x20send\x20a\x20quoted\x20message,\x20or\x20rephrase\x20your\x20content.');}const d=Date['now'](),e=Date['now'](),f=this['generateNonce'](),g=c?.['replyTo']?buildReplyPlaintext(b,c['replyTo']):b,h=new TextEncoder()['encode'](g)['length'];if(h>0x2800)throw new MessengerError('INVALID_INPUT','Message\x20size\x20('+h+'\x20bytes)\x20exceeds\x20maximum\x20allowed\x20size\x20('+NORMAL_MESSAGE_BYTES_LIMIT+'\x20bytes).\x20Consider\x20using\x20sendZipFile\x20for\x20large\x20content.');try{await this['pullMessages']();}catch(E){logger['warn']('Pre-send\x20pull\x20failed\x20(best-effort,\x20continuing\x20with\x20local\x20leaf\x20index):',E instanceof Error?E['message']:String(E));}const i=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),j=await this['session']['encryptMessage'](this['userAddress'],a,g),k=Buffer['from'](new Uint8Array(j['body']))['toString']('base64'),l=hashPlaintext(g,d,c?.['guardAddress'],c?.['passportAddress'],i),m=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!m)throw new MessengerError('IDENTITY_NOT_FOUND','User\x20account\x20not\x20found');const n=m['pubkey'],o=c?.['guardAddress']||'',p=c?.['passportAddress']||'',q=c?.['network']||'',r=i>=0x0?i['toString']():'',s=c?.['force']?'true':'false',t='send_message:'+this['userAddress']+':'+a+':'+o+':'+p+':'+l+':'+r+':'+n+':'+e+':'+f+':'+s+':'+q,u=await(await getAccount())['signData'](this['userAddress'],t),v=Buffer['from'](u['signature']['slice'](0x2),'hex'),w=bytesToBase64(new Uint8Array(v));let x;try{x=await this['serverClient']['sendMessage']({'sender':u['publicKey'],'recipient':a,'ciphertext':k,'plaintextHash':l,'clientTimestamp':d,'msgType':j['type'],'signatureScheme':'Falcon512','signature':w,'timestamp':e,'nonce':f,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'network':c?.['network'],'force':c?.['force'],'lastReceivedLeafIndex':i>=0x0?i:void 0x0});}catch(F){if(j['type']===0x3)try{await this['session']['store']['removeSession'](a,0x1);}catch{}throw F;}const y={'messageId':x['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':l,'plaintext':g,'replyTo':c?.['replyTo'],'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':i,'direction':'sent','status':x['status']==='confirmed'?'confirmed':'pending','msgType':j['type'],'createdAt':d};x['merkleData']&&(y['leafIndex']=x['merkleData']['leafIndex'],y['prevRoot']=x['merkleData']['prevRoot'],y['newRoot']=x['merkleData']['newRoot'],y['serverSignature']=x['merkleData']['serverSignature'],y['serverTimestamp']=x['merkleData']['serverTimestamp'],y['serverPublicKey']=x['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':x['merkleData']['newRoot'],'prevRoot':x['merkleData']['prevRoot'],'lastLeafIndex':x['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](y);if(x['pendingMerkleData'])for(const [G,H]of Object['entries'](x['pendingMerkleData'])){const I=this['messageStorage']['getMessage'](G);if(I&&I['status']==='pending')this['messageStorage']['updateMessageStatus'](G,'confirmed',{'leafIndex':H['leafIndex'],'newRoot':H['newRoot'],'serverSignature':H['serverSignature'],'serverTimestamp':H['serverTimestamp'],'serverPublicKey':H['serverPublicKey']});}this['triggerFastPoll']();if(y['status']==='pending'&&x['messageId'])this['scheduleGuardStatusWait'](x['messageId']);return{'messageId':x['messageId'],'status':y['status'],'merkleData':x['merkleData'],'guardList':x['guard_list'],'lastReceivedLeafIndex':i>=0x0?i:void 0x0};});}async['pullMessages'](a){if(this['pullInFlight'])return this['pullInFlight'];if(Date['now']()-this['lastPullCompletedAt']<PULL_COALESCE_TTL_MS)return{'messages':[],'skipped':!![]};const b=this['doPullMessages'](a)['finally'](()=>{this['pullInFlight']=null,this['lastPullCompletedAt']=Date['now']();});return this['pullInFlight']=b,b;}async['doPullMessages'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d='fetch_messages:'+this['userAddress']+':'+(a||0x64)+':'+b+':'+c,e=(await(await getAccount())['get'](this['userAddress'],![],!![]))?.['pubkey']||'',f=await(await getAccount())['signData'](this['userAddress'],d),g={'signatureScheme':'Falcon512','signature':bytesToBase64(Buffer['from'](f['signature']['slice'](0x2),'hex')),'timestamp':b,'nonce':c},h=await this['serverClient']['pullMessages'](this['userAddress'],e,g,a);if(h['messages']['length']===0x0)return{'messages':[],'prekey_status':h['prekey_status']};const i=[],j=[],k=[...h['messages']]['sort'](function(l,m){return(l['clientTimestamp']||0x0)-(m['clientTimestamp']||0x0);});await this['processWaitingMessages'](i,j);for(const l of k){if(this['waitingMessages']['has'](l['id'])){j['push'](l['id']);continue;}if(this['failedMessages']['has'](l['id'])){j['push'](l['id']);continue;}if(this['messageStorage']['getMessage'](l['id'])){j['push'](l['id']);continue;}const m=await this['tryDecryptMessage'](l);if(m['success']&&m['message']&&m['decryptedData'])this['messageStorage']['saveMessage'](m['message']),i['push'](m['decryptedData']),j['push'](l['id']),this['waitingMessages']['delete'](l['id']);else m['shouldRetry']?(console['warn']('[Messenger]\x20Message\x20'+l['id']+'\x20decryption\x20failed,\x20added\x20to\x20waiting\x20pool:\x20'+m['error']),this['waitingMessages']['set'](l['id'],l)):(console['error']('[Messenger]\x20Message\x20'+l['id']+'\x20decryption\x20permanently\x20failed:\x20'+m['error']),this['failedMessages']['set'](l['id'],{'message':l,'error':m['error']||'Unknown\x20error'}),await this['saveFailedMessage'](l,m['error']||'Unknown\x20error'),j['push'](l['id']));}if(i['length']>0x0&&this['onMessageCallback'])this['onMessageCallback'](i);if(this['waitingMessages']['size']>0x0&&this['isPollingRunning'])this['reschedulePolling']();if(j['length']>0x0&&this['userAddress'])(async()=>{const n=Date['now'](),o=this['generateNonce'](),p=await(await getAccount())['get'](this['userAddress'],![],!![]);if(p?.['pubkey']){const q='ack_messages:'+this['userAddress']+':'+j['join'](',')+':'+p['pubkey']+':'+n+':'+o,r=await(await getAccount())['signData'](this['userAddress'],q),s=Buffer['from'](r['signature']['slice'](0x2),'hex'),t=bytesToBase64(new Uint8Array(s));await this['serverClient']['acknowledgeMessages'](j,r['publicKey'],{'publicKey':r['publicKey'],'signatureScheme':'Falcon512','signature':t,'timestamp':n,'nonce':o});}})()['catch'](n=>{console['warn']('[Messenger]\x20acknowledgeMessages\x20failed\x20(non-fatal,\x20server\x20will\x20resend):\x20'+(n instanceof Error?n['message']:String(n)));});return{'messages':i,'prekey_status':h['prekey_status']};}['getSessionMessages'](a){if(!this['userAddress'])return[];return this['messageStorage']['getMessagesBySession'](this['userAddress'],a);}['getSessionState'](a){if(!this['userAddress'])return;return this['sessionStateStorage']['getSessionState'](this['userAddress'],a);}async['submitChainProof'](a,b,c){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const d=this['sessionStateStorage']['getSessionState'](this['userAddress'],b);if(!d||!d['currentRoot'])throw new MessengerError('SESSION_NOT_ESTABLISHED','No\x20session\x20state\x20found');const e=this['messageStorage']['getMessagesBySession'](this['userAddress'],b),f=e[e['length']-0x1];if(!f||!f['serverPublicKey']||!f['serverSignature'])throw new MessengerError('INVALID_PROOF','No\x20temporal\x20proof\x20(missing\x20server\x20public\x20key\x20or\x20signature),\x20cannot\x20submit\x20Proof\x20to\x20WoWok\x20blockchain');const g=f['serverPublicKey'],h=f['serverSignature'],i={'sessionId':d['sessionId'],'merkleRoot':d['currentRoot'],'messageCount':d['messageCount'],'timestamp':Date['now']()},{CallProof:j}=await import('./proof-Cz6xEdPc.mjs')['then'](l=>l['r']),k=await new j({'proof':JSON['stringify'](i),'server_pubkey':g,'server_signature':h,'proof_type':0x1,'description':c||'Messenger\x20session\x20proof\x20for\x20'+this['userAddress']+'\x20<->\x20'+b,'item_count':d['messageCount'],'about_address':b})['call'](a);return{'proofAddress':(k?.['objectChanges'])?.['find'](l=>l['objectType']?.['includes']('Proof'))?.['objectId']||'','txHash':k?.['digest']||''};}['destroy'](){this['stopPollingTimer']();}['disconnect'](){this['destroy']();}['setOnMessageCallback'](a){this['onMessageCallback']=a;}async['sendZipFile'](a,b,c){return this['withSendLock'](async()=>{if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const d=await this['loadFileData'](b),e=c?.['fileName']||a34c['basename'](b)||'file.zip',f=c?.['contentType']||this['detectContentType'](e),g=(await buildAttachmentEnvelope({'fileName':e,'bytes':d,'contentType':f,'kind':c?.['kind'],'mimeType':c?.['mimeType'],'caption':c?.['caption'],'durationMs':c?.['durationMs'],'width':c?.['width'],'height':c?.['height']}))['zip'];if(g['length']>0x500000)throw new MessengerError('INVALID_INPUT','ZIP\x20file\x20size\x20('+g['length']+'\x20bytes)\x20exceeds\x20local\x20maximum\x20allowed\x20size\x20('+WTS_FILE_BYTES_LIMIT+'\x20bytes)');const h='0x'+createHash('sha256')['update'](g)['digest']('hex'),i=Buffer['from'](g)['toString']('base64'),j={'fileName':e+'.zip','fileSize':g['length'],'fileHash':h,'contentType':f};try{await this['pullMessages']();}catch(E){logger['warn']('Pre-send\x20pull\x20failed\x20(best-effort,\x20continuing\x20with\x20local\x20leaf\x20index):',E instanceof Error?E['message']:String(E));}const k=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),l=Date['now'](),m=await this['session']['encryptMessage'](this['userAddress'],a,i),n=Buffer['from'](new Uint8Array(m['body']))['toString']('base64'),o=c?.['guardAddress']||'',p=c?.['passportAddress']||'',q=c?.['network']||'',r=hashPlaintext(i,l,o,p,k),s=Date['now'](),t=this['generateNonce'](),u=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!u)throw new MessengerError('IDENTITY_NOT_FOUND','User\x20account\x20not\x20found');const v=u['pubkey'],w=k>=0x0?k['toString']():'',x=c?.['force']?'true':'false',y='send_message:'+this['userAddress']+':'+a+':'+o+':'+p+':'+r+':'+w+':'+v+':'+s+':'+t+':'+x+':'+q,z=await(await getAccount())['signData'](this['userAddress'],y),A=Buffer['from'](z['signature']['slice'](0x2),'hex'),B=bytesToBase64(new Uint8Array(A));let C;try{C=await this['serverClient']['sendMessage']({'sender':z['publicKey'],'recipient':a,'ciphertext':n,'plaintextHash':r,'clientTimestamp':l,'msgType':m['type'],'zipMetadata':j,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'network':c?.['network'],'force':c?.['force'],'lastReceivedLeafIndex':k>=0x0?k:void 0x0,'signatureScheme':'Falcon512','signature':B,'timestamp':s,'nonce':t});}catch(F){if(m['type']===0x3)try{await this['session']['store']['removeSession'](a,0x1);}catch{}throw F;}const D={'messageId':C['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':r,'plaintext':i,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':k,'direction':'sent','status':C['status']==='confirmed'?'confirmed':'pending','msgType':m['type'],'zipMetadata':j,'createdAt':l};C['merkleData']&&(D['leafIndex']=C['merkleData']['leafIndex'],D['prevRoot']=C['merkleData']['prevRoot'],D['newRoot']=C['merkleData']['newRoot'],D['serverSignature']=C['merkleData']['serverSignature'],D['serverTimestamp']=C['merkleData']['serverTimestamp'],D['serverPublicKey']=C['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':C['merkleData']['newRoot'],'prevRoot':C['merkleData']['prevRoot'],'lastLeafIndex':C['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](D);if(C['pendingMerkleData'])for(const [G,H]of Object['entries'](C['pendingMerkleData'])){const I=this['messageStorage']['getMessage'](G);if(I&&I['status']==='pending')this['messageStorage']['updateMessageStatus'](G,'confirmed',{'leafIndex':H['leafIndex'],'newRoot':H['newRoot'],'serverSignature':H['serverSignature'],'serverTimestamp':H['serverTimestamp'],'serverPublicKey':H['serverPublicKey']});}this['triggerFastPoll']();if(D['status']==='pending'&&C['messageId'])this['scheduleGuardStatusWait'](C['messageId']);return{'messageId':C['messageId'],'status':D['status'],'merkleData':C['merkleData'],'guardList':C['guard_list'],'lastReceivedLeafIndex':k>=0x0?k:void 0x0};});}async['loadFileData'](a){if(a['startsWith']('http://')||a['startsWith']('https://')){const d=new AbortController(),e=setTimeout(()=>d['abort'](),this['config']['requestTimeoutMs']??0x7530);try{const f=await fetch(a,{'signal':d['signal']});if(!f['ok'])throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20fetch\x20file\x20from\x20'+a+':\x20'+f['statusText']);const g=await f['arrayBuffer']();return new Uint8Array(g);}finally{clearTimeout(e);}}const b=a34c['resolve'](a);if(!a34d['existsSync'](b))throw new MessengerError('FILE_NOT_FOUND','File\x20not\x20found:\x20'+b);const c=a34d['readFileSync'](b);return new Uint8Array(c);}['detectContentType'](a){switch(a34c['extname'](a)['toLowerCase']()){case'.wts':return'wts';case'.wip':return'wip';default:return'zip';}}async['_createSignedRequest'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d=b+':'+c+':'+canonicalizeJson(a),e=await(await getAccount())['signData'](this['userAddress'],d),f=Buffer['from'](e['signature']['slice'](0x2),'hex'),g=bytesToBase64(new Uint8Array(f)),h=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!h||!h['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20public\x20key\x20not\x20found');return{'userAddress':this['userAddress'],'publicKey':h['pubkey'],'signatureScheme':'Falcon512','signature':g,'timestamp':b,'nonce':c,'data':a};}['_validateAddresses'](a){const b=[],c=[];for(const d of a)if(a34a(d))b['push'](d);else c['push'](d);return{'valid':b,'invalid':c};}async['addToBlacklist'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToBlacklist'](this['userAddress'],e);}async['removeFromBlacklist'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromBlacklist'](this['userAddress'],e);}async['clearBlacklist'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['clearBlacklist'](this['userAddress'],a);}async['getBlacklist'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getBlacklist'](this['userAddress'],a);}async['existInBlacklist'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInBlacklist'](this['userAddress'],e);}async['addToFriendsList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToFriendsList'](this['userAddress'],e);}async['removeFromFriendsList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromFriendsList'](this['userAddress'],e);}async['clearFriendsList'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['clearFriendsList'](this['userAddress'],a);}async['getFriendsList'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getFriendsList'](this['userAddress'],a);}async['existInFriendsList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInFriendsList'](this['userAddress'],e);}async['addToGuardList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b={'guards':a},c=await this['_createSignedRequest'](b);return this['serverClient']['addToGuardList'](this['userAddress'],c);}async['removeFromGuardList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromGuardList'](this['userAddress'],e);}async['getGuardList'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getGuardList'](this['userAddress'],a);}async['getSettings'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getSettings'](this['userAddress'],a);}async['setSettings'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b={'allowStrangerMessages':a['allowStrangerMessages'],'maxInboxSize':a['maxInboxSize']},c=await this['_createSignedRequest'](b);return this['serverClient']['updateSettings'](this['userAddress'],c);}async['tryDecryptMessage'](a){try{const b=Uint8Array['from'](Buffer['from'](a['bodyB64'],'base64')),c=await this['decryptionEngine']['decryptMessage'](this['userAddress'],a['from'],b['buffer'],a['msgType']);if(!c['success'])return{'success':![],'shouldRetry':this['isRetryableError'](c['error']||''),'error':c['error'],'sessionUpdated':c['sessionUpdated']};const d=c['plaintext'],e=parseReplyPlaintext(d);if(!a['clientTimestamp'])throw new Error('Missing\x20clientTimestamp\x20for\x20message\x20'+a['id']);if(!a['plaintextHash'])throw new Error('Missing\x20plaintextHash\x20for\x20message\x20'+a['id']);const f=verifyMessage({'messageId':a['id'],'plaintext':d,'plaintextHash':a['plaintextHash'],'createdAt':a['clientTimestamp'],'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'merkleMetadata':a['merkleMetadata']?{'prevRoot':a['merkleMetadata']['prevRoot'],'newRoot':a['merkleMetadata']['newRoot'],'serverTimestamp':a['merkleMetadata']['serverTimestamp'],'leafIndex':a['merkleMetadata']['leafIndex'],'proofSiblings':a['merkleMetadata']['proofSiblings'],'proofIndices':a['merkleMetadata']['proofIndices']}:void 0x0});if(!f['valid'])throw new Error(f['error']);const g={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash'],'plaintext':d,'replyTo':e['replyTo'],'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':'received','status':'decrypted','msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp'],'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata']};if(a['merkleMetadata'])this['sessionStateStorage']['updateSessionState'](this['userAddress'],a['from'],{'currentRoot':a['merkleMetadata']['newRoot'],'prevRoot':a['merkleMetadata']['prevRoot'],'lastLeafIndex':a['merkleMetadata']['leafIndex'],'lastSyncAt':Date['now']()});const h=a['merkleMetadata']?.['serverTimestamp']||a['clientTimestamp']||Date['now']();if(a['lastReceivedLeafIndex']!==void 0x0&&a['lastReceivedLeafIndex']>=0x0){const i=this['messageStorage']['getMessagesBySession'](this['userAddress'],a['from'])['filter'](j=>j['direction']==='sent'&&j['status']==='confirmed'&&j['leafIndex']!==void 0x0&&j['leafIndex']<=a['lastReceivedLeafIndex']);for(const j of i)this['messageStorage']['updateMessageStatus'](j['messageId'],'read');}return{'success':!![],'shouldRetry':![],'message':g,'decryptedData':{'id':a['id'],'from':a['from'],'plaintext':d,'timestamp':h,'merkleVerified':!!a['merkleMetadata'],'merkleData':a['merkleMetadata']?{'leafIndex':a['merkleMetadata']['leafIndex'],'rootHash':a['merkleMetadata']['newRoot']}:void 0x0},'sessionUpdated':c['sessionUpdated']};}catch(k){const l=k instanceof Error?k['message']:String(k);return{'success':![],'shouldRetry':this['isRetryableError'](l),'error':l};}}['isRetryableError'](a){return[/message number/i,/chain key/i,/session not found/i,/prekey not found/i,/PREKEY 竞争:我的地址较小,保留我的会话/i,/The operation failed for an operation-specific reason/i,/DOMException/i,/收到 WHISPER_MESSAGE 但无现有会话,需要等待 PREKEY_MESSAGE/i]['some'](b=>b['test'](a));}async['processWaitingMessages'](a,b){if(this['waitingMessages']['size']===0x0)return;const c=[],d=Array['from'](this['waitingMessages']['values']())['sort'](function(e,f){return(e['clientTimestamp']||0x0)-(f['clientTimestamp']||0x0);});for(const e of d){const f=e['id'],g=await this['tryDecryptMessage'](e);if(g['success']&&g['message']&&g['decryptedData'])this['messageStorage']['saveMessage'](g['message']),a['push'](g['decryptedData']),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{if(!g['shouldRetry'])console['error']('[Messenger]\x20Waiting\x20message\x20'+f+'\x20decryption\x20permanently\x20failed:\x20'+g['error']),this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Unknown\x20error'}),await this['saveFailedMessage'](e,g['error']||'Unknown\x20error'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{const h=(this['waitingMessageRetries']['get'](f)||0x0)+0x1;if(h>=0x3)console['error']('[Messenger]\x20Waiting\x20message\x20'+f+'\x20still\x20failing\x20after\x203\x20retries,\x20marked\x20as\x20permanently\x20failed'),this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Retry\x20limit\x20exceeded'}),await this['saveFailedMessage'](e,g['error']||'Retry\x20limit\x20exceeded'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else this['waitingMessageRetries']['set'](f,h);}}}for(const i of c)this['waitingMessages']['delete'](i);if(c['length']>0x0){}}async['saveFailedMessage'](a,b){const c={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash']||'','guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':'received','status':'decrypt_failed','msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp']||Date['now'](),'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata'],'decryptError':b,'decryptAttempts':0x1,'lastDecryptAttemptAt':Date['now']()};this['messageStorage']['saveMessage'](c);}['reschedulePolling'](){if(!this['isPollingRunning']||!this['pollingTimer'])return;clearTimeout(this['pollingTimer']),this['pollingTimer']=null,this['scheduleNextPoll']();}['getFailedMessages'](){return Array['from'](this['failedMessages']['entries']())['map'](([a,b])=>({'messageId':a,'from':b['message']['from'],'error':b['error'],'leafIndex':b['message']['merkleMetadata']?.['leafIndex']}));}['clearFailedMessages'](a){if(a)this['failedMessages']['delete'](a);else this['failedMessages']['clear']();}['getWaitingMessageCount'](){return this['waitingMessages']['size'];}};export{Messenger as t};
1
+ import{o as a34a}from'./wow-types-DctQuD2J.mjs';import{r as a34b}from'./logger-Da7dKX2V.mjs';import{MessageStorage,SessionStateStorage,getDatabase}from'./w/messenger/storage.mjs';import{PQSessionCipher}from'./w/messenger/pq/session.mjs';import{PQSessionStoreAdapter}from'./w/messenger/pq/store-adapter.mjs';import{DEFAULT_MESSENGER_CONFIG,MessengerError,NORMAL_MESSAGE_BYTES_LIMIT,WTS_FILE_BYTES_LIMIT}from'./w/messenger/types.mjs';import{base64ToBytes,bytesToBase64,hashPlaintext,verifyMessage}from'./w/messenger/crypto.mjs';import{REPLY_HEADER,buildReplyPlaintext,parseReplyPlaintext}from'./w/messenger/reply.mjs';import{buildAttachmentEnvelope}from'./w/messenger/attachment.mjs';import{canonicalizeJson}from'./w/messenger/utils.mjs';import{randomBytes}from'@noble/hashes/utils.js';import*as a34c from'path';import*as a34d from'fs';import{createHash}from'crypto';const logger$1=a34b('messenger:server');var MessengerServerClient=class{constructor(a){this['config']={...DEFAULT_MESSENGER_CONFIG,...a};}async['fetchWithTimeout'](a,b={},c){const d=c??this['config']['requestTimeoutMs']??0x7530,e=new AbortController(),f=setTimeout(()=>e['abort'](),d);try{return await fetch(a,{...b,'signal':e['signal']});}finally{clearTimeout(f);}}async['registerDevice'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/register',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](a)});if(!b['ok']){const d=await b['text']();if(b['status']===0x199){if(d['includes']('different\x20key'))throw new MessengerError('IDENTITY_CONFLICT','Identity\x20already\x20exists\x20with\x20different\x20key:\x20'+d);return{'success':!![],'uploadedCount':0x0,'failedPrekeys':[],'currentTotal':0x0,'maxAllowed':0x64};}throw new MessengerError('SERVER_ERROR','Registration\x20failed:\x20'+b['status']+'\x20'+b['statusText']+'\x20-\x20'+d);}const c=await b['json']();if(c['failedPrekeys']&&c['failedPrekeys']['length']>0x0){}return{'success':c['success'],'uploadedCount':c['uploaded_count'],'failedPrekeys':c['failed_prekeys']||[],'currentTotal':c['current_total'],'maxAllowed':c['max_allowed']};}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20register\x20device',e);}}async['uploadPreKeys'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/prekeys/upload',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](a)});if(!b['ok']){const d=await b['text']();throw new MessengerError('SERVER_ERROR','Failed\x20to\x20upload\x20prekeys:\x20'+b['status']+'\x20'+b['statusText']+'\x20-\x20'+d);}const c=await b['json']();if(c['failedPrekeys']&&c['failedPrekeys']['length']>0x0)throw new MessengerError('SERVER_ERROR','Some\x20prekeys\x20failed\x20to\x20upload:\x20'+JSON['stringify'](c['failedPrekeys']));return{'success':c['success'],'uploadedCount':c['uploaded_count'],'failedPrekeys':c['failed_prekeys']||[],'currentTotal':c['current_total'],'maxAllowed':c['max_allowed']};}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20upload\x20prekeys',e);}}async['fetchRemoteBundle'](a,b,c,d,e){try{const f=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/bundle/'+a,{'headers':{'X-PublicKey':c,'X-SignatureScheme':d['signatureScheme'],'X-Signature':d['signature'],'X-Timestamp':d['timestamp']['toString'](),'X-Nonce':d['nonce']}});if(!f['ok']){if(f['status']===0x194)throw new MessengerError('IDENTITY_NOT_FOUND','User\x20'+a+'\x20not\x20found\x20on\x20server');throw new MessengerError('SERVER_ERROR','Failed\x20to\x20fetch\x20remote\x20bundle:\x20'+f['statusText']);}return await f['json']();}catch(g){if(g instanceof MessengerError)throw g;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20fetch\x20remote\x20bundle',g);}}async['sendMessage'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/message',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](a)}),c=await b['json']();if(!b['ok']){const d=new MessengerError('SERVER_ERROR',c?.['error']?.['message']||c?.['message']||b['statusText']),e=c?.['error']?.['guard_list']??c?.['guard_list'];d['guardList']=Array['isArray'](e)?e['map'](f=>{if(typeof f==='string')return f;const h=f,i=h?.['guardAddress']??h?.['guard_address'];return typeof i==='string'?i:'';})['filter'](f=>typeof f==='string'&&f['length']>0x0):void 0x0;throw d;}return c;}catch(f){if(f instanceof MessengerError)throw f;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20send\x20message',f);}}async['queryMessageStatus'](a){try{const b=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/message/status/'+encodeURIComponent(a['messageId']),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'messageId':a['messageId'],'publicKey':a['publicKey'],'signature':a['signature'],'timestamp':a['timestamp'],'nonce':a['nonce']})}),c=await b['json']();if(!b['ok'])throw new MessengerError('SERVER_ERROR',c?.['error']?.['message']||c?.['message']||b['statusText']);return c;}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20query\x20message\x20status',d);}}async['pullMessages'](a,b,c,d){try{const e=new URL(this['config']['serverUrl']+'/v1/messages/'+a);if(d!==void 0x0)e['searchParams']['set']('limit',d['toString']());const f=await this['fetchWithTimeout'](e['toString'](),{'headers':{'X-PublicKey':b,'X-SignatureScheme':c['signatureScheme'],'X-Signature':c['signature'],'X-Timestamp':c['timestamp']['toString'](),'X-Nonce':c['nonce']}});if(!f['ok']){let g;try{g=(await f['json']())?.['error']?.['message'];}catch{g=void 0x0;}throw new MessengerError('SERVER_ERROR','Failed\x20to\x20pull\x20messages:\x20'+(typeof g==='string'&&g||f['statusText']||'HTTP\x20'+f['status']));}return await f['json']();}catch(h){if(h instanceof MessengerError)throw h;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20pull\x20messages',h);}}async['popPreKey'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/prekeys/'+a+'/one',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'publicKey':b['publicKey'],'signatureScheme':b['signatureScheme'],'signature':b['signature'],'timestamp':b['timestamp'],'nonce':b['nonce']})});if(c['status']===0x1ad)throw new MessengerError('SERVER_ERROR','Rate\x20limited:\x20too\x20many\x20pop\x20prekey\x20requests');if(c['status']===0x191)throw new MessengerError('SERVER_ERROR','Unauthorized:\x20signature\x20verification\x20failed\x20or\x20address\x20mismatch');if(!c['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20pop\x20prekey:\x20'+c['statusText']);return await c['json']();}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20pop\x20prekey',d);}}async['getPrekeyStatus'](a,b,c){try{const d=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/prekeys/'+a+'/status',{'headers':{'X-PublicKey':b,'X-SignatureScheme':c['signatureScheme'],'X-Signature':c['signature'],'X-Timestamp':c['timestamp']['toString'](),'X-Nonce':c['nonce']}});if(!d['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20prekey\x20status:\x20'+d['statusText']);const e=await d['json']();return{'currentCount':e['currentCount'],'maxAllowed':e['maxAllowed'],'threshold':e['threshold'],'shouldRefill':e['shouldRefill']};}catch(f){if(f instanceof MessengerError)throw f;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20prekey\x20status',f);}}async['acknowledgeMessages'](a,b,c){try{const d=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/messages/ack',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'publicKey':c['publicKey'],'messageIds':a,'senderPublicKey':b,'signatureScheme':c['signatureScheme'],'signature':c['signature'],'timestamp':c['timestamp'],'nonce':c['nonce']})});if(!d['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20acknowledge\x20messages:\x20'+d['statusText']);}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20acknowledge\x20messages',e);}}async['addToBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist',b,'POST');}async['removeFromBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist',b,'DELETE');}async['clearBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist/clear',b,'POST');}async['getBlacklist'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok']){const d=await c['text']();logger$1['error']('getBlacklist\x20error\x20response:',d);throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20blacklist:\x20'+c['statusText']+'\x20-\x20'+d);}return await c['json']();}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20blacklist',e);}}async['existInBlacklist'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/blacklist/exist',b,'POST');}async['addToFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list',b,'POST');}async['removeFromFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list',b,'DELETE');}async['clearFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list/clear',b,'POST');}async['getFriendsList'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20friends\x20list:\x20'+c['statusText']);return await c['json']();}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20friends\x20list',d);}}async['existInFriendsList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/friends-list/exist',b,'POST');}async['addToGuardList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/guard-list',b,'POST');}async['removeFromGuardList'](a,b){return this['_listOperation'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/guard-list',b,'DELETE');}async['getGuardList'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/guard-list/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok'])throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20guard\x20list:\x20'+c['statusText']);return await c['json']();}catch(d){if(d instanceof MessengerError)throw d;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20guard\x20list',d);}}async['updateSettings'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/settings',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok']){const d=await c['text']();throw new MessengerError('SERVER_ERROR','Failed\x20to\x20update\x20settings:\x20'+c['statusText']+'\x20-\x20'+d);}return(await c['json']())['success'];}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20update\x20settings',e);}}async['getSettings'](a,b){try{const c=await this['fetchWithTimeout'](this['config']['serverUrl']+'/v1/spam-protection/'+a+'/settings/get',{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!c['ok']){const d=await c['text']();throw new MessengerError('SERVER_ERROR','Failed\x20to\x20get\x20settings:\x20'+c['statusText']+'\x20-\x20'+d);}return await c['json']();}catch(e){if(e instanceof MessengerError)throw e;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20get\x20settings',e);}}async['_listOperation'](a,b,c='POST'){try{const d=await this['fetchWithTimeout'](a,{'method':c,'headers':{'Content-Type':'application/json'},'body':JSON['stringify'](b)});if(!d['ok']){const e=await d['text']();throw new MessengerError('SERVER_ERROR','List\x20operation\x20failed:\x20'+d['statusText']+'\x20-\x20'+e);}return await d['json']();}catch(f){if(f instanceof MessengerError)throw f;throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20perform\x20list\x20operation',f);}}};new MessengerServerClient();async function getAccount$1(){const {Account:a}=await import('./w/local/account.mjs');return a['Instance']();}var MessengerSession=class{constructor(a,b){this['identity']=null,this['config']={...DEFAULT_MESSENGER_CONFIG,...b},this['serverClient']=new MessengerServerClient(this['config']),this['userAddress']=a;const c=getDatabase(a);this['pqStore']=new PQSessionStoreAdapter(c,a),this['pqCipher']=new PQSessionCipher(this['pqStore'],async()=>{return(await(await getAccount$1())['deriveX25519Identity'](a))['falcon512KeyPair'];});}get['store'](){return this['pqStore'];}get['cipher'](){return this['pqCipher'];}async['ensureIdentity'](a){if(this['identity'])return this['identity'];const b=await this['pqStore']['getIdentityKeyPair'](),c=await this['pqStore']['getRegistrationId']();if(b&&c)return this['identity']={'x25519KeyPair':b,'registrationId':c},this['identity'];const d=await(await getAccount$1())['deriveX25519Identity'](this['userAddress']);return await this['pqStore']['setIdentityKeyPair'](d['x25519KeyPair']),await this['pqStore']['setRegistrationId'](d['registrationId']),this['identity']={'x25519KeyPair':d['x25519KeyPair'],'registrationId':d['registrationId']},this['identity'];}['deriveRegistrationId'](a){const b=a[0x0]<<0x8|a[0x1];return b===0x0?0x1:b;}async['registerDevice'](a){const b=await this['ensureIdentity'](a),c=0x1,d=0x1;let e,f;const g=await this['pqStore']['getSignedPreKeySignature'](c),h=await this['pqStore']['getSignedPreKey'](c),i=await this['pqStore']['getPQPreKey'](d),j=await this['pqStore']['getPQPreKeySignature'](d);if(h&&g&&i&&j)e=h['publicKey'],f=g;else{const u=await this['pqCipher']['generatePreKeyBundle'](c,d,this['config']['prekey_count']);e=u['signedPreKey']['keyPair']['publicKey'],f=u['signedPreKey']['signature'];}const k=await this['generatePreKeyBatch'](this['config']['prekey_count'],a),l=await(await getAccount$1())['get'](a,![],!![]);if(!l?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const m=Date['now'](),n=this['generateNonce'](),o='register:'+l['pubkey']+':'+m+':'+n,p=await(await getAccount$1())['signData'](a,o),q=Buffer['from'](p['signature']['slice'](0x2),'hex'),r=await this['pqStore']['getPQPreKey'](d),s=await this['pqStore']['getPQPreKeySignature'](d),t={'userAddress':a,'deviceId':0x1,'registrationId':b['registrationId'],'identityKey':bytesToBase64(b['x25519KeyPair']['publicKey']),'falcon512PublicKey':bytesToBase64(base64ToBytes(l['pubkey'])['slice'](0x1)),'signedPrekey':{'keyId':c,'publicKey':bytesToBase64(e),'signature':bytesToBase64(f)},'prekeys':k,'publicKey':l['pubkey'],'signatureScheme':'Falcon512','signature':bytesToBase64(q),'timestamp':m,'nonce':n};if(r&&s)t['pqPrekey']={'keyId':d,'publicKey':bytesToBase64(r['publicKey']),'signature':bytesToBase64(s)};if(h){let v=null;try{const w=Date['now'](),x=this['generateNonce'](),y='get_bundle:'+a+':'+w+':'+x,z=await(await getAccount$1())['signData'](a,y),A=Buffer['from'](z['signature']['slice'](0x2),'hex'),B=await this['serverClient']['fetchRemoteBundle'](a,a,l['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(A)),'timestamp':w,'nonce':x});if(B?.['signedPrekey']?.['publicKey'])v=B['signedPrekey']['publicKey'];}catch(C){if(!(C instanceof MessengerError&&C['code']==='IDENTITY_NOT_FOUND'))v=bytesToBase64(h['publicKey']);}if(v){const D=new TextEncoder()['encode'](v),E=await(await getAccount$1())['signData'](a,D),F=Buffer['from'](E['signature']['slice'](0x2),'hex');t['oldSignedPrekeySignature']=bytesToBase64(new Uint8Array(F));}}await this['serverClient']['registerDevice'](t),await this['verifyRegistrationComplete'](a);}async['verifyRegistrationComplete'](a,b=0xa,c=0x1f4){for(let d=0x0;d<b;d++)try{const e=await(await getAccount$1())['get'](a,![],!![]);if(!e?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const f=Date['now'](),g=this['generateNonce'](),h='prekey_status:'+a+':'+f+':'+g,j=await(await getAccount$1())['signData'](a,h),k=Buffer['from'](j['signature']['slice'](0x2),'hex');await this['serverClient']['getPrekeyStatus'](a,e['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(k)),'timestamp':f,'nonce':g});return;}catch(l){if(l?.['message']?.['includes']('404')||l?.['status']===0x194){if(d<b-0x1){await new Promise(m=>setTimeout(m,c));continue;}}throw l;}throw new MessengerError('REGISTRATION_FAILED','Registration\x20verification\x20failed\x20after\x20'+b+'\x20attempts');}async['isDeviceRegistered'](a){try{if(!await this['pqStore']['getSignedPreKeySignature'](0x1))return![];const b=await(await getAccount$1())['get'](a,![],!![]);if(!b?.['pubkey'])return![];const c=Date['now'](),d=this['generateNonce'](),e='prekey_status:'+a+':'+c+':'+d,f=await(await getAccount$1())['signData'](a,e),g=Buffer['from'](f['signature']['slice'](0x2),'hex');return await this['serverClient']['getPrekeyStatus'](a,b['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(g)),'timestamp':c,'nonce':d}),!![];}catch(h){if(h?.['message']?.['includes']('404')||h?.['status']===0x194)return![];return![];}}async['generatePreKeyBatch'](a,b){if(a<=0x0)return[];const c=[],{generateX25519KeyPair:d}=await import('./w/messenger/pq/crypto.mjs'),e=randomBytes(0x4),f=(e[0x0]<<0x18|e[0x1]<<0x10|e[0x2]<<0x8|e[0x3])&0x7fffff00;for(let g=0x0;g<a;g++){const h=f+g,j=await this['pqStore']['getOneTimePreKey'](h);if(j){const n=bytesToBase64(j['publicKey']),o=await(await getAccount$1())['signData'](b,j['publicKey']),p=Buffer['from'](o['signature']['slice'](0x2),'hex');c['push']({'keyId':h,'publicKey':n,'signature':bytesToBase64(p)});continue;}const k=d(),l=await(await getAccount$1())['signData'](b,k['publicKey']),m=Buffer['from'](l['signature']['slice'](0x2),'hex');await this['pqStore']['setOneTimePreKey'](h,k),c['push']({'keyId':h,'publicKey':bytesToBase64(k['publicKey']),'signature':bytesToBase64(m)});}return c;}async['getPreKeyStatus'](a){const b=await(await getAccount$1())['get'](a,![],!![]);if(!b?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const c=Date['now'](),d=this['generateNonce'](),e='prekey_status:'+a+':'+c+':'+d,f=await(await getAccount$1())['signData'](a,e),g=Buffer['from'](f['signature']['slice'](0x2),'hex');return this['serverClient']['getPrekeyStatus'](a,b['pubkey'],{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(g)),'timestamp':c,'nonce':d});}async['ensurePreKeys'](a,b=![]){const c=await(await getAccount$1())['get'](a,![],!![]);if(!c?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const d=await this['getPreKeyStatus'](a);if(!b&&d['currentCount']>=d['maxAllowed'])return;const e=d['maxAllowed']-d['currentCount'];if(e<=0x0)return;await this['ensureIdentity'](a);const f=await this['generatePreKeyBatch'](e,a);if(f['length']===0x0)return;const g=Date['now'](),h=this['generateNonce'](),i='upload_prekeys:'+c['pubkey']+':'+g+':'+h,j=await(await getAccount$1())['signData'](a,i),k=Buffer['from'](j['signature']['slice'](0x2),'hex');await this['serverClient']['uploadPreKeys']({'userAddress':a,'prekeys':f,'publicKey':c['pubkey'],'signatureScheme':'Falcon512','signature':bytesToBase64(k),'timestamp':g,'nonce':h});}['generateNonce'](){const a=new Uint8Array(0x10);return crypto['getRandomValues'](a),Array['from'](a,c=>c['toString'](0x10)['padStart'](0x2,'0'))['join']('');}async['establishSession'](a,b,c=0x1,d){if(await this['pqCipher']['hasSession'](b,c))return;if(!d){const k=await(await getAccount$1())['get'](a,![],!![]);if(!k?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20not\x20found\x20for\x20'+a);const l=Date['now'](),m=this['generateNonce'](),n=k['pubkey'],o='get_bundle:'+a+':'+l+':'+m,p=await(await getAccount$1())['signData'](a,o),q=Buffer['from'](p['signature']['slice'](0x2),'hex');d=await this['serverClient']['fetchRemoteBundle'](b,a,n,{'signatureScheme':'Falcon512','signature':bytesToBase64(new Uint8Array(q)),'timestamp':l,'nonce':m},c);}const e=d['signedPrekey'];if(!e)throw new MessengerError('IDENTITY_NOT_FOUND','No\x20signed\x20prekey\x20available\x20for\x20'+b);const f=base64ToBytes(d['identityKey']),g=d['falcon512PublicKey']?base64ToBytes(d['falcon512PublicKey']):f,h=base64ToBytes(e['publicKey']),i=base64ToBytes(e['signature']),j={'registrationId':d['registrationId'],'deviceId':c,'identityKey':f,'falcon512PublicKey':g,'signedPreKey':{'keyId':e['keyId'],'publicKey':h,'signature':i},'pqPreKey':d['pqPrekey']?{'keyId':d['pqPrekey']['keyId'],'publicKey':base64ToBytes(d['pqPrekey']['publicKey']),'signature':base64ToBytes(d['pqPrekey']['signature'])}:void 0x0};if(d['oneTimePrekey']){const r=base64ToBytes(d['oneTimePrekey']['publicKey']);j['oneTimePreKey']={'keyId':d['oneTimePrekey']['keyId'],'publicKey':r};}if(d['pqPrekey']){const s=base64ToBytes(d['pqPrekey']['publicKey']),t=base64ToBytes(d['pqPrekey']['signature']);j['pqPreKey']={'keyId':d['pqPrekey']['keyId'],'publicKey':s,'signature':t};}await this['pqCipher']['processPreKeyBundle'](b,c,j);}async['encryptMessage'](a,b,c,d=0x1){let e=0x0;const f=0x5;while(e<=f)try{if(!await this['pqCipher']['hasSession'](b,d))await this['establishSession'](a,b,d);const g=new TextEncoder()['encode'](c),h=await this['pqCipher']['encryptMessage'](b,g,d);return{'type':h['type'],'body':h['body']['buffer'],'registrationId':h['registrationId']};}catch(i){if(e>=f)throw i;try{await this['pqStore']['removeSession'](b,d),e++,await new Promise(j=>setTimeout(j,0x64));}catch(j){throw i;}}throw new MessengerError('ENCRYPTION_FAILED','Encryption\x20failed\x20after\x20multiple\x20attempts');}async['decryptMessage'](a,b,c,d,e=0x1){const f=new TextDecoder(),g=new Uint8Array(c);let h=0x0;const i=0x5,j=await this['pqCipher']['hasSession'](b,e);if(d!==0x3&&!j)throw new Error('收到\x20WHISPER_MESSAGE\x20但无现有会话,需要等待\x20PREKEY_MESSAGE');while(h<=i)try{let k;if(d===0x3)try{return k=await this['pqCipher']['decryptMessage'](b,g,e),f['decode'](k);}catch(l){if(j&&h===0x0){if(a['toLowerCase']()<b['toLowerCase']())throw new Error('PREKEY\x20竞争:我的地址较小,保留我的会话');else return await this['pqStore']['removeSession'](b,e),k=await this['pqCipher']['decryptMessage'](b,g,e),f['decode'](k);}else throw l;}else k=await this['pqCipher']['decryptMessage'](b,g,e);return f['decode'](k);}catch(m){if(h>=i)throw m;try{if(j)await this['pqStore']['removeSession'](b,e);if(d===0x3){}h++,await new Promise(n=>setTimeout(n,0x64));}catch(n){throw m;}}throw new MessengerError('DECRYPTION_FAILED','Decryption\x20failed\x20after\x20multiple\x20attempts');}async['getIdentityKey'](){return bytesToBase64((await this['ensureIdentity']())['x25519KeyPair']['publicKey']);}async['getRegistrationId'](){return(await this['ensureIdentity']())['registrationId'];}},SessionStateManager=class{constructor(a){this['store']=a;}async['snapshotSession'](a,b){const c=await this['store']['getSession'](a,b);return{'sessionData':c?JSON['stringify'](c):null,'timestamp':Date['now']()};}async['rollbackSession'](a,b,c){if(c['sessionData']){const d=JSON['parse'](c['sessionData']);await this['store']['setSession'](a,b,d);}else await this['store']['removeSession'](a,b);}async['commitSession'](a,b){}},DecryptionEngine=class{constructor(a,b){this['store']=a,this['cipher']=new PQSessionCipher(a,b),this['sessionManager']=new SessionStateManager(a);}async['decryptMessage'](a,b,c,d,e=0x1){const f=await this['sessionManager']['snapshotSession'](b,e);try{if(d===0x3)return await this['handlePreKeyMessage'](a,b,c,e,f);else return await this['handleWhisperMessage'](a,b,c,e,f);}catch(g){return await this['sessionManager']['rollbackSession'](b,e,f),{'success':![],'sessionUpdated':![],'sessionRolledBack':!![],'messageType':d===0x3?'PREKEY':'WHISPER','error':g instanceof Error?g['message']:String(g)};}}async['handlePreKeyMessage'](a,b,c,d,e){const f=new TextDecoder(),g=new Uint8Array(c),h=await this['cipher']['decryptMessage'](b,g,d),i=f['decode'](h);await this['sessionManager']['commitSession'](b,d);if(a['toLowerCase']()<b['toLowerCase']()){}return{'success':!![],'plaintext':i,'sessionUpdated':!![],'sessionRolledBack':![],'messageType':'PREKEY'};}async['handleWhisperMessage'](a,b,c,d,e){if(!await this['cipher']['hasSession'](b,d))throw new Error('No\x20session\x20for\x20WHISPER_MESSAGE');const f=new TextDecoder(),g=new Uint8Array(c),h=await this['cipher']['decryptMessage'](b,g,d);return{'success':!![],'plaintext':f['decode'](h),'sessionUpdated':!![],'sessionRolledBack':![],'messageType':'WHISPER'};}};const PULL_COALESCE_TTL_MS=0x5dc,logger=a34b('messenger:messenger');async function getAccount(){const {Account:a}=await import('./w/local/account.mjs');return a['Instance']();}var Messenger=class{['withSendLock'](a){const b=this['sendPromise'];let c;return this['sendPromise']=new Promise(d=>{c=d;}),b['then'](a)['finally'](c);}constructor(a,b){this['userAddress']=null,this['onMessageCallback']=null,this['pollingTimer']=null,this['messageConsecutiveEmptyPulls']=0x0,this['prekeyConsecutiveOkCount']=0x0,this['isPollingRunning']=![],this['emergencyMode']=![],this['pollInProgress']=![],this['waitingMessages']=new Map(),this['failedMessages']=new Map(),this['waitingMessageRetries']=new Map(),this['sendPromise']=Promise['resolve'](),this['pullInFlight']=null,this['lastPullCompletedAt']=0x0,this['guardStatusWaiters']=new Set(),this['userAddress']=a,this['config']={...DEFAULT_MESSENGER_CONFIG,...b},this['session']=new MessengerSession(a,this['config']),this['serverClient']=new MessengerServerClient(this['config']),this['messageStorage']=new MessageStorage(a),this['sessionStateStorage']=new SessionStateStorage(a),this['decryptionEngine']=new DecryptionEngine(this['session']['store'],async()=>{return(await(await getAccount())['deriveX25519Identity'](a))['falcon512KeyPair'];}),this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0xb4*0x3e8;}['getUserAddress'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');return this['userAddress'];}async['getPublicKey'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');return(await(await getAccount())['get'](this['userAddress'],![],!![]))?.['pubkey']||'';}['isValidGuardMessage'](a,b){return Boolean(a&&b&&a34a(a)&&a34a(b));}['generateNonce'](){const a=new Uint8Array(0x10);return crypto['getRandomValues'](a),Array['from'](a,c=>c['toString'](0x10)['padStart'](0x2,'0'))['join']('');}['scheduleGuardStatusWait'](a){if(!a||this['guardStatusWaiters']['has'](a))return;this['guardStatusWaiters']['add'](a),this['awaitGuardStatus'](a)['finally'](()=>{this['guardStatusWaiters']['delete'](a);});}async['awaitGuardStatus'](a){const b=0xfa0,c=0x1d4c0,d=0xea60,e=0x2*0x36ee80,f=Date['now']();while(Date['now']()-f<e){const h=Date['now']()-f<c;await new Promise(i=>setTimeout(i,h?b:d));try{const i=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!i)return;const j=Date['now'](),k=this['generateNonce'](),l='query_status:'+a+':'+i['pubkey']+':'+j+':'+k,m=await(await getAccount())['signData'](this['userAddress'],l),n=bytesToBase64(new Uint8Array(Buffer['from'](m['signature']['slice'](0x2),'hex'))),o=await this['serverClient']['queryMessageStatus']({'messageId':a,'publicKey':i['pubkey'],'signature':n,'timestamp':j,'nonce':k}),p=this['messageStorage']['getMessage'](a);if(!p||p['status']!=='pending')return;if(o['status']==='confirmed'||o['status']==='not_found'||o['status']==='notfound'){const q=o['merkleData'];this['messageStorage']['updateMessageStatus'](a,'confirmed',q?{'leafIndex':q['leafIndex'],'newRoot':q['newRoot'],'prevRoot':q['prevRoot'],'serverSignature':q['serverSignature'],'serverTimestamp':q['serverTimestamp'],'serverPublicKey':q['serverPublicKey']}:void 0x0);if(q&&p['toAddress'])this['sessionStateStorage']['updateSessionState'](this['userAddress'],p['toAddress'],{'currentRoot':q['newRoot'],'prevRoot':q['prevRoot'],'lastLeafIndex':q['leafIndex'],'lastSyncAt':Date['now']()});this['triggerFastPoll']();return;}if(o['status']==='rejected'){this['messageStorage']['updateMessageStatus'](a,'rejected');return;}}catch{}}const g=this['messageStorage']['getMessage'](a);if(g&&g['status']==='pending')this['messageStorage']['updateMessageStatus'](a,'failed');}async['initialize'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');await this['session']['ensureIdentity'](this['userAddress']),await this['session']['registerDevice'](this['userAddress']),await this['session']['ensurePreKeys'](this['userAddress']),this['startPollingTimer']();try{for(const a of this['messageStorage']['getPendingMessages'](this['userAddress']))if(a['direction']==='sent'&&a['guardAddress']&&a['messageId']&&!a['messageId']['startsWith']('local-'))this['scheduleGuardStatusWait'](a['messageId']);}catch{}}async['getPreKeyStatus'](){return this['session']['getPreKeyStatus'](this['userAddress']);}async['isPeerRegistered'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses']([a]);if(c['length']>0x0)throw new MessengerError('SERVER_ERROR','Invalid\x20peer\x20address:\x20'+a);const d=b[0x0],e=Date['now'](),f=this['generateNonce'](),g='get_bundle:'+this['userAddress']+':'+e+':'+f,h=await(await getAccount())['signData'](this['userAddress'],g),i=bytesToBase64(new Uint8Array(Buffer['from'](h['signature']['slice'](0x2),'hex'))),j=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!j?.['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20public\x20key\x20not\x20found');try{return await this['serverClient']['fetchRemoteBundle'](d,this['userAddress'],j['pubkey'],{'signatureScheme':'Falcon512','signature':i,'timestamp':e,'nonce':f}),!![];}catch(k){if(k instanceof MessengerError&&k['code']==='IDENTITY_NOT_FOUND')return![];throw k;}}['startPollingTimer'](){if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['isPollingRunning']=!![],this['scheduleNextPoll']();}['stopPollingTimer'](){this['isPollingRunning']=![],this['pollingTimer']&&(clearTimeout(this['pollingTimer']),this['pollingTimer']=null);}['scheduleNextPoll'](){if(!this['isPollingRunning'])return;if(this['pollInProgress'])return;const a=this['getNextPollInterval']();this['pollingTimer']=setTimeout(()=>{this['runPollChain']();},a);}async['runPollChain'](){this['pollInProgress']=!![];try{await this['poll']();}catch{}finally{this['pollInProgress']=![],this['scheduleNextPoll']();}}['getNextPollInterval'](){if(this['waitingMessages']['size']>0x0)return this['config']['message_poll_waiting_interval_ms']??0x3*0x3e8;return this['currentMessageInterval'];}async['poll'](){if(!this['userAddress'])return;try{const a=await this['pullMessages']();if(a['skipped'])return;a['messages']['length']>0x0?(this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8):(this['messageConsecutiveEmptyPulls']++,this['messageConsecutiveEmptyPulls']>=(this['config']['message_poll_consecutive_empty_limit']??0x3)&&(this['currentMessageInterval']=this['emergencyMode']?this['config']['message_poll_urgent_interval_ms']??0x1e*0x3e8:this['config']['message_poll_default_interval_ms']??0xb4*0x3e8,this['messageConsecutiveEmptyPulls']=0x0));if(a['prekey_status']){if(a['prekey_status']['shouldRefill'])this['prekeyConsecutiveOkCount']=0x0,await this['session']['ensurePreKeys'](this['userAddress'],![]);else{this['prekeyConsecutiveOkCount']++;if(this['prekeyConsecutiveOkCount']>=(this['config']['prekey_poll_consecutive_ok_limit']??0x3))this['prekeyConsecutiveOkCount']=0x0;}}}catch(b){}}['triggerFastPoll'](){this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['messageConsecutiveEmptyPulls']=0x0;if(this['isPollingRunning']){if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['scheduleNextPoll']();}}['triggerEmergencyPull'](){this['emergencyMode']=!![],this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8;if(!this['isPollingRunning']){this['startPollingTimer']();return;}if(this['pollInProgress'])return;if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['pollingTimer']=setTimeout(()=>{this['runPollChain']();},0x0);}['stopEmergencyPull'](){if(!this['emergencyMode'])return;this['emergencyMode']=![],this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0xb4*0x3e8;if(!this['isPollingRunning']||this['pollInProgress'])return;if(this['pollingTimer'])clearTimeout(this['pollingTimer']);this['scheduleNextPoll']();}['isInEmergencyMode'](){return this['emergencyMode'];}async['sendMessage'](a,b,c){return this['withSendLock'](async()=>{if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');if(c?.['replyTo']){const z=this['messageStorage']['getMessageById'](c['replyTo']['messageId']);if(!z)throw new MessengerError('INVALID_INPUT','sendMessage.replyTo.messageId\x20'+c['replyTo']['messageId']+'\x20not\x20found\x20in\x20local\x20storage');const A=this['userAddress']['toLowerCase'](),B=a['toLowerCase'](),C=z['fromAddress']['toLowerCase'](),D=z['toAddress']['toLowerCase']();if(!(C===A&&D===B||C===B&&D===A))throw new MessengerError('INVALID_INPUT','sendMessage.replyTo.messageId\x20'+c['replyTo']['messageId']+'\x20does\x20not\x20belong\x20to\x20this\x20conversation');}else{if(b['startsWith']('@REPLY@'))throw new MessengerError('INVALID_INPUT','Message\x20content\x20cannot\x20start\x20with\x20the\x20reserved\x20prefix\x20\x22'+REPLY_HEADER+'\x22.\x20Use\x20the\x20reply\x20feature\x20to\x20send\x20a\x20quoted\x20message,\x20or\x20rephrase\x20your\x20content.');}const d=Date['now'](),e=Date['now'](),f=this['generateNonce'](),g=c?.['replyTo']?buildReplyPlaintext(b,c['replyTo']):b,h=new TextEncoder()['encode'](g)['length'];if(h>0x2800)throw new MessengerError('INVALID_INPUT','Message\x20size\x20('+h+'\x20bytes)\x20exceeds\x20maximum\x20allowed\x20size\x20('+NORMAL_MESSAGE_BYTES_LIMIT+'\x20bytes).\x20Consider\x20using\x20sendZipFile\x20for\x20large\x20content.');try{await this['pullMessages']();}catch(E){logger['warn']('Pre-send\x20pull\x20failed\x20(best-effort,\x20continuing\x20with\x20local\x20leaf\x20index):',E instanceof Error?E['message']:String(E));}const i=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),j=await this['session']['encryptMessage'](this['userAddress'],a,g),k=Buffer['from'](new Uint8Array(j['body']))['toString']('base64'),l=hashPlaintext(g,d,c?.['guardAddress'],c?.['passportAddress'],i),m=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!m)throw new MessengerError('IDENTITY_NOT_FOUND','User\x20account\x20not\x20found');const n=m['pubkey'],o=c?.['guardAddress']||'',p=c?.['passportAddress']||'',q=c?.['network']||'',r=i>=0x0?i['toString']():'',s=c?.['force']?'true':'false',t='send_message:'+this['userAddress']+':'+a+':'+o+':'+p+':'+l+':'+r+':'+n+':'+e+':'+f+':'+s+':'+q,u=await(await getAccount())['signData'](this['userAddress'],t),v=Buffer['from'](u['signature']['slice'](0x2),'hex'),w=bytesToBase64(new Uint8Array(v));let x;try{x=await this['serverClient']['sendMessage']({'sender':u['publicKey'],'recipient':a,'ciphertext':k,'plaintextHash':l,'clientTimestamp':d,'msgType':j['type'],'signatureScheme':'Falcon512','signature':w,'timestamp':e,'nonce':f,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'network':c?.['network'],'force':c?.['force'],'lastReceivedLeafIndex':i>=0x0?i:void 0x0});}catch(F){if(j['type']===0x3)try{await this['session']['store']['removeSession'](a,0x1);}catch{}throw F;}const y={'messageId':x['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':l,'plaintext':g,'replyTo':c?.['replyTo'],'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':i,'direction':'sent','status':x['status']==='confirmed'?'confirmed':'pending','msgType':j['type'],'createdAt':d};x['merkleData']&&(y['leafIndex']=x['merkleData']['leafIndex'],y['prevRoot']=x['merkleData']['prevRoot'],y['newRoot']=x['merkleData']['newRoot'],y['serverSignature']=x['merkleData']['serverSignature'],y['serverTimestamp']=x['merkleData']['serverTimestamp'],y['serverPublicKey']=x['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':x['merkleData']['newRoot'],'prevRoot':x['merkleData']['prevRoot'],'lastLeafIndex':x['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](y);if(x['pendingMerkleData'])for(const [G,H]of Object['entries'](x['pendingMerkleData'])){const I=this['messageStorage']['getMessage'](G);if(I&&I['status']==='pending')this['messageStorage']['updateMessageStatus'](G,'confirmed',{'leafIndex':H['leafIndex'],'newRoot':H['newRoot'],'serverSignature':H['serverSignature'],'serverTimestamp':H['serverTimestamp'],'serverPublicKey':H['serverPublicKey']});}this['triggerFastPoll']();if(y['status']==='pending'&&x['messageId'])this['scheduleGuardStatusWait'](x['messageId']);return{'messageId':x['messageId'],'status':y['status'],'merkleData':x['merkleData'],'guardList':x['guard_list'],'lastReceivedLeafIndex':i>=0x0?i:void 0x0};});}async['pullMessages'](a){if(this['pullInFlight'])return this['pullInFlight'];if(Date['now']()-this['lastPullCompletedAt']<PULL_COALESCE_TTL_MS)return{'messages':[],'skipped':!![]};const b=this['doPullMessages'](a)['finally'](()=>{this['pullInFlight']=null,this['lastPullCompletedAt']=Date['now']();});return this['pullInFlight']=b,b;}async['doPullMessages'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d='fetch_messages:'+this['userAddress']+':'+(a||0x64)+':'+b+':'+c,e=(await(await getAccount())['get'](this['userAddress'],![],!![]))?.['pubkey']||'',f=await(await getAccount())['signData'](this['userAddress'],d),g={'signatureScheme':'Falcon512','signature':bytesToBase64(Buffer['from'](f['signature']['slice'](0x2),'hex')),'timestamp':b,'nonce':c},h=await this['serverClient']['pullMessages'](this['userAddress'],e,g,a);if(h['messages']['length']===0x0)return{'messages':[],'prekey_status':h['prekey_status']};const i=[],j=[],k=[...h['messages']]['sort'](function(l,m){return(l['clientTimestamp']||0x0)-(m['clientTimestamp']||0x0);});await this['processWaitingMessages'](i,j);for(const l of k){if(this['waitingMessages']['has'](l['id'])){j['push'](l['id']);continue;}if(this['failedMessages']['has'](l['id'])){j['push'](l['id']);continue;}if(this['messageStorage']['getMessage'](l['id'])){j['push'](l['id']);continue;}const m=await this['tryDecryptMessage'](l);if(m['success']&&m['message']&&m['decryptedData'])this['messageStorage']['saveMessage'](m['message']),i['push'](m['decryptedData']),j['push'](l['id']),this['waitingMessages']['delete'](l['id']);else m['shouldRetry']?(console['warn']('[Messenger]\x20Message\x20'+l['id']+'\x20decryption\x20failed,\x20added\x20to\x20waiting\x20pool:\x20'+m['error']),this['waitingMessages']['set'](l['id'],l)):(console['error']('[Messenger]\x20Message\x20'+l['id']+'\x20decryption\x20permanently\x20failed:\x20'+m['error']),this['failedMessages']['set'](l['id'],{'message':l,'error':m['error']||'Unknown\x20error'}),await this['saveFailedMessage'](l,m['error']||'Unknown\x20error'),j['push'](l['id']));}if(i['length']>0x0&&this['onMessageCallback'])this['onMessageCallback'](i);if(this['waitingMessages']['size']>0x0&&this['isPollingRunning'])this['reschedulePolling']();if(j['length']>0x0&&this['userAddress'])(async()=>{const n=Date['now'](),o=this['generateNonce'](),p=await(await getAccount())['get'](this['userAddress'],![],!![]);if(p?.['pubkey']){const q='ack_messages:'+this['userAddress']+':'+j['join'](',')+':'+p['pubkey']+':'+n+':'+o,r=await(await getAccount())['signData'](this['userAddress'],q),s=Buffer['from'](r['signature']['slice'](0x2),'hex'),t=bytesToBase64(new Uint8Array(s));await this['serverClient']['acknowledgeMessages'](j,r['publicKey'],{'publicKey':r['publicKey'],'signatureScheme':'Falcon512','signature':t,'timestamp':n,'nonce':o});}})()['catch'](n=>{console['warn']('[Messenger]\x20acknowledgeMessages\x20failed\x20(non-fatal,\x20server\x20will\x20resend):\x20'+(n instanceof Error?n['message']:String(n)));});return{'messages':i,'prekey_status':h['prekey_status']};}['getSessionMessages'](a){if(!this['userAddress'])return[];return this['messageStorage']['getMessagesBySession'](this['userAddress'],a);}['getSessionState'](a){if(!this['userAddress'])return;return this['sessionStateStorage']['getSessionState'](this['userAddress'],a);}async['submitChainProof'](a,b,c){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const d=this['sessionStateStorage']['getSessionState'](this['userAddress'],b);if(!d||!d['currentRoot'])throw new MessengerError('SESSION_NOT_ESTABLISHED','No\x20session\x20state\x20found');const e=this['messageStorage']['getMessagesBySession'](this['userAddress'],b),f=e[e['length']-0x1];if(!f||!f['serverPublicKey']||!f['serverSignature'])throw new MessengerError('INVALID_PROOF','No\x20temporal\x20proof\x20(missing\x20server\x20public\x20key\x20or\x20signature),\x20cannot\x20submit\x20Proof\x20to\x20WoWok\x20blockchain');const g=f['serverPublicKey'],h=f['serverSignature'],i={'sessionId':d['sessionId'],'merkleRoot':d['currentRoot'],'messageCount':d['messageCount'],'timestamp':Date['now']()},{CallProof:j}=await import('./proof-CPQCqZTr.mjs')['then'](l=>l['r']),k=await new j({'proof':JSON['stringify'](i),'server_pubkey':g,'server_signature':h,'proof_type':0x1,'description':c||'Messenger\x20session\x20proof\x20for\x20'+this['userAddress']+'\x20<->\x20'+b,'item_count':d['messageCount'],'about_address':b})['call'](a);return{'proofAddress':(k?.['objectChanges'])?.['find'](l=>l['objectType']?.['includes']('Proof'))?.['objectId']||'','txHash':k?.['digest']||''};}['destroy'](){this['stopPollingTimer']();}['disconnect'](){this['destroy']();}['setOnMessageCallback'](a){this['onMessageCallback']=a;}async['sendZipFile'](a,b,c){return this['withSendLock'](async()=>{if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const d=await this['loadFileData'](b),e=c?.['fileName']||a34c['basename'](b)||'file.zip',f=c?.['contentType']||this['detectContentType'](e),g=(await buildAttachmentEnvelope({'fileName':e,'bytes':d,'contentType':f,'kind':c?.['kind'],'mimeType':c?.['mimeType'],'caption':c?.['caption'],'durationMs':c?.['durationMs'],'width':c?.['width'],'height':c?.['height']}))['zip'];if(g['length']>0x500000)throw new MessengerError('INVALID_INPUT','ZIP\x20file\x20size\x20('+g['length']+'\x20bytes)\x20exceeds\x20local\x20maximum\x20allowed\x20size\x20('+WTS_FILE_BYTES_LIMIT+'\x20bytes)');const h='0x'+createHash('sha256')['update'](g)['digest']('hex'),i=Buffer['from'](g)['toString']('base64'),j={'fileName':e+'.zip','fileSize':g['length'],'fileHash':h,'contentType':f};try{await this['pullMessages']();}catch(E){logger['warn']('Pre-send\x20pull\x20failed\x20(best-effort,\x20continuing\x20with\x20local\x20leaf\x20index):',E instanceof Error?E['message']:String(E));}const k=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),l=Date['now'](),m=await this['session']['encryptMessage'](this['userAddress'],a,i),n=Buffer['from'](new Uint8Array(m['body']))['toString']('base64'),o=c?.['guardAddress']||'',p=c?.['passportAddress']||'',q=c?.['network']||'',r=hashPlaintext(i,l,o,p,k),s=Date['now'](),t=this['generateNonce'](),u=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!u)throw new MessengerError('IDENTITY_NOT_FOUND','User\x20account\x20not\x20found');const v=u['pubkey'],w=k>=0x0?k['toString']():'',x=c?.['force']?'true':'false',y='send_message:'+this['userAddress']+':'+a+':'+o+':'+p+':'+r+':'+w+':'+v+':'+s+':'+t+':'+x+':'+q,z=await(await getAccount())['signData'](this['userAddress'],y),A=Buffer['from'](z['signature']['slice'](0x2),'hex'),B=bytesToBase64(new Uint8Array(A));let C;try{C=await this['serverClient']['sendMessage']({'sender':z['publicKey'],'recipient':a,'ciphertext':n,'plaintextHash':r,'clientTimestamp':l,'msgType':m['type'],'zipMetadata':j,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'network':c?.['network'],'force':c?.['force'],'lastReceivedLeafIndex':k>=0x0?k:void 0x0,'signatureScheme':'Falcon512','signature':B,'timestamp':s,'nonce':t});}catch(F){if(m['type']===0x3)try{await this['session']['store']['removeSession'](a,0x1);}catch{}throw F;}const D={'messageId':C['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':r,'plaintext':i,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':k,'direction':'sent','status':C['status']==='confirmed'?'confirmed':'pending','msgType':m['type'],'zipMetadata':j,'createdAt':l};C['merkleData']&&(D['leafIndex']=C['merkleData']['leafIndex'],D['prevRoot']=C['merkleData']['prevRoot'],D['newRoot']=C['merkleData']['newRoot'],D['serverSignature']=C['merkleData']['serverSignature'],D['serverTimestamp']=C['merkleData']['serverTimestamp'],D['serverPublicKey']=C['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':C['merkleData']['newRoot'],'prevRoot':C['merkleData']['prevRoot'],'lastLeafIndex':C['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](D);if(C['pendingMerkleData'])for(const [G,H]of Object['entries'](C['pendingMerkleData'])){const I=this['messageStorage']['getMessage'](G);if(I&&I['status']==='pending')this['messageStorage']['updateMessageStatus'](G,'confirmed',{'leafIndex':H['leafIndex'],'newRoot':H['newRoot'],'serverSignature':H['serverSignature'],'serverTimestamp':H['serverTimestamp'],'serverPublicKey':H['serverPublicKey']});}this['triggerFastPoll']();if(D['status']==='pending'&&C['messageId'])this['scheduleGuardStatusWait'](C['messageId']);return{'messageId':C['messageId'],'status':D['status'],'merkleData':C['merkleData'],'guardList':C['guard_list'],'lastReceivedLeafIndex':k>=0x0?k:void 0x0};});}async['loadFileData'](a){if(a['startsWith']('http://')||a['startsWith']('https://')){const d=new AbortController(),e=setTimeout(()=>d['abort'](),this['config']['requestTimeoutMs']??0x7530);try{const f=await fetch(a,{'signal':d['signal']});if(!f['ok'])throw new MessengerError('NETWORK_ERROR','Failed\x20to\x20fetch\x20file\x20from\x20'+a+':\x20'+f['statusText']);const g=await f['arrayBuffer']();return new Uint8Array(g);}finally{clearTimeout(e);}}const b=a34c['resolve'](a);if(!a34d['existsSync'](b))throw new MessengerError('FILE_NOT_FOUND','File\x20not\x20found:\x20'+b);const c=a34d['readFileSync'](b);return new Uint8Array(c);}['detectContentType'](a){switch(a34c['extname'](a)['toLowerCase']()){case'.wts':return'wts';case'.wip':return'wip';default:return'zip';}}async['_createSignedRequest'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d=b+':'+c+':'+canonicalizeJson(a),e=await(await getAccount())['signData'](this['userAddress'],d),f=Buffer['from'](e['signature']['slice'](0x2),'hex'),g=bytesToBase64(new Uint8Array(f)),h=await(await getAccount())['get'](this['userAddress'],![],!![]);if(!h||!h['pubkey'])throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20public\x20key\x20not\x20found');return{'userAddress':this['userAddress'],'publicKey':h['pubkey'],'signatureScheme':'Falcon512','signature':g,'timestamp':b,'nonce':c,'data':a};}['_validateAddresses'](a){const b=[],c=[];for(const d of a)if(a34a(d))b['push'](d);else c['push'](d);return{'valid':b,'invalid':c};}async['addToBlacklist'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToBlacklist'](this['userAddress'],e);}async['removeFromBlacklist'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromBlacklist'](this['userAddress'],e);}async['clearBlacklist'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['clearBlacklist'](this['userAddress'],a);}async['getBlacklist'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getBlacklist'](this['userAddress'],a);}async['existInBlacklist'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInBlacklist'](this['userAddress'],e);}async['addToFriendsList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'add','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['addToFriendsList'](this['userAddress'],e);}async['removeFromFriendsList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromFriendsList'](this['userAddress'],e);}async['clearFriendsList'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['clearFriendsList'](this['userAddress'],a);}async['getFriendsList'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getFriendsList'](this['userAddress'],a);}async['existInFriendsList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'exist','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['existInFriendsList'](this['userAddress'],e);}async['addToGuardList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b={'guards':a},c=await this['_createSignedRequest'](b);return this['serverClient']['addToGuardList'](this['userAddress'],c);}async['removeFromGuardList'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const {valid:b,invalid:c}=this['_validateAddresses'](a);if(c['length']>0x0)return{'success':![],'operation':'remove','modifiedCount':0x0,'currentCount':0x0,'maxCount':0x0,'invalidAddresses':c,'message':'Invalid\x20addresses:\x20'+c['join'](',\x20')};const d={'addresses':b},e=await this['_createSignedRequest'](d);return this['serverClient']['removeFromGuardList'](this['userAddress'],e);}async['getGuardList'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getGuardList'](this['userAddress'],a);}async['getSettings'](){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const a=await this['_createSignedRequest']({});return this['serverClient']['getSettings'](this['userAddress'],a);}async['setSettings'](a){if(!this['userAddress'])throw new MessengerError('IDENTITY_NOT_FOUND','User\x20address\x20not\x20set');const b={'allowStrangerMessages':a['allowStrangerMessages'],'maxInboxSize':a['maxInboxSize']},c=await this['_createSignedRequest'](b);return this['serverClient']['updateSettings'](this['userAddress'],c);}async['tryDecryptMessage'](a){try{const b=Uint8Array['from'](Buffer['from'](a['bodyB64'],'base64')),c=await this['decryptionEngine']['decryptMessage'](this['userAddress'],a['from'],b['buffer'],a['msgType']);if(!c['success'])return{'success':![],'shouldRetry':this['isRetryableError'](c['error']||''),'error':c['error'],'sessionUpdated':c['sessionUpdated']};const d=c['plaintext'],e=parseReplyPlaintext(d);if(!a['clientTimestamp'])throw new Error('Missing\x20clientTimestamp\x20for\x20message\x20'+a['id']);if(!a['plaintextHash'])throw new Error('Missing\x20plaintextHash\x20for\x20message\x20'+a['id']);const f=verifyMessage({'messageId':a['id'],'plaintext':d,'plaintextHash':a['plaintextHash'],'createdAt':a['clientTimestamp'],'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'merkleMetadata':a['merkleMetadata']?{'prevRoot':a['merkleMetadata']['prevRoot'],'newRoot':a['merkleMetadata']['newRoot'],'serverTimestamp':a['merkleMetadata']['serverTimestamp'],'leafIndex':a['merkleMetadata']['leafIndex'],'proofSiblings':a['merkleMetadata']['proofSiblings'],'proofIndices':a['merkleMetadata']['proofIndices']}:void 0x0});if(!f['valid'])throw new Error(f['error']);const g={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash'],'plaintext':d,'replyTo':e['replyTo'],'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':'received','status':'decrypted','msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp'],'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata']};if(a['merkleMetadata'])this['sessionStateStorage']['updateSessionState'](this['userAddress'],a['from'],{'currentRoot':a['merkleMetadata']['newRoot'],'prevRoot':a['merkleMetadata']['prevRoot'],'lastLeafIndex':a['merkleMetadata']['leafIndex'],'lastSyncAt':Date['now']()});const h=a['merkleMetadata']?.['serverTimestamp']||a['clientTimestamp']||Date['now']();if(a['lastReceivedLeafIndex']!==void 0x0&&a['lastReceivedLeafIndex']>=0x0){const i=this['messageStorage']['getMessagesBySession'](this['userAddress'],a['from'])['filter'](j=>j['direction']==='sent'&&j['status']==='confirmed'&&j['leafIndex']!==void 0x0&&j['leafIndex']<=a['lastReceivedLeafIndex']);for(const j of i)this['messageStorage']['updateMessageStatus'](j['messageId'],'read');}return{'success':!![],'shouldRetry':![],'message':g,'decryptedData':{'id':a['id'],'from':a['from'],'plaintext':d,'timestamp':h,'merkleVerified':!!a['merkleMetadata'],'merkleData':a['merkleMetadata']?{'leafIndex':a['merkleMetadata']['leafIndex'],'rootHash':a['merkleMetadata']['newRoot']}:void 0x0},'sessionUpdated':c['sessionUpdated']};}catch(k){const l=k instanceof Error?k['message']:String(k);return{'success':![],'shouldRetry':this['isRetryableError'](l),'error':l};}}['isRetryableError'](a){return[/message number/i,/chain key/i,/session not found/i,/prekey not found/i,/PREKEY 竞争:我的地址较小,保留我的会话/i,/The operation failed for an operation-specific reason/i,/DOMException/i,/收到 WHISPER_MESSAGE 但无现有会话,需要等待 PREKEY_MESSAGE/i]['some'](b=>b['test'](a));}async['processWaitingMessages'](a,b){if(this['waitingMessages']['size']===0x0)return;const c=[],d=Array['from'](this['waitingMessages']['values']())['sort'](function(e,f){return(e['clientTimestamp']||0x0)-(f['clientTimestamp']||0x0);});for(const e of d){const f=e['id'],g=await this['tryDecryptMessage'](e);if(g['success']&&g['message']&&g['decryptedData'])this['messageStorage']['saveMessage'](g['message']),a['push'](g['decryptedData']),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{if(!g['shouldRetry'])console['error']('[Messenger]\x20Waiting\x20message\x20'+f+'\x20decryption\x20permanently\x20failed:\x20'+g['error']),this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Unknown\x20error'}),await this['saveFailedMessage'](e,g['error']||'Unknown\x20error'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else{const h=(this['waitingMessageRetries']['get'](f)||0x0)+0x1;if(h>=0x3)console['error']('[Messenger]\x20Waiting\x20message\x20'+f+'\x20still\x20failing\x20after\x203\x20retries,\x20marked\x20as\x20permanently\x20failed'),this['failedMessages']['set'](f,{'message':e,'error':g['error']||'Retry\x20limit\x20exceeded'}),await this['saveFailedMessage'](e,g['error']||'Retry\x20limit\x20exceeded'),b['push'](f),c['push'](f),this['waitingMessageRetries']['delete'](f);else this['waitingMessageRetries']['set'](f,h);}}}for(const i of c)this['waitingMessages']['delete'](i);if(c['length']>0x0){}}async['saveFailedMessage'](a,b){const c={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash']||'','guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':'received','status':'decrypt_failed','msgType':a['msgType'],'leafIndex':a['merkleMetadata']?.['leafIndex'],'prevRoot':a['merkleMetadata']?.['prevRoot'],'newRoot':a['merkleMetadata']?.['newRoot'],'serverSignature':a['merkleMetadata']?.['serverSignature'],'serverTimestamp':a['merkleMetadata']?.['serverTimestamp'],'serverPublicKey':a['merkleMetadata']?.['serverPublicKey'],'createdAt':a['clientTimestamp']||Date['now'](),'receivedAt':Date['now'](),'zipMetadata':a['zipMetadata'],'decryptError':b,'decryptAttempts':0x1,'lastDecryptAttemptAt':Date['now']()};this['messageStorage']['saveMessage'](c);}['reschedulePolling'](){if(!this['isPollingRunning']||!this['pollingTimer'])return;clearTimeout(this['pollingTimer']),this['pollingTimer']=null,this['scheduleNextPoll']();}['getFailedMessages'](){return Array['from'](this['failedMessages']['entries']())['map'](([a,b])=>({'messageId':a,'from':b['message']['from'],'error':b['error'],'leafIndex':b['message']['merkleMetadata']?.['leafIndex']}));}['clearFailedMessages'](a){if(a)this['failedMessages']['delete'](a);else this['failedMessages']['clear']();}['getWaitingMessageCount'](){return this['waitingMessages']['size'];}};export{Messenger as t};