wowok 2.1.41 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/w/call/guard.d.ts +2 -0
- package/dist/cjs/w/call/guard.js +1 -1
- package/dist/cjs/w/call/repository.js +1 -1
- package/dist/cjs/w/call/util.js +1 -1
- package/dist/cjs/w/messenger/messenger-manager.js +1 -1
- package/dist/cjs/w/messenger/messenger.js +1 -1
- package/dist/cjs/w/messenger/pq/crypto.d.ts +39 -0
- package/dist/cjs/w/messenger/pq/crypto.js +1 -0
- package/dist/cjs/w/messenger/pq/erasure.d.ts +17 -0
- package/dist/cjs/w/messenger/pq/erasure.js +1 -0
- package/dist/cjs/w/messenger/pq/index.d.ts +9 -0
- package/dist/cjs/w/messenger/pq/index.js +1 -0
- package/dist/cjs/w/messenger/pq/keycombiner.d.ts +1 -0
- package/dist/cjs/w/messenger/pq/keycombiner.js +1 -0
- package/dist/cjs/w/messenger/pq/pqxdh.d.ts +41 -0
- package/dist/cjs/w/messenger/pq/pqxdh.js +1 -0
- package/dist/cjs/w/messenger/pq/ratchet.d.ts +12 -0
- package/dist/cjs/w/messenger/pq/ratchet.js +1 -0
- package/dist/cjs/w/messenger/pq/session.d.ts +39 -0
- package/dist/cjs/w/messenger/pq/session.js +1 -0
- package/dist/cjs/w/messenger/pq/spqr.d.ts +23 -0
- package/dist/cjs/w/messenger/pq/spqr.js +1 -0
- package/dist/cjs/w/messenger/pq/store-adapter.d.ts +33 -0
- package/dist/cjs/w/messenger/pq/store-adapter.js +1 -0
- package/dist/cjs/w/messenger/pq/types.d.ts +181 -0
- package/dist/cjs/w/messenger/pq/types.js +1 -0
- package/dist/cjs/w/messenger/session.d.ts +15 -16
- package/dist/cjs/w/messenger/session.js +1 -1
- package/dist/cjs/w/messenger/storage.d.ts +2 -0
- package/dist/cjs/w/messenger/storage.js +1 -1
- package/dist/cjs/w/messenger/types.d.ts +15 -1
- package/dist/cjs/w/messenger/types.js +1 -1
- package/dist/cjs/w/messenger/utils.js +1 -1
- package/dist/cjs/w/query/object.js +1 -1
- package/dist/esm/w/call/guard.d.ts +2 -0
- package/dist/esm/w/call/guard.js +1 -1
- package/dist/esm/w/call/repository.js +1 -1
- package/dist/esm/w/call/util.js +1 -1
- package/dist/esm/w/messenger/messenger-manager.js +1 -1
- package/dist/esm/w/messenger/messenger.js +1 -1
- package/dist/esm/w/messenger/pq/crypto.d.ts +39 -0
- package/dist/esm/w/messenger/pq/crypto.js +1 -0
- package/dist/esm/w/messenger/pq/erasure.d.ts +17 -0
- package/dist/esm/w/messenger/pq/erasure.js +1 -0
- package/dist/esm/w/messenger/pq/index.d.ts +9 -0
- package/dist/esm/w/messenger/pq/index.js +1 -0
- package/dist/esm/w/messenger/pq/keycombiner.d.ts +1 -0
- package/dist/esm/w/messenger/pq/keycombiner.js +1 -0
- package/dist/esm/w/messenger/pq/pqxdh.d.ts +41 -0
- package/dist/esm/w/messenger/pq/pqxdh.js +1 -0
- package/dist/esm/w/messenger/pq/ratchet.d.ts +12 -0
- package/dist/esm/w/messenger/pq/ratchet.js +1 -0
- package/dist/esm/w/messenger/pq/session.d.ts +39 -0
- package/dist/esm/w/messenger/pq/session.js +1 -0
- package/dist/esm/w/messenger/pq/spqr.d.ts +23 -0
- package/dist/esm/w/messenger/pq/spqr.js +1 -0
- package/dist/esm/w/messenger/pq/store-adapter.d.ts +33 -0
- package/dist/esm/w/messenger/pq/store-adapter.js +1 -0
- package/dist/esm/w/messenger/pq/types.d.ts +181 -0
- package/dist/esm/w/messenger/pq/types.js +1 -0
- package/dist/esm/w/messenger/session.d.ts +15 -16
- package/dist/esm/w/messenger/session.js +1 -1
- package/dist/esm/w/messenger/storage.d.ts +2 -0
- package/dist/esm/w/messenger/storage.js +1 -1
- package/dist/esm/w/messenger/types.d.ts +15 -1
- package/dist/esm/w/messenger/types.js +1 -1
- package/dist/esm/w/messenger/utils.js +1 -1
- package/dist/esm/w/query/object.js +1 -1
- package/package.json +43 -3
package/dist/cjs/w/call/util.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{bcs}from'../../bcs/index.js';import{isValueTypeNumber,OperatorType,ValueType,parseValueType}from'../common.js';import{ContextType,MAX_ENV_PERMISSION_GUARD_COUNT}from'../common.js';import{W_ERROR,WErrors}from'../exception.js';import{Config,GetAccountOrMark_Address}from'../local/index.js';import{LocalMark}from'../local/local.js';import{GUARDQUERY,getGuardQueryInfo}from'./guard-ins.js';const ProgressHistoryFindConditionsBCS=bcs['struct']('ProgressHistoryFindConditions',{'node':bcs['option'](bcs['String']),'next_node':bcs['option'](bcs['String']),'time_min':bcs['option'](bcs['U64']),'time_max':bcs['option'](bcs['U64']),'find':bcs['U8']}),ProgressSessionFindConditionsBCS=bcs['struct']('ProgressSessionFindConditions',{'next_node':bcs['option'](bcs['String']),'find':bcs['U8']}),ProgressForwardFindConditionsBCS=bcs['struct']('ProgressForwardFindConditions',{'who':bcs['option'](bcs['Address']),'operation':bcs['option'](bcs['String']),'accomplished':bcs['option'](bcs['Bool']),'time_min':bcs['option'](bcs['U64']),'time_max':bcs['option'](bcs['U64']),'find':bcs['U8']}),StoreFromIdFilterBCS=bcs['struct']('StoreFromIdFilter',{'mode':bcs['U8'],'value':bcs['option'](bcs['Address'])}),RecordQueryConditionsBCS=bcs['struct']('RecordQueryConditions',{'recipient':bcs['Address'],'guard':bcs['option'](bcs['Address']),'time_min':bcs['option'](bcs['U64']),'time_max':bcs['option'](bcs['U64']),'amount_min':bcs['option'](bcs['U64']),'amount_max':bcs['option'](bcs['U64']),'store_from_id':bcs['option'](StoreFromIdFilterBCS)});export const getCallEnvAccount=async a=>{const b=await GetAccountOrMark_Address({'name_or_address':a['account']||''});return!b&&W_ERROR(WErrors['InvalidParam'],'account\x20'+a['account']+'\x20not\x20found'),a['account']=b,b;};function createSingleOperandNode(a,b){const c={'type':a,'node':b};return c;}export const resolveCallEnv=async a=>{a['network']=await Config['Instance']()['network_get'](a?.['network']);const b=await getCallEnvAccount(a);if(a?.['permission_guard']&&a['permission_guard']?.['length']>0x0){const c=await LocalMark['Instance']()['get_many_address_availables'](a['permission_guard']);if(c['length']!==a['permission_guard']['length']){const d=new Set(c),e=a['permission_guard']['filter'](f=>!d['has'](f));W_ERROR(WErrors['InvalidParam'],'permission_guard\x20not\x20found:\x20'+e['join'](',\x20'));}a['permission_guard']=[...c],a['permission_guard']['length']>MAX_ENV_PERMISSION_GUARD_COUNT&&W_ERROR(WErrors['InvalidParam'],'permission_guard\x20length\x20'+a['permission_guard']['length']+'\x20exceeds\x20'+MAX_ENV_PERMISSION_GUARD_COUNT);}if(a?.['referrer']){const f=await GetAccountOrMark_Address({'name_or_address':a['referrer']||''});f?a['referrer']=f:W_ERROR(WErrors['InvalidParam'],'referrer\x20'+a['referrer']+'\x20not\x20found');}return b;};export const checkType=(a,b,c)=>{if(b==='variable')return;else{if(b==='number'){if(isValueTypeNumber(a)||a===ContextType['TypeClock']||a===ValueType['Value'])return;}else{if(b===ValueType['Address']){if(a===ContextType['TypeSigner']||a===ContextType['TypeGuard']||a===ValueType['Value'])return;}else{if(a===ValueType['Value'])return;else{if(b===ValueType['Value'])return;else{if(b==='vec_number'){if(a===ValueType['VecU8']||a===ValueType['VecU16']||a===ValueType['VecU32']||a===ValueType['VecU64']||a===ValueType['VecU128']||a===ValueType['VecU256'])return;}else{if(b==='vec'){if(a===ValueType['VecBool']||a===ValueType['VecAddress']||a===ValueType['VecString']||a===ValueType['VecU8']||a===ValueType['VecU16']||a===ValueType['VecU32']||a===ValueType['VecU64']||a===ValueType['VecU128']||a===ValueType['VecU256'])return;}}}}}}}a!==b&&W_ERROR(WErrors['InvalidParam'],'checkType:\x20'+a+'\x20require\x20type:\x20'+b+'\x20with\x20node:\x20'+JSON['stringify'](c));};const parseNode=a=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseNode:\x20Unexpected\x20end\x20of\x20output\x20while\x20parsing\x20node');const b=a['output'][a['currentPosition']];a['currentPosition']++;switch(b){case ContextType['TypeConstant']:a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseNode:\x20Missing\x20identifier\x20after\x20TypeConstant\x20opcode');const c=a['output'][a['currentPosition']];a['currentPosition']++;return{'type':'identifier','identifier':c};case OperatorType['TypeQuery']:return parseQueryNode(a);case OperatorType['TypeLogicAsU256GreaterEqual']:return parseMultiOperandNode(a,'logic_as_u256_greater_or_equal');case OperatorType['TypeLogicAsU256LesserEqual']:return parseMultiOperandNode(a,'logic_as_u256_lesser_or_equal');case OperatorType['TypeLogicAsU256Equal']:return parseMultiOperandNode(a,'logic_as_u256_equal');case OperatorType['TypeLogicAsU256Greater']:return parseMultiOperandNode(a,'logic_as_u256_greater');case OperatorType['TypeLogicAsU256Lesser']:return parseMultiOperandNode(a,'logic_as_u256_lesser');case OperatorType['TypeLogicEqual']:return parseMultiOperandNode(a,'logic_equal');case OperatorType['TypeLogicAnd']:return parseMultiOperandNode(a,'logic_and');case OperatorType['TypeLogicOr']:return parseMultiOperandNode(a,'logic_or');case OperatorType['TypeStringContains']:return parseMultiOperandNode(a,'logic_string_contains');case OperatorType['TypeStringNocaseContains']:return parseMultiOperandNode(a,'logic_string_nocase_contains');case OperatorType['TypeStringNocaseEqual']:return parseMultiOperandNode(a,'logic_string_nocase_equal');case OperatorType['TypeNumberAdd']:return parseMultiOperandNode(a,'calc_number_add');case OperatorType['TypeNumberSubtract']:return parseMultiOperandNode(a,'calc_number_subtract');case OperatorType['TypeNumberMultiply']:return parseMultiOperandNode(a,'calc_number_multiply');case OperatorType['TypeNumberDivide']:return parseMultiOperandNode(a,'calc_number_divide');case OperatorType['TypeNumberMod']:return parseMultiOperandNode(a,'calc_number_mod');case OperatorType['TypeLogicNot']:return parseSingleOperandNode(a,'logic_not');case OperatorType['TypeStringLength']:return parseSingleOperandNode(a,'calc_string_length');case OperatorType['TypeNumberAddress']:return parseSingleOperandNode(a,'convert_number_address');case OperatorType['TypeAddressNumber']:return parseSingleOperandNode(a,'convert_address_number');case OperatorType['TypeNumberString']:return parseSingleOperandNode(a,'convert_number_string');case OperatorType['TypeStringNumber']:return parseSingleOperandNode(a,'convert_string_number');case OperatorType['TypeSafeU8']:return parseSingleOperandNode(a,'convert_safe_u8');case OperatorType['TypeSafeU16']:return parseSingleOperandNode(a,'convert_safe_u16');case OperatorType['TypeSafeU32']:return parseSingleOperandNode(a,'convert_safe_u32');case OperatorType['TypeSafeU64']:return parseSingleOperandNode(a,'convert_safe_u64');case OperatorType['TypeSafeU128']:return parseSingleOperandNode(a,'convert_safe_u128');case OperatorType['TypeSafeU256']:return parseSingleOperandNode(a,'convert_safe_u256');case OperatorType['TypeStringIndexof']:return parseTwoOperandNode(a,'calc_string_indexof');case OperatorType['TypeStringNocaseIndexof']:return parseTwoOperandNode(a,'calc_string_nocase_indexof');case OperatorType['TypedValueType']:return parseSingleOperandNode(a,'value_type');case OperatorType['TypedValueVecLength']:return parseSingleOperandNode(a,'vec_length');case OperatorType['TypedValueVecContains_Bool']:return parseMultiOperandNode(a,'vec_contains_bool');case OperatorType['TypedValueVecContains_Address']:return parseMultiOperandNode(a,'vec_contains_address');case OperatorType['TypedValueVecContains_String']:return parseMultiOperandNode(a,'vec_contains_string');case OperatorType['TypedValueVecContains_StringNoCase']:return parseMultiOperandNode(a,'vec_contains_string_nocase');case OperatorType['TypedValueVecContains_Number']:return parseMultiOperandNode(a,'vec_contains_number');case OperatorType['TypedValueVecIndexOf_Bool']:return parseTwoOperandNode(a,'vec_indexof_bool');case OperatorType['TypedValueVecIndexOf_Address']:return parseTwoOperandNode(a,'vec_indexof_address');case OperatorType['TypedValueVecIndexOf_String']:return parseTwoOperandNode(a,'vec_indexof_string');case OperatorType['TypedValueVecIndexOf_StringNoCase']:return parseTwoOperandNode(a,'vec_indexof_string_nocase');case OperatorType['TypedValueVecIndexOf_Number']:return parseTwoOperandNode(a,'vec_indexof_number');case ContextType['TypeSigner']:return{'type':'context','context':'Signer'};case ContextType['TypeGuard']:return{'type':'context','context':'Guard'};case ContextType['TypeClock']:return{'type':'context','context':'Clock'};default:throw new Error('ParseGuardNode:\x20Unknown\x20opcode:\x20'+b);}},parseMultiOperandNode=(a,b)=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseMultiOperandNode:\x20Insufficient\x20data\x20for\x20multi-operand\x20operation');const c=a['output'][a['currentPosition']];a['currentPosition']++;const d=[];for(let f=0x0;f<c;f++){d['unshift'](parseNode(a));}const e={'type':b,'nodes':d};return e;},parseSingleOperandNode=(a,b)=>{const c=parseNode(a);return createSingleOperandNode(b,c);},parseTwoOperandNode=(a,b)=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseTwoOperandNode:\x20Missing\x20order\x20byte');const c=a['output'][a['currentPosition']];a['currentPosition']++;const d=c===0x0?'forward':'backward',e=parseNode(a),f=parseNode(a),g={'type':b,'nodeLeft':f,'nodeRight':e,'order':d};return g;},parseQueryNode=a=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Missing\x20witness\x20byte\x20after\x20TypeQuery\x20opcode');const b=a['output'][a['currentPosition']];a['currentPosition']++;a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Missing\x20object\x20identifier\x20after\x20witness\x20byte');const c=a['output'][a['currentPosition']];a['currentPosition']++;const d=a['output']['subarray'](a['currentPosition']);d['length']<0x2&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Not\x20enough\x20bytes\x20for\x20query\x20ID\x20after\x20object\x20identifier');const e=bcs['U16']['parse'](d);a['currentPosition']+=0x2;const f=GUARDQUERY['find'](m=>m['id']===e);!f&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Query\x20with\x20ID\x20'+e+'\x20not\x20found');const g=getGuardQueryInfo(e);!g&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Query\x20name\x20not\x20found\x20for\x20ID\x20'+e);const h=[],j=g['parameters'];for(let m=j['length']-0x1;m>=0x0;m--){h['unshift'](parseNode(a));}const k=parseSpecializedQueryNode(e,c,h,a['table']);if(k)return k;const l={'type':'query','query':g['name'],'object':{'identifier':c,...b!==ContextType['TypeConstant']?{'convert_witness':b}:{}},'parameters':h};return l;},parseSpecializedQueryNode=(a,b,c,d)=>{if(a>=0x65a&&a<=0x65d)return parseRewardRecordQueryNode(a,b,c,d);if(a>=0x4fa&&a<=0x4ff)return parseProgressQueryNode(a,b,c,d);return null;},parseRewardRecordQueryNode=(a,b,c,d)=>{if(c['length']!==0x1||c[0x0]['type']!=='identifier')return null;const f=c[0x0]['identifier'];let g,h;switch(a){case 0x65a:g='query_reward_record_find',h='first';break;case 0x65b:g='query_reward_record_find',h='last';break;case 0x65c:g='query_reward_record_count';break;case 0x65d:g='query_reward_record_exists';break;default:return null;}const i=getConditionsFromTable(d,f);let j={};if(i)try{const m=RecordQueryConditionsBCS['parse'](i);j={'recipient':m['recipient'],'guard':m['guard'],'time_min':m['time_min'],'time_max':m['time_max'],'amount_min':m['amount_min'],'amount_max':m['amount_max']};}catch(n){}const k={};if(j['recipient'])k['recipient']=j['recipient'];if(j['guard'])k['guard']=j['guard'];if(j['time_min']!==null&&j['time_min']!==undefined)k['timeMin']=j['time_min']['toString']();if(j['time_max']!==null&&j['time_max']!==undefined)k['timeMax']=j['time_max']['toString']();if(j['amount_min']!==null&&j['amount_min']!==undefined)k['amountMin']=j['amount_min']['toString']();if(j['amount_max']!==null&&j['amount_max']!==undefined)k['amountMax']=j['amount_max']['toString']();const l={'object':{'identifier':b},'recipient':{'type':'identifier','identifier':f},'where':k};if(g==='query_reward_record_find')return{'type':g,...l,'find':h,'conditionsIdentifier':f};return{'type':g,...l,'conditionsIdentifier':f};},parseProgressQueryNode=(a,b,c,d)=>{switch(a){case 0x4fa:return parseProgressHistoryFindNode(b,c,d);case 0x4fb:return parseProgressSessionFindNode(b,c,d);case 0x4fc:return parseProgressForwardFindNode(b,c,d);case 0x4fd:return parseProgressSessionCountNode(b,c,d);case 0x4fe:return parseProgressForwardCountNode(b,c,d);case 0x4ff:return parseProgressRetainedCountNode(b,c,d);default:return null;}},parseProgressHistoryFindNode=(a,b,c)=>{if(b['length']!==0x1||b[0x0]['type']!=='identifier')return null;const d=b[0x0]['identifier'],f=getConditionsFromTable(c,d),g={};let h='first';if(f)try{const i=ProgressHistoryFindConditionsBCS['parse'](f);if(i['node'])g['node']=i['node'];if(i['next_node'])g['nextNode']=i['next_node'];if(i['time_min'])g['timeMin']=i['time_min']['toString']();if(i['time_max'])g['timeMax']=i['time_max']['toString']();h=i['find']===0x1?'last':'first';}catch(j){}return{'type':'query_progress_history_find','object':{'identifier':a},'where':g,'find':h,'conditionsIdentifier':d};},parseProgressSessionFindNode=(a,b,c)=>{if(b['length']!==0x2)return null;const d=b[0x0],f=b[0x1];if(d['type']!=='identifier'||f['type']!=='identifier')return null;const g=f['identifier'],h=getConditionsFromTable(c,g),i={};let j='first';if(h)try{const k=ProgressSessionFindConditionsBCS['parse'](h);if(k['next_node'])i['nextNode']=k['next_node'];j=k['find']===0x1?'last':'first';}catch(l){}return{'type':'query_progress_history_session_find','object':{'identifier':a},'historyIdx':d,'where':i,'find':j};},parseProgressForwardFindNode=(a,b,c)=>{if(b['length']!==0x3)return null;const d=b[0x0],f=b[0x1],g=b[0x2];if(d['type']!=='identifier'||f['type']!=='identifier'||g['type']!=='identifier')return null;const h=g['identifier'],i=getConditionsFromTable(c,h),j={};let k='first';if(i)try{const l=ProgressForwardFindConditionsBCS['parse'](i);if(l['who'])j['who']=l['who'];if(l['operation'])j['operation']=l['operation'];if(l['accomplished']!==undefined)j['accomplished']=l['accomplished'];if(l['time_min'])j['timeMin']=l['time_min']['toString']();if(l['time_max'])j['timeMax']=l['time_max']['toString']();k=l['find']===0x1?'last':'first';}catch(m){}return{'type':'query_progress_history_session_forward_find','object':{'identifier':a},'historyIdx':d,'sessionIdx':f,'where':j,'find':k};},parseProgressSessionCountNode=(a,b,c)=>{if(b['length']!==0x1||b[0x0]['type']!=='identifier')return null;return{'type':'query_progress_history_session_count','object':{'identifier':a},'historyIdx':b[0x0]};},parseProgressForwardCountNode=(a,b,c)=>{if(b['length']!==0x2)return null;const d=b[0x0],e=b[0x1];if(d['type']!=='identifier'||e['type']!=='identifier')return null;return{'type':'query_progress_history_session_forward_count','object':{'identifier':a},'historyIdx':d,'sessionIdx':e};},parseProgressRetainedCountNode=(a,b,c)=>{if(b['length']!==0x3)return null;const d=b[0x0],e=b[0x1],f=b[0x2];if(d['type']!=='identifier'||e['type']!=='identifier'||f['type']!=='identifier')return null;return{'type':'query_progress_history_session_forward_retained_submission_count','object':{'identifier':a},'historyIdx':d,'sessionIdx':e,'forwardIdx':f};},getConditionsFromTable=(a,b)=>{const c=a['find'](d=>d['identifier']===b);if(!c||!c['value'])return null;if(Array['isArray'](c['value'])&&c['value']['length']>0x0&&typeof c['value'][0x0]==='number')return new Uint8Array(c['value']);return null;},createQueryNode=(a,b,c,d,e,f)=>{switch(a){case 0x4fa:{const g=parseProgressHistoryFindNode(c,e,f);if(g)return g;break;}case 0x4fb:{const h=parseProgressSessionFindNode(c,e,f);if(h)return h;break;}case 0x4fc:{const i=parseProgressForwardFindNode(c,e,f);if(i)return i;break;}case 0x4fd:{const j=parseProgressSessionCountNode(c,e,f);if(j)return j;break;}case 0x4fe:{const k=parseProgressForwardCountNode(c,e,f);if(k)return k;break;}case 0x4ff:{const l=parseProgressRetainedCountNode(c,e,f);if(l)return l;break;}}return{'type':'query','query':b,'object':{'identifier':c,...d!==ContextType['TypeConstant']?{'convert_witness':d}:{}},'parameters':e};};export const restoreNodeFromOutput=(a,b)=>{try{(!a||a['length']===0x0)&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20output\x20is\x20empty');const c=[],d=new Map();let e=0x0;const f=()=>{return e>=a['length']&&W_ERROR(WErrors['InvalidParam'],'readByte:\x20Unexpected\x20end\x20of\x20output'),a[e++];},g=()=>{e+0x2>a['length']&&W_ERROR(WErrors['InvalidParam'],'readU16:\x20Insufficient\x20bytes\x20for\x20u16');const j=a[e]+a[e+0x1]*0x100;return e+=0x2,j;};while(e<a['length']){const j=f();switch(j){case ContextType['TypeConstant']:{const k=f();c['push']({'type':'identifier','identifier':k});break;}case ContextType['TypeSigner']:c['push']({'type':'context','context':'Signer'});break;case ContextType['TypeClock']:c['push']({'type':'context','context':'Clock'});break;case ContextType['TypeGuard']:c['push']({'type':'context','context':'Guard'});break;case OperatorType['TypeQuery']:{const l=f(),m=f(),n=g(),o=getGuardQueryInfo(n);!o&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Query\x20with\x20ID\x20'+n+'\x20not\x20found');const p=[];for(let r=0x0;r<o['parameters']['length'];r++){c['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20parameters\x20for\x20query\x20'+o['name']),p['unshift'](c['pop']());}if(o['id']===0x48f&&p[0x0]['type']==='identifier'&&p[0x0]?.['identifier']!=null){const s=b['find'](w=>w['identifier']===m&&!w['b_submission']),t=b['find'](w=>w['identifier']===p[0x0]['identifier']&&!w['b_submission']),u=s?parseValueType(s['value_type']):undefined,v=t?parseValueType(t['value_type']):undefined;s&&t&&u===ValueType['Address']&&v===ValueType['String']&&(d['has'](s['value'])?!d['get'](s['value'])['includes'](t['value'])&&d['get'](s['value'])['push'](t['value']):d['set'](s['value'],[t['value']]));}const q=createQueryNode(o['id'],o['name'],m,l,p,b);c['push'](q);break;}case OperatorType['TypeLogicEqual']:case OperatorType['TypeLogicAnd']:case OperatorType['TypeLogicOr']:case OperatorType['TypeLogicAsU256GreaterEqual']:case OperatorType['TypeLogicAsU256LesserEqual']:case OperatorType['TypeLogicAsU256Equal']:case OperatorType['TypeLogicAsU256Greater']:case OperatorType['TypeLogicAsU256Lesser']:case OperatorType['TypeStringContains']:case OperatorType['TypeStringNocaseContains']:case OperatorType['TypeStringNocaseEqual']:case OperatorType['TypeNumberAdd']:case OperatorType['TypeNumberSubtract']:case OperatorType['TypeNumberMultiply']:case OperatorType['TypeNumberDivide']:case OperatorType['TypeNumberMod']:{const w=f(),x=[];for(let z=0x0;z<w;z++){c['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20operands\x20for\x20multi-operand\x20operation'),x['push'](c['pop']());}const y=getNodePropertyFromOpCode(j);c['push']({'type':y,'nodes':x});break;}case OperatorType['TypeLogicNot']:case OperatorType['TypeStringLength']:case OperatorType['TypeNumberAddress']:case OperatorType['TypeAddressNumber']:case OperatorType['TypeNumberString']:case OperatorType['TypeStringNumber']:case OperatorType['TypeSafeU8']:case OperatorType['TypeSafeU16']:case OperatorType['TypeSafeU32']:case OperatorType['TypeSafeU64']:case OperatorType['TypeSafeU128']:case OperatorType['TypeSafeU256']:case OperatorType['TypedValueType']:case OperatorType['TypedValueVecLength']:{c['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20operand\x20for\x20single-operand\x20operation');const A=c['pop'](),B=getNodePropertyFromOpCode(j);c['push']({'type':B,'node':A});break;}case OperatorType['TypeStringIndexof']:case OperatorType['TypeStringNocaseIndexof']:case OperatorType['TypedValueVecIndexOf_Bool']:case OperatorType['TypedValueVecIndexOf_Address']:case OperatorType['TypedValueVecIndexOf_String']:case OperatorType['TypedValueVecIndexOf_StringNoCase']:case OperatorType['TypedValueVecIndexOf_Number']:{const C=f(),D=C===0x0?'forward':'backward';c['length']<0x2&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20operands\x20for\x20two-operand\x20operation');const E=c['pop'](),F=c['pop'](),G=getNodePropertyFromOpCode(j);c['push']({'type':G,'nodeLeft':E,'nodeRight':F,'order':D});break;}default:W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Unknown\x20opcode\x20'+j);}}c['length']!==0x1&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Expected\x201\x20node\x20in\x20stack,\x20found\x20'+c['length']);const h=collectAutoGeneratedIdentifiers(c[0x0]);return{'root':c[0x0],'rep_quote':d,'autoGeneratedIdentifiers':h};}catch(H){throw new Error('restoreNodeFromOutput:\x20Failed\x20to\x20restore\x20GuardNode\x20from\x20output:\x20'+H['message']);}};const collectAutoGeneratedIdentifiers=a=>{const b=[];switch(a['type']){case'query_progress_history_find':a['conditionsIdentifier']!==undefined&&b['push'](a['conditionsIdentifier']);break;case'query_progress_history_session_find':a['historyIdx']['type']==='identifier'&&b['push'](a['historyIdx']['identifier']);break;case'query_progress_history_session_forward_find':a['historyIdx']['type']==='identifier'&&b['push'](a['historyIdx']['identifier']);a['sessionIdx']['type']==='identifier'&&b['push'](a['sessionIdx']['identifier']);break;case'query_progress_history_session_count':a['historyIdx']['type']==='identifier'&&b['push'](a['historyIdx']['identifier']);break;case'query_progress_history_session_forward_count':a['historyIdx']['type']==='identifier'&&b['push'](a['historyIdx']['identifier']);a['sessionIdx']['type']==='identifier'&&b['push'](a['sessionIdx']['identifier']);break;case'query_progress_history_session_forward_retained_submission_count':a['historyIdx']['type']==='identifier'&&b['push'](a['historyIdx']['identifier']);a['sessionIdx']['type']==='identifier'&&b['push'](a['sessionIdx']['identifier']);a['forwardIdx']['type']==='identifier'&&b['push'](a['forwardIdx']['identifier']);break;case'query_reward_record_find':case'query_reward_record_count':case'query_reward_record_exists':a['recipient']['type']==='identifier'&&b['push'](a['recipient']['identifier']);break;case'logic_equal':case'logic_and':case'logic_or':case'logic_as_u256_greater_or_equal':case'logic_as_u256_lesser_or_equal':case'logic_as_u256_equal':case'logic_as_u256_greater':case'logic_as_u256_lesser':case'logic_string_contains':case'logic_string_nocase_contains':case'logic_string_nocase_equal':case'calc_number_add':case'calc_number_multiply':case'calc_number_subtract':case'calc_number_divide':case'calc_number_mod':for(const c of a['nodes']){b['push'](...collectAutoGeneratedIdentifiers(c));}break;case'logic_not':case'calc_string_length':case'convert_number_address':case'convert_address_number':case'convert_number_string':case'convert_string_number':case'convert_safe_u8':case'convert_safe_u16':case'convert_safe_u32':case'convert_safe_u64':case'convert_safe_u128':case'convert_safe_u256':case'value_type':case'vec_length':b['push'](...collectAutoGeneratedIdentifiers(a['node']));break;case'calc_string_indexof':case'calc_string_nocase_indexof':case'vec_indexof_bool':case'vec_indexof_address':case'vec_indexof_string':case'vec_indexof_string_nocase':case'vec_indexof_number':b['push'](...collectAutoGeneratedIdentifiers(a['nodeLeft'])),b['push'](...collectAutoGeneratedIdentifiers(a['nodeRight']));break;case'vec_contains_bool':case'vec_contains_address':case'vec_contains_string':case'vec_contains_string_nocase':case'vec_contains_number':for(const d of a['nodes']){b['push'](...collectAutoGeneratedIdentifiers(d));}break;}return b;},getNodePropertyFromOpCode=a=>{switch(a){case OperatorType['TypeLogicEqual']:return'logic_equal';case OperatorType['TypeLogicAnd']:return'logic_and';case OperatorType['TypeLogicOr']:return'logic_or';case OperatorType['TypeLogicAsU256GreaterEqual']:return'logic_as_u256_greater_or_equal';case OperatorType['TypeLogicAsU256LesserEqual']:return'logic_as_u256_lesser_or_equal';case OperatorType['TypeLogicAsU256Equal']:return'logic_as_u256_equal';case OperatorType['TypeLogicAsU256Greater']:return'logic_as_u256_greater';case OperatorType['TypeLogicAsU256Lesser']:return'logic_as_u256_lesser';case OperatorType['TypeStringContains']:return'logic_string_contains';case OperatorType['TypeStringNocaseContains']:return'logic_string_nocase_contains';case OperatorType['TypeStringNocaseEqual']:return'logic_string_nocase_equal';case OperatorType['TypeNumberAdd']:return'calc_number_add';case OperatorType['TypeNumberSubtract']:return'calc_number_subtract';case OperatorType['TypeNumberMultiply']:return'calc_number_multiply';case OperatorType['TypeNumberDivide']:return'calc_number_divide';case OperatorType['TypeNumberMod']:return'calc_number_mod';case OperatorType['TypeLogicNot']:return'logic_not';case OperatorType['TypeStringLength']:return'calc_string_length';case OperatorType['TypeNumberAddress']:return'convert_number_address';case OperatorType['TypeAddressNumber']:return'convert_address_number';case OperatorType['TypeNumberString']:return'convert_number_string';case OperatorType['TypeStringNumber']:return'convert_string_number';case OperatorType['TypeSafeU8']:return'convert_safe_u8';case OperatorType['TypeSafeU16']:return'convert_safe_u16';case OperatorType['TypeSafeU32']:return'convert_safe_u32';case OperatorType['TypeSafeU64']:return'convert_safe_u64';case OperatorType['TypeSafeU128']:return'convert_safe_u128';case OperatorType['TypeSafeU256']:return'convert_safe_u256';case OperatorType['TypedValueType']:return'value_type';case OperatorType['TypedValueVecLength']:return'vec_length';case OperatorType['TypeStringIndexof']:return'calc_string_indexof';case OperatorType['TypeStringNocaseIndexof']:return'calc_string_nocase_indexof';case OperatorType['TypedValueVecIndexOf_Bool']:return'vec_indexof_bool';case OperatorType['TypedValueVecIndexOf_Address']:return'vec_indexof_address';case OperatorType['TypedValueVecIndexOf_String']:return'vec_indexof_string';case OperatorType['TypedValueVecIndexOf_StringNoCase']:return'vec_indexof_string_nocase';case OperatorType['TypedValueVecIndexOf_Number']:return'vec_indexof_number';default:return'unknown';}};
|
|
1
|
+
import{bcs}from'../../bcs/index.js';import{isValueTypeNumber,OperatorType,ValueType,parseValueType}from'../common.js';import{ContextType,MAX_ENV_PERMISSION_GUARD_COUNT}from'../common.js';import{W_ERROR,WErrors}from'../exception.js';import{Config,GetAccountOrMark_Address}from'../local/index.js';import{LocalMark}from'../local/local.js';import{GUARDQUERY,getGuardQueryInfo}from'./guard-ins.js';const ProgressHistoryFindConditionsBCS=bcs['struct']('ProgressHistoryFindConditions',{'node':bcs['option'](bcs['String']),'next_node':bcs['option'](bcs['String']),'time_min':bcs['option'](bcs['U64']),'time_max':bcs['option'](bcs['U64']),'find':bcs['U8']}),ProgressSessionFindConditionsBCS=bcs['struct']('ProgressSessionFindConditions',{'next_node':bcs['option'](bcs['String']),'find':bcs['U8']}),ProgressForwardFindConditionsBCS=bcs['struct']('ProgressForwardFindConditions',{'who':bcs['option'](bcs['Address']),'operation':bcs['option'](bcs['String']),'accomplished':bcs['option'](bcs['Bool']),'time_min':bcs['option'](bcs['U64']),'time_max':bcs['option'](bcs['U64']),'find':bcs['U8']}),StoreFromIdFilterBCS=bcs['struct']('StoreFromIdFilter',{'mode':bcs['U8'],'value':bcs['option'](bcs['Address'])}),RecordQueryConditionsBCS=bcs['struct']('RecordQueryConditions',{'recipient':bcs['Address'],'guard':bcs['option'](bcs['Address']),'time_min':bcs['option'](bcs['U64']),'time_max':bcs['option'](bcs['U64']),'amount_min':bcs['option'](bcs['U64']),'amount_max':bcs['option'](bcs['U64']),'store_from_id':bcs['option'](StoreFromIdFilterBCS)});export const getCallEnvAccount=async a=>{const b=await GetAccountOrMark_Address({'name_or_address':a['account']||''});return!b&&W_ERROR(WErrors['InvalidParam'],'account\x20'+a['account']+'\x20not\x20found'),a['account']=b,b;};function createSingleOperandNode(a,b){const c={'type':a,'node':b};return c;}export const resolveCallEnv=async a=>{a['network']=await Config['Instance']()['network_get'](a?.['network']);const b=await getCallEnvAccount(a);if(a?.['permission_guard']&&a['permission_guard']?.['length']>0x0){const c=await LocalMark['Instance']()['get_many_address_availables'](a['permission_guard']);if(c['length']!==a['permission_guard']['length']){const d=new Set(c),e=a['permission_guard']['filter'](f=>!d['has'](f));W_ERROR(WErrors['InvalidParam'],'permission_guard\x20not\x20found:\x20'+e['join'](',\x20'));}a['permission_guard']=[...c],a['permission_guard']['length']>MAX_ENV_PERMISSION_GUARD_COUNT&&W_ERROR(WErrors['InvalidParam'],'permission_guard\x20length\x20'+a['permission_guard']['length']+'\x20exceeds\x20'+MAX_ENV_PERMISSION_GUARD_COUNT);}if(a?.['referrer']){const f=await GetAccountOrMark_Address({'name_or_address':a['referrer']||''});f?a['referrer']=f:W_ERROR(WErrors['InvalidParam'],'referrer\x20'+a['referrer']+'\x20not\x20found');}return b;};export const checkType=(a,b,c)=>{if(b==='variable')return;else{if(b==='number'){if(isValueTypeNumber(a)||a===ContextType['TypeClock']||a===ValueType['Value'])return;}else{if(b===ValueType['Address']){if(a===ContextType['TypeSigner']||a===ContextType['TypeGuard']||a===ValueType['Value'])return;}else{if(a===ValueType['Value'])return;else{if(b===ValueType['Value'])return;else{if(b==='vec_number'){if(a===ValueType['VecU8']||a===ValueType['VecU16']||a===ValueType['VecU32']||a===ValueType['VecU64']||a===ValueType['VecU128']||a===ValueType['VecU256'])return;}else{if(b==='vec'){if(a===ValueType['VecBool']||a===ValueType['VecAddress']||a===ValueType['VecString']||a===ValueType['VecU8']||a===ValueType['VecU16']||a===ValueType['VecU32']||a===ValueType['VecU64']||a===ValueType['VecU128']||a===ValueType['VecU256'])return;}}}}}}}a!==b&&W_ERROR(WErrors['InvalidParam'],'checkType:\x20'+a+'\x20require\x20type:\x20'+b+'\x20with\x20node:\x20'+JSON['stringify'](c));};const parseNode=a=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseNode:\x20Unexpected\x20end\x20of\x20output\x20while\x20parsing\x20node');const b=a['output'][a['currentPosition']];a['currentPosition']++;switch(b){case ContextType['TypeConstant']:a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseNode:\x20Missing\x20identifier\x20after\x20TypeConstant\x20opcode');const c=a['output'][a['currentPosition']];a['currentPosition']++;return{'type':'identifier','identifier':c};case OperatorType['TypeQuery']:return parseQueryNode(a);case OperatorType['TypeLogicAsU256GreaterEqual']:return parseMultiOperandNode(a,'logic_as_u256_greater_or_equal');case OperatorType['TypeLogicAsU256LesserEqual']:return parseMultiOperandNode(a,'logic_as_u256_lesser_or_equal');case OperatorType['TypeLogicAsU256Equal']:return parseMultiOperandNode(a,'logic_as_u256_equal');case OperatorType['TypeLogicAsU256Greater']:return parseMultiOperandNode(a,'logic_as_u256_greater');case OperatorType['TypeLogicAsU256Lesser']:return parseMultiOperandNode(a,'logic_as_u256_lesser');case OperatorType['TypeLogicEqual']:return parseMultiOperandNode(a,'logic_equal');case OperatorType['TypeLogicAnd']:return parseMultiOperandNode(a,'logic_and');case OperatorType['TypeLogicOr']:return parseMultiOperandNode(a,'logic_or');case OperatorType['TypeStringContains']:return parseMultiOperandNode(a,'logic_string_contains');case OperatorType['TypeStringNocaseContains']:return parseMultiOperandNode(a,'logic_string_nocase_contains');case OperatorType['TypeStringNocaseEqual']:return parseMultiOperandNode(a,'logic_string_nocase_equal');case OperatorType['TypeNumberAdd']:return parseMultiOperandNode(a,'calc_number_add');case OperatorType['TypeNumberSubtract']:return parseMultiOperandNode(a,'calc_number_subtract');case OperatorType['TypeNumberMultiply']:return parseMultiOperandNode(a,'calc_number_multiply');case OperatorType['TypeNumberDivide']:return parseMultiOperandNode(a,'calc_number_divide');case OperatorType['TypeNumberMod']:return parseMultiOperandNode(a,'calc_number_mod');case OperatorType['TypeLogicNot']:return parseSingleOperandNode(a,'logic_not');case OperatorType['TypeStringLength']:return parseSingleOperandNode(a,'calc_string_length');case OperatorType['TypeNumberAddress']:return parseSingleOperandNode(a,'convert_number_address');case OperatorType['TypeAddressNumber']:return parseSingleOperandNode(a,'convert_address_number');case OperatorType['TypeNumberString']:return parseSingleOperandNode(a,'convert_number_string');case OperatorType['TypeStringNumber']:return parseSingleOperandNode(a,'convert_string_number');case OperatorType['TypeSafeU8']:return parseSingleOperandNode(a,'convert_safe_u8');case OperatorType['TypeSafeU16']:return parseSingleOperandNode(a,'convert_safe_u16');case OperatorType['TypeSafeU32']:return parseSingleOperandNode(a,'convert_safe_u32');case OperatorType['TypeSafeU64']:return parseSingleOperandNode(a,'convert_safe_u64');case OperatorType['TypeSafeU128']:return parseSingleOperandNode(a,'convert_safe_u128');case OperatorType['TypeSafeU256']:return parseSingleOperandNode(a,'convert_safe_u256');case OperatorType['TypeStringIndexof']:return parseTwoOperandNode(a,'calc_string_indexof');case OperatorType['TypeStringNocaseIndexof']:return parseTwoOperandNode(a,'calc_string_nocase_indexof');case OperatorType['TypedValueType']:return parseSingleOperandNode(a,'value_type');case OperatorType['TypedValueVecLength']:return parseSingleOperandNode(a,'vec_length');case OperatorType['TypedValueVecContains_Bool']:return parseMultiOperandNode(a,'vec_contains_bool');case OperatorType['TypedValueVecContains_Address']:return parseMultiOperandNode(a,'vec_contains_address');case OperatorType['TypedValueVecContains_String']:return parseMultiOperandNode(a,'vec_contains_string');case OperatorType['TypedValueVecContains_StringNoCase']:return parseMultiOperandNode(a,'vec_contains_string_nocase');case OperatorType['TypedValueVecContains_Number']:return parseMultiOperandNode(a,'vec_contains_number');case OperatorType['TypedValueVecIndexOf_Bool']:return parseTwoOperandNode(a,'vec_indexof_bool');case OperatorType['TypedValueVecIndexOf_Address']:return parseTwoOperandNode(a,'vec_indexof_address');case OperatorType['TypedValueVecIndexOf_String']:return parseTwoOperandNode(a,'vec_indexof_string');case OperatorType['TypedValueVecIndexOf_StringNoCase']:return parseTwoOperandNode(a,'vec_indexof_string_nocase');case OperatorType['TypedValueVecIndexOf_Number']:return parseTwoOperandNode(a,'vec_indexof_number');case ContextType['TypeSigner']:return{'type':'context','context':'Signer'};case ContextType['TypeGuard']:return{'type':'context','context':'Guard'};case ContextType['TypeClock']:return{'type':'context','context':'Clock'};default:throw new Error('ParseGuardNode:\x20Unknown\x20opcode:\x20'+b);}},parseMultiOperandNode=(a,b)=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseMultiOperandNode:\x20Insufficient\x20data\x20for\x20multi-operand\x20operation');const c=a['output'][a['currentPosition']];a['currentPosition']++;const d=[];for(let f=0x0;f<c;f++){d['unshift'](parseNode(a));}const e={'type':b,'nodes':d};return e;},parseSingleOperandNode=(a,b)=>{const c=parseNode(a);return createSingleOperandNode(b,c);},parseTwoOperandNode=(a,b)=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseTwoOperandNode:\x20Missing\x20order\x20byte');const c=a['output'][a['currentPosition']];a['currentPosition']++;const d=c===0x0?'forward':'backward',e=parseNode(a),f=parseNode(a),g={'type':b,'nodeLeft':f,'nodeRight':e,'order':d};return g;},parseQueryNode=a=>{a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Missing\x20witness\x20byte\x20after\x20TypeQuery\x20opcode');const b=a['output'][a['currentPosition']];a['currentPosition']++;a['currentPosition']>=a['output']['length']&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Missing\x20object\x20identifier\x20after\x20witness\x20byte');const c=a['output'][a['currentPosition']];a['currentPosition']++;const d=a['output']['subarray'](a['currentPosition']);d['length']<0x2&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Not\x20enough\x20bytes\x20for\x20query\x20ID\x20after\x20object\x20identifier');const e=bcs['U16']['parse'](d);a['currentPosition']+=0x2;const f=GUARDQUERY['find'](m=>m['id']===e);!f&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Query\x20with\x20ID\x20'+e+'\x20not\x20found');const g=getGuardQueryInfo(e);!g&&W_ERROR(WErrors['InvalidParam'],'parseQueryNode:\x20Query\x20name\x20not\x20found\x20for\x20ID\x20'+e);const h=[],j=g['parameters'];for(let m=j['length']-0x1;m>=0x0;m--){h['unshift'](parseNode(a));}const k=parseSpecializedQueryNode(e,c,h,a['table']);if(k)return k;const l={'type':'query','query':g['name'],'object':{'identifier':c,...b!==ContextType['TypeConstant']?{'convert_witness':b}:{}},'parameters':h};return l;},parseSpecializedQueryNode=(a,b,c,d)=>{if(a>=0x65a&&a<=0x65d)return parseRewardRecordQueryNode(a,b,c,d);if(a>=0x4fa&&a<=0x4ff)return parseProgressQueryNode(a,b,c,d);return null;},parseRewardRecordQueryNode=(a,b,c,d)=>{if(c['length']!==0x1||c[0x0]['type']!=='identifier')return null;const f=c[0x0]['identifier'];let g,h;switch(a){case 0x65a:g='query_reward_record_find',h='first';break;case 0x65b:g='query_reward_record_find',h='last';break;case 0x65c:g='query_reward_record_count';break;case 0x65d:g='query_reward_record_exists';break;default:return null;}const i=getConditionsFromTable(d,f);let j={};if(i)try{const m=RecordQueryConditionsBCS['parse'](i);j={'recipient':m['recipient'],'guard':m['guard'],'time_min':m['time_min'],'time_max':m['time_max'],'amount_min':m['amount_min'],'amount_max':m['amount_max']};}catch(n){}const k={};if(j['recipient'])k['recipient']=j['recipient'];if(j['guard'])k['guard']=j['guard'];if(j['time_min']!==null&&j['time_min']!==undefined)k['timeMin']=j['time_min']['toString']();if(j['time_max']!==null&&j['time_max']!==undefined)k['timeMax']=j['time_max']['toString']();if(j['amount_min']!==null&&j['amount_min']!==undefined)k['amountMin']=j['amount_min']['toString']();if(j['amount_max']!==null&&j['amount_max']!==undefined)k['amountMax']=j['amount_max']['toString']();const l={'object':{'identifier':b},'recipient':{'type':'identifier','identifier':f},'where':k};if(g==='query_reward_record_find')return{'type':g,...l,'find':h,'conditionsIdentifier':f};return{'type':g,...l,'conditionsIdentifier':f};},parseProgressQueryNode=(a,b,c,d)=>{switch(a){case 0x4fa:return parseProgressHistoryFindNode(b,c,d);case 0x4fb:return parseProgressSessionFindNode(b,c,d);case 0x4fc:return parseProgressForwardFindNode(b,c,d);case 0x4fd:return parseProgressSessionCountNode(b,c,d);case 0x4fe:return parseProgressForwardCountNode(b,c,d);case 0x4ff:return parseProgressRetainedCountNode(b,c,d);default:return null;}},parseProgressHistoryFindNode=(a,b,c)=>{if(b['length']!==0x1||b[0x0]['type']!=='identifier')return null;const d=b[0x0]['identifier'],f=getConditionsFromTable(c,d),g={};let h='first';if(f)try{const i=ProgressHistoryFindConditionsBCS['parse'](f);if(i['node'])g['node']=i['node'];if(i['next_node'])g['nextNode']=i['next_node'];if(i['time_min'])g['timeMin']=i['time_min']['toString']();if(i['time_max'])g['timeMax']=i['time_max']['toString']();h=i['find']===0x1?'last':'first';}catch(j){}return{'type':'query_progress_history_find','object':{'identifier':a},'where':g,'find':h,'conditionsIdentifier':d};},parseProgressSessionFindNode=(a,b,c)=>{if(b['length']!==0x2)return null;const d=b[0x0],f=b[0x1];if(d['type']!=='identifier')return null;if(f['type']!=='identifier'&&!f['type']['startsWith']('query_progress'))return null;const g=d['identifier'],h=getConditionsFromTable(c,g),i={};let j='first';if(h)try{const k=ProgressSessionFindConditionsBCS['parse'](h);if(k['next_node'])i['nextNode']=k['next_node'];j=k['find']===0x1?'last':'first';}catch(l){}return{'type':'query_progress_history_session_find','object':{'identifier':a},'historyIdx':f,'where':i,'find':j};},parseProgressForwardFindNode=(a,b,c)=>{if(b['length']!==0x3)return null;const d=b[0x0],f=b[0x1],g=b[0x2];if(d['type']!=='identifier')return null;const h=m=>m['type']==='identifier'||m['type']['startsWith']('query_progress');if(!h(f)||!h(g))return null;const i=d['identifier'],j=getConditionsFromTable(c,i),k={};let l='first';if(j)try{const m=ProgressForwardFindConditionsBCS['parse'](j);if(m['who'])k['who']=m['who'];if(m['operation'])k['operation']=m['operation'];if(m['accomplished']!==undefined)k['accomplished']=m['accomplished'];if(m['time_min'])k['timeMin']=m['time_min']['toString']();if(m['time_max'])k['timeMax']=m['time_max']['toString']();l=m['find']===0x1?'last':'first';}catch(n){}return{'type':'query_progress_history_session_forward_find','object':{'identifier':a},'historyIdx':g,'sessionIdx':f,'where':k,'find':l};},parseProgressSessionCountNode=(a,b,c)=>{if(b['length']!==0x1)return null;const d=b[0x0];if(d['type']!=='identifier'&&!d['type']['startsWith']('query_progress'))return null;return{'type':'query_progress_history_session_count','object':{'identifier':a},'historyIdx':d};},parseProgressForwardCountNode=(a,b,c)=>{if(b['length']!==0x2)return null;const d=b[0x0],e=b[0x1],f=g=>g['type']==='identifier'||g['type']['startsWith']('query_progress');if(!f(d)||!f(e))return null;return{'type':'query_progress_history_session_forward_count','object':{'identifier':a},'historyIdx':d,'sessionIdx':e};},parseProgressRetainedCountNode=(a,b,c)=>{if(b['length']!==0x3)return null;const d=b[0x0],e=b[0x1],f=b[0x2],g=h=>h['type']==='identifier'||h['type']['startsWith']('query_progress');if(!g(d)||!g(e)||!g(f))return null;return{'type':'query_progress_history_session_forward_retained_submission_count','object':{'identifier':a},'historyIdx':d,'sessionIdx':e,'forwardIdx':f};},getConditionsFromTable=(a,b)=>{const c=a['find'](d=>d['identifier']===b);if(!c||!c['value'])return null;if(Array['isArray'](c['value'])&&c['value']['length']>0x0&&typeof c['value'][0x0]==='number')return new Uint8Array(c['value']);return null;},createQueryNode=(a,b,c,d,e,f)=>{switch(a){case 0x4fa:{const g=parseProgressHistoryFindNode(c,e,f);if(g)return g;break;}case 0x4fb:{const h=parseProgressSessionFindNode(c,e,f);if(h)return h;break;}case 0x4fc:{const i=parseProgressForwardFindNode(c,e,f);if(i)return i;break;}case 0x4fd:{const j=parseProgressSessionCountNode(c,e,f);if(j)return j;break;}case 0x4fe:{const k=parseProgressForwardCountNode(c,e,f);if(k)return k;break;}case 0x4ff:{const l=parseProgressRetainedCountNode(c,e,f);if(l)return l;break;}}return{'type':'query','query':b,'object':{'identifier':c,...d!==ContextType['TypeConstant']?{'convert_witness':d}:{}},'parameters':e};};export const restoreNodeFromOutput=(a,b)=>{try{(!a||a['length']===0x0)&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20output\x20is\x20empty');const c=[],d=new Map();let e=0x0;const f=()=>{return e>=a['length']&&W_ERROR(WErrors['InvalidParam'],'readByte:\x20Unexpected\x20end\x20of\x20output'),a[e++];},g=()=>{e+0x2>a['length']&&W_ERROR(WErrors['InvalidParam'],'readU16:\x20Insufficient\x20bytes\x20for\x20u16');const j=a[e]+a[e+0x1]*0x100;return e+=0x2,j;};while(e<a['length']){const j=f();switch(j){case ContextType['TypeConstant']:{const k=f();c['push']({'type':'identifier','identifier':k});break;}case ContextType['TypeSigner']:c['push']({'type':'context','context':'Signer'});break;case ContextType['TypeClock']:c['push']({'type':'context','context':'Clock'});break;case ContextType['TypeGuard']:c['push']({'type':'context','context':'Guard'});break;case OperatorType['TypeQuery']:{const l=f(),m=f(),n=g(),o=getGuardQueryInfo(n);!o&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Query\x20with\x20ID\x20'+n+'\x20not\x20found');const p=[];for(let r=0x0;r<o['parameters']['length'];r++){c['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20parameters\x20for\x20query\x20'+o['name']),p['unshift'](c['pop']());}if(o['id']===0x48f&&p[0x0]['type']==='identifier'&&p[0x0]?.['identifier']!=null){const s=b['find'](w=>w['identifier']===m&&!w['b_submission']),t=b['find'](w=>w['identifier']===p[0x0]['identifier']&&!w['b_submission']),u=s?parseValueType(s['value_type']):undefined,v=t?parseValueType(t['value_type']):undefined;s&&t&&u===ValueType['Address']&&v===ValueType['String']&&(d['has'](s['value'])?!d['get'](s['value'])['includes'](t['value'])&&d['get'](s['value'])['push'](t['value']):d['set'](s['value'],[t['value']]));}const q=createQueryNode(o['id'],o['name'],m,l,p,b);c['push'](q);break;}case OperatorType['TypeLogicEqual']:case OperatorType['TypeLogicAnd']:case OperatorType['TypeLogicOr']:case OperatorType['TypeLogicAsU256GreaterEqual']:case OperatorType['TypeLogicAsU256LesserEqual']:case OperatorType['TypeLogicAsU256Equal']:case OperatorType['TypeLogicAsU256Greater']:case OperatorType['TypeLogicAsU256Lesser']:case OperatorType['TypeStringContains']:case OperatorType['TypeStringNocaseContains']:case OperatorType['TypeStringNocaseEqual']:case OperatorType['TypeNumberAdd']:case OperatorType['TypeNumberSubtract']:case OperatorType['TypeNumberMultiply']:case OperatorType['TypeNumberDivide']:case OperatorType['TypeNumberMod']:{const w=f(),x=[];for(let z=0x0;z<w;z++){c['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20operands\x20for\x20multi-operand\x20operation'),x['push'](c['pop']());}const y=getNodePropertyFromOpCode(j);c['push']({'type':y,'nodes':x});break;}case OperatorType['TypeLogicNot']:case OperatorType['TypeStringLength']:case OperatorType['TypeNumberAddress']:case OperatorType['TypeAddressNumber']:case OperatorType['TypeNumberString']:case OperatorType['TypeStringNumber']:case OperatorType['TypeSafeU8']:case OperatorType['TypeSafeU16']:case OperatorType['TypeSafeU32']:case OperatorType['TypeSafeU64']:case OperatorType['TypeSafeU128']:case OperatorType['TypeSafeU256']:case OperatorType['TypedValueType']:case OperatorType['TypedValueVecLength']:{c['length']===0x0&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20operand\x20for\x20single-operand\x20operation');const A=c['pop'](),B=getNodePropertyFromOpCode(j);c['push']({'type':B,'node':A});break;}case OperatorType['TypeStringIndexof']:case OperatorType['TypeStringNocaseIndexof']:case OperatorType['TypedValueVecIndexOf_Bool']:case OperatorType['TypedValueVecIndexOf_Address']:case OperatorType['TypedValueVecIndexOf_String']:case OperatorType['TypedValueVecIndexOf_StringNoCase']:case OperatorType['TypedValueVecIndexOf_Number']:{const C=f(),D=C===0x0?'forward':'backward';c['length']<0x2&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Insufficient\x20operands\x20for\x20two-operand\x20operation');const E=c['pop'](),F=c['pop'](),G=getNodePropertyFromOpCode(j);c['push']({'type':G,'nodeLeft':E,'nodeRight':F,'order':D});break;}default:W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Unknown\x20opcode\x20'+j);}}c['length']!==0x1&&W_ERROR(WErrors['InvalidParam'],'restoreNodeFromOutput:\x20Expected\x201\x20node\x20in\x20stack,\x20found\x20'+c['length']);const h=collectAutoGeneratedIdentifiers(c[0x0]);return{'root':c[0x0],'rep_quote':d,'autoGeneratedIdentifiers':h};}catch(H){throw new Error('restoreNodeFromOutput:\x20Failed\x20to\x20restore\x20GuardNode\x20from\x20output:\x20'+H['message']);}};const collectAutoGeneratedIdentifiers=a=>{const b=[];switch(a['type']){case'query_progress_history_find':break;case'query_progress_history_session_find':b['push'](...collectAutoGeneratedIdentifiers(a['historyIdx']));break;case'query_progress_history_session_forward_find':b['push'](...collectAutoGeneratedIdentifiers(a['historyIdx'])),b['push'](...collectAutoGeneratedIdentifiers(a['sessionIdx']));break;case'query_progress_history_session_count':b['push'](...collectAutoGeneratedIdentifiers(a['historyIdx']));break;case'query_progress_history_session_forward_count':b['push'](...collectAutoGeneratedIdentifiers(a['historyIdx'])),b['push'](...collectAutoGeneratedIdentifiers(a['sessionIdx']));break;case'query_progress_history_session_forward_retained_submission_count':b['push'](...collectAutoGeneratedIdentifiers(a['historyIdx'])),b['push'](...collectAutoGeneratedIdentifiers(a['sessionIdx'])),b['push'](...collectAutoGeneratedIdentifiers(a['forwardIdx']));break;case'query_reward_record_find':case'query_reward_record_count':case'query_reward_record_exists':a['recipient']['type']==='identifier'&&b['push'](a['recipient']['identifier']);break;case'logic_equal':case'logic_and':case'logic_or':case'logic_as_u256_greater_or_equal':case'logic_as_u256_lesser_or_equal':case'logic_as_u256_equal':case'logic_as_u256_greater':case'logic_as_u256_lesser':case'logic_string_contains':case'logic_string_nocase_contains':case'logic_string_nocase_equal':case'calc_number_add':case'calc_number_multiply':case'calc_number_subtract':case'calc_number_divide':case'calc_number_mod':for(const c of a['nodes']){b['push'](...collectAutoGeneratedIdentifiers(c));}break;case'logic_not':case'calc_string_length':case'convert_number_address':case'convert_address_number':case'convert_number_string':case'convert_string_number':case'convert_safe_u8':case'convert_safe_u16':case'convert_safe_u32':case'convert_safe_u64':case'convert_safe_u128':case'convert_safe_u256':case'value_type':case'vec_length':b['push'](...collectAutoGeneratedIdentifiers(a['node']));break;case'calc_string_indexof':case'calc_string_nocase_indexof':case'vec_indexof_bool':case'vec_indexof_address':case'vec_indexof_string':case'vec_indexof_string_nocase':case'vec_indexof_number':b['push'](...collectAutoGeneratedIdentifiers(a['nodeLeft'])),b['push'](...collectAutoGeneratedIdentifiers(a['nodeRight']));break;case'vec_contains_bool':case'vec_contains_address':case'vec_contains_string':case'vec_contains_string_nocase':case'vec_contains_number':for(const d of a['nodes']){b['push'](...collectAutoGeneratedIdentifiers(d));}break;}return b;},getNodePropertyFromOpCode=a=>{switch(a){case OperatorType['TypeLogicEqual']:return'logic_equal';case OperatorType['TypeLogicAnd']:return'logic_and';case OperatorType['TypeLogicOr']:return'logic_or';case OperatorType['TypeLogicAsU256GreaterEqual']:return'logic_as_u256_greater_or_equal';case OperatorType['TypeLogicAsU256LesserEqual']:return'logic_as_u256_lesser_or_equal';case OperatorType['TypeLogicAsU256Equal']:return'logic_as_u256_equal';case OperatorType['TypeLogicAsU256Greater']:return'logic_as_u256_greater';case OperatorType['TypeLogicAsU256Lesser']:return'logic_as_u256_lesser';case OperatorType['TypeStringContains']:return'logic_string_contains';case OperatorType['TypeStringNocaseContains']:return'logic_string_nocase_contains';case OperatorType['TypeStringNocaseEqual']:return'logic_string_nocase_equal';case OperatorType['TypeNumberAdd']:return'calc_number_add';case OperatorType['TypeNumberSubtract']:return'calc_number_subtract';case OperatorType['TypeNumberMultiply']:return'calc_number_multiply';case OperatorType['TypeNumberDivide']:return'calc_number_divide';case OperatorType['TypeNumberMod']:return'calc_number_mod';case OperatorType['TypeLogicNot']:return'logic_not';case OperatorType['TypeStringLength']:return'calc_string_length';case OperatorType['TypeNumberAddress']:return'convert_number_address';case OperatorType['TypeAddressNumber']:return'convert_address_number';case OperatorType['TypeNumberString']:return'convert_number_string';case OperatorType['TypeStringNumber']:return'convert_string_number';case OperatorType['TypeSafeU8']:return'convert_safe_u8';case OperatorType['TypeSafeU16']:return'convert_safe_u16';case OperatorType['TypeSafeU32']:return'convert_safe_u32';case OperatorType['TypeSafeU64']:return'convert_safe_u64';case OperatorType['TypeSafeU128']:return'convert_safe_u128';case OperatorType['TypeSafeU256']:return'convert_safe_u256';case OperatorType['TypedValueType']:return'value_type';case OperatorType['TypedValueVecLength']:return'vec_length';case OperatorType['TypeStringIndexof']:return'calc_string_indexof';case OperatorType['TypeStringNocaseIndexof']:return'calc_string_nocase_indexof';case OperatorType['TypedValueVecIndexOf_Bool']:return'vec_indexof_bool';case OperatorType['TypedValueVecIndexOf_Address']:return'vec_indexof_address';case OperatorType['TypedValueVecIndexOf_String']:return'vec_indexof_string';case OperatorType['TypedValueVecIndexOf_StringNoCase']:return'vec_indexof_string_nocase';case OperatorType['TypedValueVecIndexOf_Number']:return'vec_indexof_number';default:return'unknown';}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Messenger}from'./messenger.js';import{MessageStorage}from'./storage.js';import{MessengerPersistStorage}from'./storage.js';import{MessageType,MessageStatus,WTS_MAX_MESSAGE_COUNT,WTS_SCHEMA_URL}from'./types.js';import{MessengerError,MessengerErrorCode,DEFAULT_MESSENGER_CONFIG}from'./types.js';import{canonicalizeJson}from'./utils.js';import{MAX_MESSENGER_ACCOUNTS}from'../local/account.js';import{GetAccountOrMark_Address}from'../local/index.js';const MAX_ACCOUNTS=MAX_MESSENGER_ACCOUNTS,sleep=a=>new Promise(b=>setTimeout(b,a));export class MessengerManager{['accounts']=new Map();['config'];['messageListeners']=new Set();['isWatching']=![];['persistStorage'];['instanceId'];['accountRefreshTimer']=null;['pollingLockedAccounts']=new Set();constructor(a){this['config']={...DEFAULT_MESSENGER_CONFIG,...a?.['messengerConfig']},this['instanceId']=a?.['instanceId']||'default',this['persistStorage']=new MessengerPersistStorage();}['findAccount'](a){return this['accounts']['get'](a['toLowerCase']());}['getConfig'](){return this['config'];}['get_accounts'](){return Array['from'](this['accounts']['values']())['map'](a=>a['address']);}async['refresh_accounts'](){const {Account:a}=await import('../local/account.js'),b=await a['Instance']()['list_messenger_accounts'](),c=new Set(this['accounts']['keys']()),d=new Set(b['map'](e=>e['address']['toLowerCase']()));for(const e of c){!d['has'](e)&&this['remove_account_internal'](e);}for(const f of b){const g=f['address']['toLowerCase']();if(!this['accounts']['has'](g))try{await this['add_account_internal'](f['address']);}catch(h){console['error']('Failed\x20to\x20add\x20account\x20'+g+'\x20to\x20messenger\x20manager:',h);}}if(this['accounts']['size']>0x0&&!this['isWatching'])this['startPolling']();else this['accounts']['size']===0x0&&this['isWatching']&&this['stopPolling']();await this['syncAllContactLists']();}async['start'](){await this['refresh_accounts']();for(const a of this['accounts']['values']()){const b=this['persistStorage']['tryAcquirePollingLock'](a['address'],this['instanceId']);b?(this['pollingLockedAccounts']['add'](a['address']['toLowerCase']()),a['messenger']['setOnMessageCallback'](c=>{for(const d of this['messageListeners']){d(c);}})):console['debug']('Another\x20process\x20holds\x20polling\x20lock\x20for\x20'+a['address']);}!this['isWatching']&&this['startPolling'](),this['accountRefreshTimer']&&clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=setInterval(()=>{this['refresh_accounts']()['catch'](c=>{console['error']('Failed\x20to\x20refresh\x20accounts:',c);});},this['config']['watch_interval_ms']);}['stop'](){this['accountRefreshTimer']&&(clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=null);for(const a of this['pollingLockedAccounts']){this['persistStorage']['releasePollingLock'](a,this['instanceId']);}this['pollingLockedAccounts']['clear'](),this['stopPolling'](),this['clear_accounts']();}async['ensureAccountReady'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c?.['initialized'])return c;if(c?.['initializing']){await c['initializing'];const d=this['accounts']['get'](b);if(d?.['initialized'])return d;throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');}return this['initializeAccount'](b);}async['initializeAccount'](a){const b=a['toLowerCase']();if(this['accounts']['size']>=MAX_ACCOUNTS)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Maximum\x20'+MAX_ACCOUNTS+'\x20accounts\x20allowed');const c=this['doInitialize'](b),d={'address':b,'messenger':null,'initialized':![],'initializing':c,'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}};this['accounts']['set'](b,d);try{await c;const e=this['accounts']['get'](b);if(!e||!e['initialized'])throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');return e;}catch(f){this['accounts']['delete'](b);throw f;}}async['doInitialize'](a){const b=new Messenger(a,this['config']);try{await b['initialize']();}catch(d){throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Failed\x20to\x20initialize\x20account\x20'+a+':\x20'+(d instanceof Error?d['message']:String(d)));}await sleep(0x3e8);const c={'friends':[],'guards':[],'lastUpdatedAt':0x0};this['accounts']['set'](a,{'address':a,'messenger':b,'initialized':!![],'contactLists':c});if(this['isWatching']){const e=this['persistStorage']['tryAcquirePollingLock'](a,this['instanceId']);e&&(this['pollingLockedAccounts']['add'](a),b['setOnMessageCallback'](f=>{for(const g of this['messageListeners']){g(f);}}));}}async['add_account_internal'](a){await this['ensureAccountReady'](a);}['remove_account_internal'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(!c)return![];return c['initialized']&&c['messenger']&&c['messenger']['disconnect'](),this['persistStorage']['releasePollingLock'](b,this['instanceId']),this['pollingLockedAccounts']['delete'](b),this['accounts']['delete'](b);}['clear_accounts'](){this['stopPolling']();for(const a of this['accounts']['values']()){a['messenger']['disconnect']();}this['accounts']['clear']();}async['send'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['send_file'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendZipFile'](b,c,{'fileName':d?.['fileName'],'contentType':d?.['contentType'],'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['watch'](a){let b=[];if(a?.['account']!==undefined){const i=a['account']['toLowerCase'](),j=this['accounts']['get'](i);j?.['messenger']&&await j['messenger']['pullMessages']();const k=new MessageStorage(i);b=k['getAllMessages'](i);}else for(const l of this['accounts']['values']()){l['messenger']&&await l['messenger']['pullMessages']();const m=new MessageStorage(l['address']),n=m['getAllMessages'](l['address']);b['push'](...n);}if(a){const o=a['peerAddress']?await GetAccountOrMark_Address(a['peerAddress']):undefined;b=b['filter'](p=>{if(a?.['account']!==undefined){const r=a['account']['toLowerCase'](),s=p['fromAddress']['toLowerCase'](),t=p['toAddress']['toLowerCase']();if(s!==r&&t!==r)return![];}if(a['direction']&&p['direction']!==a['direction'])return![];if(a['status']&&p['status']!==a['status'])return![];if(a['msgType']!==undefined&&p['msgType']!==a['msgType'])return![];if(a['contentType'])switch(a['contentType']){case'text':if(p['msgType']!==MessageType['NORMAL_MESSAGE'])return![];break;case'zip':if(!p['zipMetadata'])return![];break;case'wts':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wts')return![];break;case'wip':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wip')return![];break;}if(a['peerAddress']&&o){const u=o['toLowerCase'](),v=p['fromAddress']['toLowerCase'](),w=p['toAddress']['toLowerCase']();if(v!==u&&w!==u)return![];}const q=a['timeField']||'createdAt';if(a['startTime']!==undefined||a['endTime']!==undefined){const x=p[q];if(x!==undefined){if(a['startTime']!==undefined&&x<a['startTime'])return![];if(a['endTime']!==undefined&&x>a['endTime'])return![];}}if(a['createdAtStart']!==undefined&&p['createdAt']<a['createdAtStart'])return![];if(a['createdAtEnd']!==undefined&&p['createdAt']>a['createdAtEnd'])return![];if(a['receivedAtStart']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']<a['receivedAtStart'])return![];}if(a['receivedAtEnd']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']>a['receivedAtEnd'])return![];}if(a['serverTimestampStart']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']<a['serverTimestampStart'])return![];}if(a['serverTimestampEnd']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']>a['serverTimestampEnd'])return![];}if(a['decryptedOnly']&&!p['plaintext'])return![];if(a['confirmedOnly']&&p['status']!==MessageStatus['CONFIRMED'])return![];if(a['arkConfirmedOnly']){if(!p['arkConfirmed'])return![];}if(a['proofedOnly']){if(!p['proof'])return![];}if(a['arkTimestampStart']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']<a['arkTimestampStart'])return![];}if(a['arkTimestampEnd']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']>a['arkTimestampEnd'])return![];}if(a['hasLastReceivedIndexOnly']){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']===null)return![];}if(a['lastReceivedIndexMin']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']<a['lastReceivedIndexMin'])return![];}if(a['lastReceivedIndexMax']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']>a['lastReceivedIndexMax'])return![];}if(a['keyword']&&p['plaintext']){if(!p['plaintext']['toLowerCase']()['includes'](a['keyword']['toLowerCase']()))return![];}if(a['listFilterMode']&&a['listFilterMode']!=='any'){const y=this['findAccount'](p['toAddress']);if(!y)return![];const z=p['fromAddress']['toLowerCase'](),A=y['contactLists'],B=new Set(A['friends']['map'](G=>G['toLowerCase']())),C=new Set(A['guards']['map'](G=>G['guardAddress']['toLowerCase']())),D=B['has'](z),E=C['has'](z),F=!D&&!E;switch(a['listFilterMode']){case'friends':if(!D)return![];break;case'guard':if(!E)return![];break;case'stranger':if(!F)return![];break;}if(a['customListFilter']){const {includeAddresses:G,excludeAddresses:H,relation:relation='union'}=a['customListFilter'];if(H){const I=new Set(H['map'](J=>J['toLowerCase']()));if(I['has'](z))return![];}if(G&&G['length']>0x0){const J=new Set(G['map'](L=>L['toLowerCase']())),K=J['has'](z);if(relation==='union'){const L=a['listFilterMode']==='friends'&&D||a['listFilterMode']==='guard'&&E||a['listFilterMode']==='stranger'&&F;if(!K&&!L)return![];}else{if(!K)return![];}}}}if(a['viewed']!==undefined){const M=p['viewedAt']!==undefined;if(a['viewed']!==M)return![];}if(a['viewedAtStart']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']<a['viewedAtStart'])return![];}if(a['viewedAtEnd']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']>a['viewedAtEnd'])return![];}return!![];});}const c=a?.['sortOrder']??'desc',d=a?.['timeField']||'createdAt';b['sort']((p,q)=>{const r=p[d]||0x0,s=q[d]||0x0;return c==='asc'?r-s:s-r;});const {MAX_QUERY_LIMIT:e}=await import('./types.js'),f=this['config']['defaultQueryLimit']??0x32,g=Math['min'](a?.['limit']??f,e),h=a?.['offset']??0x0;return b=b['slice'](h,h+g),b;}['startPolling'](){if(this['isWatching'])return;this['isWatching']=!![];}['stopPolling'](){this['isWatching']=![];}['onMessage'](a){this['messageListeners']['add'](a);}['offMessage'](a){this['messageListeners']['delete'](a);}['destroy'](){this['stop'](),this['messageListeners']['clear']();}async['syncContactLists'](a){const b=this['findAccount'](a);if(!b)return{'success':![],'friends':[],'guards':[],'error':'Account\x20not\x20found:\x20'+a};try{const [c,d]=await Promise['all']([b['messenger']['getFriendsList'](),b['messenger']['getGuardList']()]),e=d['currentGuardList']||[];return b['contactLists']={'friends':c,'guards':e,'lastUpdatedAt':Date['now']()},{'success':!![],'friends':c,'guards':e};}catch(f){return console['error']('Failed\x20to\x20sync\x20contact\x20lists\x20for\x20'+a+':',f),{'success':![],'friends':b['contactLists']['friends'],'guards':b['contactLists']['guards'],'error':f instanceof Error?f['message']:String(f)};}}async['syncAllContactLists'](){const a=new Map();for(const b of this['accounts']['values']()){const c=await this['syncContactLists'](b['address']);a['set'](b['address'],c);}return a;}['getContactLists'](a){const b=this['findAccount'](a);return b?.['contactLists'];}['setContactLists'](a,b){const c=this['findAccount'](a);if(!c)return![];return c['contactLists']={...c['contactLists'],...b,'lastUpdatedAt':Date['now']()},!![];}['isStranger'](a,b){const c=this['findAccount'](a);if(!c)return!![];const d=b['toLowerCase'](),e=c['contactLists'],f=e['friends']['some'](h=>h['toLowerCase']()===d),g=e['guards']['some'](h=>h['guardAddress']['toLowerCase']()===d);return!f&&!g;}['recordGuardSender'](a,b){const c=this['findAccount'](a);if(!c)return![];const d=b['toLowerCase'](),e=c['contactLists']['guards']['some'](f=>f['guardAddress']['toLowerCase']()===d);return!e&&(c['contactLists']['guards']['push']({'guardAddress':b,'passportValiditySeconds':0x15180}),c['contactLists']['lastUpdatedAt']=Date['now']()),!![];}['generateNonce'](){return Math['random']()['toString'](0x24)['substring'](0x2,0xf)+Math['random']()['toString'](0x24)['substring'](0x2,0xf);}async['watch_paginated'](a){const {MAX_QUERY_LIMIT:b}=await import('./types.js'),c=await this['watch'](a),d=c['length'],e=this['config']['defaultQueryLimit']??0x32,f=Math['min'](a?.['limit']??e,b),g=a?.['offset']??0x0,h=c['slice'](g,g+f);return{'messages':h,'total':d,'offset':g,'limit':f};}async['get_conversations'](a){const b=a?{'account':a}:undefined,c=await this['watch'](b),d=new Map();for(const e of c){const f=a?.['toLowerCase'](),g=e['fromAddress']['toLowerCase']()===f?e['toAddress']:e['fromAddress'];!d['has'](g)&&d['set'](g,{'peerAddress':g,'lastMessageAt':e['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':e['plaintext']});const h=d['get'](g);h['messageCount']++,e['createdAt']>h['lastMessageAt']&&(h['lastMessageAt']=e['createdAt'],h['lastMessagePreview']=e['plaintext']),e['status']!==MessageStatus['READ']&&e['toAddress']['toLowerCase']()===f&&h['unreadCount']++;}return Array['from'](d['values']())['sort']((i,j)=>j['lastMessageAt']-i['lastMessageAt']);}async['generate_wts'](a,b,c,d,e){const f=await import('fs'),g=await import('path'),h=b['toLowerCase'](),k=c['toLowerCase'](),l=new MessageStorage(h),m=l['getAllMessages'](h);let n=m['filter'](w=>{const x=w['fromAddress']['toLowerCase'](),y=w['toAddress']['toLowerCase'](),z=x===h&&y===k||x===k&&y===h;return z;});n=n['filter'](w=>w['leafIndex']!==undefined&&w['serverTimestamp']!==undefined)['reduce']((w,x)=>{const y=w['find'](z=>z['messageId']===x['messageId']);return!y&&w['push'](x),w;},[])['sort']((w,x)=>{const y=w['serverTimestamp']-x['serverTimestamp'];if(y!==0x0)return y;return w['leafIndex']-x['leafIndex'];});if(d)switch(d['type']){case'time':{const w=Math['min'](d['start'],d['end']),x=Math['max'](d['start'],d['end']);n=n['filter'](y=>y['createdAt']>=w&&y['createdAt']<=x);break;}case'messageId':{const y=d['start'],z=d['end'];n=n['filter'](A=>A['messageId']>=y&&A['messageId']<=z);break;}case'seqIndex':{const A=Math['min'](d['start'],d['end']),B=Math['max'](d['start'],d['end']);n=n['filter'](C=>C['leafIndex']>=A&&C['leafIndex']<=B);break;}}if(n['length']===0x0)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'No\x20messages\x20found\x20for\x20the\x20given\x20criteria');const o=n['map'](C=>C['leafIndex'])['filter'](C=>C!==undefined)['sort']((C,D)=>C-D),p=[];for(let C=0x1;C<o['length'];C++){const D=o[C-0x1]+0x1,E=o[C];if(E!==D)for(let F=D;F<E;F++){p['push'](F);}}p['length']>0x0&&console['warn']('[generate_wts]\x20Warning:\x20Missing\x20leafIndices\x20'+p['join'](',\x20')+'.\x20'+'WTS\x20will\x20contain\x20non-continuous\x20message\x20sequence.\x20'+'Verification\x20may\x20fail\x20if\x20strict\x20continuity\x20check\x20is\x20enabled.');if(n['length']>WTS_MAX_MESSAGE_COUNT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20count\x20('+n['length']+')\x20exceeds\x20maximum\x20allowed\x20('+WTS_MAX_MESSAGE_COUNT+')');!f['existsSync'](a)&&f['mkdirSync'](a,{'recursive':!![]});const q=h['slice'](0x0,0x6)+'_'+k['slice'](0x0,0x6),r=[];let s=[];for(let G=0x0;G<n['length'];G++){const H=n[G];if(s['length']===0x0)s['push'](H);else{const I=s[s['length']-0x1],J=I['leafIndex']+0x1;s['length']>=WTS_MAX_MESSAGE_COUNT||H['leafIndex']!==J?(r['push'](s),s=[H]):s['push'](H);}}s['length']>0x0&&r['push'](s);console['log']('[generate_wts]\x20Grouped\x20'+n['length']+'\x20messages\x20into\x20'+r['length']+'\x20continuous\x20group(s)'),r['forEach']((K,L)=>{const M=K['map'](N=>N['leafIndex'])['join'](',\x20');console['log']('\x20\x20Group\x20'+(L+0x1)+':\x20leafIndices\x20['+M+']');});const t=[];for(const K of r){const L=K['map'](a2=>a2['leafIndex'])['filter'](a2=>a2!==undefined),M=Math['min'](...L),N=Math['max'](...L),O=K[0x0]['createdAt'],P=K[K['length']-0x1]['createdAt'];for(const a2 of K){if(a2['serverTimestamp']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20serverTimestamp');if(a2['leafIndex']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20leafIndex');if(!a2['prevRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20prevRoot');if(!a2['newRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20newRoot');if(!a2['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20serverSignature');}const Q=K['map'](a3=>{const a4={'id':a3['messageId'],'from':a3['fromAddress'],'to':a3['toAddress'],'plaintextHash':a3['plaintextHash'],'clientTimestamp':a3['createdAt'],'timestamp':a3['serverTimestamp'],'leafIndex':a3['leafIndex'],'prevRoot':a3['prevRoot'],'merkleRoot':a3['newRoot'],'serverSignature':a3['serverSignature'],'serverPublicKey':a3['serverPublicKey']||'','msgType':a3['msgType']};return!e&&a3['plaintext']!==undefined&&(a4['plaintext']=a3['plaintext']),a3['guardAddress']!==undefined&&(a4['guardAddress']=a3['guardAddress']),a3['passportAddress']!==undefined&&(a4['passportAddress']=a3['passportAddress']),a3['arkConfirmed']!==undefined&&(a4['arkConfirmed']={'recipient':a3['arkConfirmed']['recipient'],'recipientPublicKey':a3['arkConfirmed']['recipientPublicKey'],'signature':a3['arkConfirmed']['signature'],'timestamp':a3['arkConfirmed']['timestamp']}),a3['zipMetadata']!==undefined&&(a4['zipMetadata']=a3['zipMetadata']),a3['lastReceivedLeafIndex']!==undefined&&a3['lastReceivedLeafIndex']!==-0x1&&(a4['lastReceivedLeafIndex']=a3['lastReceivedLeafIndex']),a4;}),R=[h,k]['sort'](),S={'participants':R},T={'session':S,'messages':Q},{sha256:U}=await import('@noble/hashes/sha256'),{bytesToHex:V}=await import('@noble/hashes/utils'),W=canonicalizeJson(T),X='sha256:'+V(U(new TextEncoder()['encode'](W))),Y={'type':'wts','version':'1.0','created':new Date()['toISOString'](),'hash':X,'algorithm':'sha256','startTime':O,'endTime':P,'messageCount':Q['length'],'merkleRoot':Q[Q['length']-0x1]['merkleRoot'],'creator':h,'participant':k},Z={'wts':WTS_SCHEMA_URL,'payload':T,'meta':Y},a0=q+'_'+M+'-'+N+'.wts',a1=g['join'](a,a0);f['writeFileSync'](a1,JSON['stringify'](Z,null,0x2)),t['push'](a1);}const u=n[0x0]?.['createdAt']||0x0,v=n[n['length']-0x1]?.['createdAt']||0x0;return{'files':t,'totalMessageCount':n['length'],'timeRange':{'start':u,'end':v}};}async['addToBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToBlacklist'](b);}async['removeFromBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromBlacklist'](b);}async['clearBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearBlacklist']();}async['getBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getBlacklist']();}async['existInBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInBlacklist'](b);}async['addToFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToFriendsList'](b);}async['removeFromFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromFriendsList'](b);}async['clearFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearFriendsList']();}async['getFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getFriendsList']();}async['existInFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInFriendsList'](b);}async['addToGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToGuardList'](b);}async['removeFromGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromGuardList'](b);}async['getGuardList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getGuardList']();}async['getSettings'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getSettings']();}async['setSettings'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['setSettings'](b);}}
|
|
1
|
+
import{Messenger}from'./messenger.js';import{MessageStorage}from'./storage.js';import{MessengerPersistStorage}from'./storage.js';import{MessageType,MessageStatus,WTS_MAX_MESSAGE_COUNT,WTS_SCHEMA_URL}from'./types.js';import{MessengerError,MessengerErrorCode,DEFAULT_MESSENGER_CONFIG}from'./types.js';import{canonicalizeJson}from'./utils.js';import{MAX_MESSENGER_ACCOUNTS}from'../local/account.js';import{GetAccountOrMark_Address}from'../local/index.js';const MAX_ACCOUNTS=MAX_MESSENGER_ACCOUNTS,sleep=a=>new Promise(b=>setTimeout(b,a));export class MessengerManager{['accounts']=new Map();['config'];['messageListeners']=new Set();['isWatching']=![];['persistStorage'];['instanceId'];['accountRefreshTimer']=null;['pollingLockedAccounts']=new Set();constructor(a){this['config']={...DEFAULT_MESSENGER_CONFIG,...a?.['messengerConfig']},this['instanceId']=a?.['instanceId']||'default',this['persistStorage']=new MessengerPersistStorage();}['findAccount'](a){return this['accounts']['get'](a['toLowerCase']());}['getConfig'](){return this['config'];}['get_accounts'](){return Array['from'](this['accounts']['values']())['map'](a=>a['address']);}async['refresh_accounts'](){const {Account:a}=await import('../local/account.js'),b=await a['Instance']()['list_messenger_accounts'](),c=new Set(this['accounts']['keys']()),d=new Set(b['map'](e=>e['address']['toLowerCase']()));for(const e of c){!d['has'](e)&&this['remove_account_internal'](e);}for(const f of b){const g=f['address']['toLowerCase']();if(!this['accounts']['has'](g))try{await this['add_account_internal'](f['address']);}catch(h){}}if(this['accounts']['size']>0x0&&!this['isWatching'])this['startPolling']();else this['accounts']['size']===0x0&&this['isWatching']&&this['stopPolling']();await this['syncAllContactLists']();}async['start'](){await this['refresh_accounts']();for(const a of this['accounts']['values']()){const b=this['persistStorage']['tryAcquirePollingLock'](a['address'],this['instanceId']);if(b)this['pollingLockedAccounts']['add'](a['address']['toLowerCase']()),a['messenger']['setOnMessageCallback'](c=>{for(const d of this['messageListeners']){d(c);}});else{}}!this['isWatching']&&this['startPolling'](),this['accountRefreshTimer']&&clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=setInterval(()=>{this['refresh_accounts']()['catch'](c=>{});},this['config']['watch_interval_ms']);}['stop'](){this['accountRefreshTimer']&&(clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=null);for(const a of this['pollingLockedAccounts']){this['persistStorage']['releasePollingLock'](a,this['instanceId']);}this['pollingLockedAccounts']['clear'](),this['stopPolling'](),this['clear_accounts']();}async['ensureAccountReady'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c?.['initialized'])return c;if(c?.['initializing']){await c['initializing'];const d=this['accounts']['get'](b);if(d?.['initialized'])return d;throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');}return this['initializeAccount'](b);}async['initializeAccount'](a){const b=a['toLowerCase']();if(this['accounts']['size']>=MAX_ACCOUNTS)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Maximum\x20'+MAX_ACCOUNTS+'\x20accounts\x20allowed');const c=this['doInitialize'](b),d={'address':b,'messenger':null,'initialized':![],'initializing':c,'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}};this['accounts']['set'](b,d);try{await c;const e=this['accounts']['get'](b);if(!e||!e['initialized'])throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Account\x20'+a+'\x20initialization\x20failed');return e;}catch(f){this['accounts']['delete'](b);throw f;}}async['doInitialize'](a){const b=new Messenger(a,this['config']);try{await b['initialize']();}catch(d){throw new MessengerError(MessengerErrorCode['SERVER_ERROR'],'Failed\x20to\x20initialize\x20account\x20'+a+':\x20'+(d instanceof Error?d['message']:String(d)));}await sleep(0x3e8);const c={'friends':[],'guards':[],'lastUpdatedAt':0x0};this['accounts']['set'](a,{'address':a,'messenger':b,'initialized':!![],'contactLists':c});if(this['isWatching']){const e=this['persistStorage']['tryAcquirePollingLock'](a,this['instanceId']);e&&(this['pollingLockedAccounts']['add'](a),b['setOnMessageCallback'](f=>{for(const g of this['messageListeners']){g(f);}}));}}async['add_account_internal'](a){await this['ensureAccountReady'](a);}['remove_account_internal'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(!c)return![];return c['initialized']&&c['messenger']&&c['messenger']['disconnect'](),this['persistStorage']['releasePollingLock'](b,this['instanceId']),this['pollingLockedAccounts']['delete'](b),this['accounts']['delete'](b);}['clear_accounts'](){this['stopPolling']();for(const a of this['accounts']['values']()){a['messenger']&&a['messenger']['disconnect']();}this['accounts']['clear']();}async['send'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['send_file'](a,b,c,d){const {Account:e}=await import('../local/account.js'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20'+a+'\x20not\x20found');if(f['m']==null){if(d?.['new_messenger_name']==null)throw new MessengerError(MessengerErrorCode['ACCOUNT_MESSENGER_NOT_ENABLED'],'Account\x20messenger\x20name\x20not\x20set.\x20Use\x20new_messenger_name\x20parameter\x20to\x20set\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}const g=await this['ensureAccountReady'](a);if(d?.['new_messenger_name']!=null){const h=await e['Instance']()['get'](a,![]);h&&h['m']!==d['new_messenger_name']&&await e['Instance']()['set_messenger'](a,d['new_messenger_name']);}return g['messenger']['sendZipFile'](b,c,{'fileName':d?.['fileName'],'contentType':d?.['contentType'],'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force']});}async['watch'](a){let b=[];if(a?.['account']!==undefined){const i=a['account']['toLowerCase'](),j=this['accounts']['get'](i);j?.['messenger']&&await j['messenger']['pullMessages']();const k=new MessageStorage(i);b=k['getAllMessages'](i);}else for(const l of this['accounts']['values']()){l['messenger']&&await l['messenger']['pullMessages']();const m=new MessageStorage(l['address']),n=m['getAllMessages'](l['address']);b['push'](...n);}if(a){const o=a['peerAddress']?await GetAccountOrMark_Address(a['peerAddress']):undefined;b=b['filter'](p=>{if(a?.['account']!==undefined){const r=a['account']['toLowerCase'](),s=p['fromAddress']['toLowerCase'](),t=p['toAddress']['toLowerCase']();if(s!==r&&t!==r)return![];}if(a['direction']&&p['direction']!==a['direction'])return![];if(a['status']&&p['status']!==a['status'])return![];if(a['msgType']!==undefined&&p['msgType']!==a['msgType'])return![];if(a['contentType'])switch(a['contentType']){case'text':if(p['msgType']!==MessageType['NORMAL_MESSAGE'])return![];break;case'zip':if(!p['zipMetadata'])return![];break;case'wts':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wts')return![];break;case'wip':if(!p['zipMetadata']||p['zipMetadata']?.['contentType']!=='wip')return![];break;}if(a['peerAddress']&&o){const u=o['toLowerCase'](),v=p['fromAddress']['toLowerCase'](),w=p['toAddress']['toLowerCase']();if(v!==u&&w!==u)return![];}const q=a['timeField']||'createdAt';if(a['startTime']!==undefined||a['endTime']!==undefined){const x=p[q];if(x!==undefined){if(a['startTime']!==undefined&&x<a['startTime'])return![];if(a['endTime']!==undefined&&x>a['endTime'])return![];}}if(a['createdAtStart']!==undefined&&p['createdAt']<a['createdAtStart'])return![];if(a['createdAtEnd']!==undefined&&p['createdAt']>a['createdAtEnd'])return![];if(a['receivedAtStart']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']<a['receivedAtStart'])return![];}if(a['receivedAtEnd']!==undefined){if(p['receivedAt']===undefined||p['receivedAt']>a['receivedAtEnd'])return![];}if(a['serverTimestampStart']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']<a['serverTimestampStart'])return![];}if(a['serverTimestampEnd']!==undefined){if(p['serverTimestamp']===undefined||p['serverTimestamp']>a['serverTimestampEnd'])return![];}if(a['decryptedOnly']&&!p['plaintext'])return![];if(a['confirmedOnly']&&p['status']!==MessageStatus['CONFIRMED'])return![];if(a['arkConfirmedOnly']){if(!p['arkConfirmed'])return![];}if(a['proofedOnly']){if(!p['proof'])return![];}if(a['arkTimestampStart']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']<a['arkTimestampStart'])return![];}if(a['arkTimestampEnd']!==undefined){if(p['arkConfirmed']===undefined||p['arkConfirmed']['timestamp']>a['arkTimestampEnd'])return![];}if(a['hasLastReceivedIndexOnly']){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']===null)return![];}if(a['lastReceivedIndexMin']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']<a['lastReceivedIndexMin'])return![];}if(a['lastReceivedIndexMax']!==undefined){if(p['lastReceivedLeafIndex']===undefined||p['lastReceivedLeafIndex']>a['lastReceivedIndexMax'])return![];}if(a['keyword']&&p['plaintext']){if(!p['plaintext']['toLowerCase']()['includes'](a['keyword']['toLowerCase']()))return![];}if(a['listFilterMode']&&a['listFilterMode']!=='any'){const y=this['findAccount'](p['toAddress']);if(!y)return![];const z=p['fromAddress']['toLowerCase'](),A=y['contactLists'],B=new Set(A['friends']['map'](G=>G['toLowerCase']())),C=new Set(A['guards']['map'](G=>G['guardAddress']['toLowerCase']())),D=B['has'](z),E=C['has'](z),F=!D&&!E;switch(a['listFilterMode']){case'friends':if(!D)return![];break;case'guard':if(!E)return![];break;case'stranger':if(!F)return![];break;}if(a['customListFilter']){const {includeAddresses:G,excludeAddresses:H,relation:relation='union'}=a['customListFilter'];if(H){const I=new Set(H['map'](J=>J['toLowerCase']()));if(I['has'](z))return![];}if(G&&G['length']>0x0){const J=new Set(G['map'](L=>L['toLowerCase']())),K=J['has'](z);if(relation==='union'){const L=a['listFilterMode']==='friends'&&D||a['listFilterMode']==='guard'&&E||a['listFilterMode']==='stranger'&&F;if(!K&&!L)return![];}else{if(!K)return![];}}}}if(a['viewed']!==undefined){const M=p['viewedAt']!==undefined;if(a['viewed']!==M)return![];}if(a['viewedAtStart']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']<a['viewedAtStart'])return![];}if(a['viewedAtEnd']!==undefined){if(p['viewedAt']===undefined||p['viewedAt']>a['viewedAtEnd'])return![];}return!![];});}const c=a?.['sortOrder']??'desc',d=a?.['timeField']||'createdAt';b['sort']((p,q)=>{const r=p[d]||0x0,s=q[d]||0x0;return c==='asc'?r-s:s-r;});const {MAX_QUERY_LIMIT:e}=await import('./types.js'),f=this['config']['defaultQueryLimit']??0x32,g=Math['min'](a?.['limit']??f,e),h=a?.['offset']??0x0;return b=b['slice'](h,h+g),b;}['startPolling'](){if(this['isWatching'])return;this['isWatching']=!![];}['stopPolling'](){this['isWatching']=![];}['onMessage'](a){this['messageListeners']['add'](a);}['offMessage'](a){this['messageListeners']['delete'](a);}['destroy'](){this['stop'](),this['messageListeners']['clear']();}async['syncContactLists'](a){const b=this['findAccount'](a);if(!b)return{'success':![],'friends':[],'guards':[],'error':'Account\x20not\x20found:\x20'+a};try{const [c,d]=await Promise['all']([b['messenger']['getFriendsList'](),b['messenger']['getGuardList']()]),e=d['currentGuardList']||[];return b['contactLists']={'friends':c,'guards':e,'lastUpdatedAt':Date['now']()},{'success':!![],'friends':c,'guards':e};}catch(f){return{'success':![],'friends':b['contactLists']['friends'],'guards':b['contactLists']['guards'],'error':f instanceof Error?f['message']:String(f)};}}async['syncAllContactLists'](){const a=new Map();for(const b of this['accounts']['values']()){const c=await this['syncContactLists'](b['address']);a['set'](b['address'],c);}return a;}['getContactLists'](a){const b=this['findAccount'](a);return b?.['contactLists'];}['setContactLists'](a,b){const c=this['findAccount'](a);if(!c)return![];return c['contactLists']={...c['contactLists'],...b,'lastUpdatedAt':Date['now']()},!![];}['isStranger'](a,b){const c=this['findAccount'](a);if(!c)return!![];const d=b['toLowerCase'](),e=c['contactLists'],f=e['friends']['some'](h=>h['toLowerCase']()===d),g=e['guards']['some'](h=>h['guardAddress']['toLowerCase']()===d);return!f&&!g;}['recordGuardSender'](a,b){const c=this['findAccount'](a);if(!c)return![];const d=b['toLowerCase'](),e=c['contactLists']['guards']['some'](f=>f['guardAddress']['toLowerCase']()===d);return!e&&(c['contactLists']['guards']['push']({'guardAddress':b,'passportValiditySeconds':0x15180}),c['contactLists']['lastUpdatedAt']=Date['now']()),!![];}['generateNonce'](){return Math['random']()['toString'](0x24)['substring'](0x2,0xf)+Math['random']()['toString'](0x24)['substring'](0x2,0xf);}async['watch_paginated'](a){const {MAX_QUERY_LIMIT:b}=await import('./types.js'),c=await this['watch'](a),d=c['length'],e=this['config']['defaultQueryLimit']??0x32,f=Math['min'](a?.['limit']??e,b),g=a?.['offset']??0x0,h=c['slice'](g,g+f);return{'messages':h,'total':d,'offset':g,'limit':f};}async['get_conversations'](a){const b=a?{'account':a}:undefined,c=await this['watch'](b),d=new Map();for(const e of c){const f=a?.['toLowerCase'](),g=e['fromAddress']['toLowerCase']()===f?e['toAddress']:e['fromAddress'];!d['has'](g)&&d['set'](g,{'peerAddress':g,'lastMessageAt':e['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':e['plaintext']});const h=d['get'](g);h['messageCount']++,e['createdAt']>h['lastMessageAt']&&(h['lastMessageAt']=e['createdAt'],h['lastMessagePreview']=e['plaintext']),e['status']!==MessageStatus['READ']&&e['toAddress']['toLowerCase']()===f&&h['unreadCount']++;}return Array['from'](d['values']())['sort']((i,j)=>j['lastMessageAt']-i['lastMessageAt']);}async['generate_wts'](a,b,c,d,e){const f=await import('fs'),g=await import('path'),h=b['toLowerCase'](),k=c['toLowerCase'](),l=new MessageStorage(h),m=l['getAllMessages'](h);let n=m['filter'](w=>{const x=w['fromAddress']['toLowerCase'](),y=w['toAddress']['toLowerCase'](),z=x===h&&y===k||x===k&&y===h;return z;});n=n['filter'](w=>w['leafIndex']!==undefined&&w['serverTimestamp']!==undefined)['reduce']((w,x)=>{const y=w['find'](z=>z['messageId']===x['messageId']);return!y&&w['push'](x),w;},[])['sort']((w,x)=>{const y=w['serverTimestamp']-x['serverTimestamp'];if(y!==0x0)return y;return w['leafIndex']-x['leafIndex'];});if(d)switch(d['type']){case'time':{const w=Math['min'](d['start'],d['end']),x=Math['max'](d['start'],d['end']);n=n['filter'](y=>y['createdAt']>=w&&y['createdAt']<=x);break;}case'messageId':{const y=d['start'],z=d['end'];n=n['filter'](A=>A['messageId']>=y&&A['messageId']<=z);break;}case'seqIndex':{const A=Math['min'](d['start'],d['end']),B=Math['max'](d['start'],d['end']);n=n['filter'](C=>C['leafIndex']>=A&&C['leafIndex']<=B);break;}}if(n['length']===0x0)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'No\x20messages\x20found\x20for\x20the\x20given\x20criteria');const o=n['map'](C=>C['leafIndex'])['filter'](C=>C!==undefined)['sort']((C,D)=>C-D),p=[];for(let C=0x1;C<o['length'];C++){const D=o[C-0x1]+0x1,E=o[C];if(E!==D)for(let F=D;F<E;F++){p['push'](F);}}if(p['length']>0x0){}if(n['length']>WTS_MAX_MESSAGE_COUNT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20count\x20('+n['length']+')\x20exceeds\x20maximum\x20allowed\x20('+WTS_MAX_MESSAGE_COUNT+')');!f['existsSync'](a)&&f['mkdirSync'](a,{'recursive':!![]});const q=h['slice'](0x0,0x6)+'_'+k['slice'](0x0,0x6),r=[];let s=[];for(let G=0x0;G<n['length'];G++){const H=n[G];if(s['length']===0x0)s['push'](H);else{const I=s[s['length']-0x1],J=I['leafIndex']+0x1;s['length']>=WTS_MAX_MESSAGE_COUNT||H['leafIndex']!==J?(r['push'](s),s=[H]):s['push'](H);}}s['length']>0x0&&r['push'](s);r['forEach']((K,L)=>{const M=K['map'](N=>N['leafIndex'])['join'](',\x20');});const t=[];for(const K of r){const L=K['map'](a2=>a2['leafIndex'])['filter'](a2=>a2!==undefined),M=Math['min'](...L),N=Math['max'](...L),O=K[0x0]['createdAt'],P=K[K['length']-0x1]['createdAt'];for(const a2 of K){if(a2['serverTimestamp']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20serverTimestamp');if(a2['leafIndex']===undefined)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20leafIndex');if(!a2['prevRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20prevRoot');if(!a2['newRoot'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20newRoot');if(!a2['serverSignature'])throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20'+a2['messageId']+'\x20missing\x20serverSignature');}const Q=K['map'](a3=>{const a4={'id':a3['messageId'],'from':a3['fromAddress'],'to':a3['toAddress'],'plaintextHash':a3['plaintextHash'],'clientTimestamp':a3['createdAt'],'timestamp':a3['serverTimestamp'],'leafIndex':a3['leafIndex'],'prevRoot':a3['prevRoot'],'merkleRoot':a3['newRoot'],'serverSignature':a3['serverSignature'],'serverPublicKey':a3['serverPublicKey']||'','msgType':a3['msgType']};return!e&&a3['plaintext']!==undefined&&(a4['plaintext']=a3['plaintext']),a3['guardAddress']!==undefined&&(a4['guardAddress']=a3['guardAddress']),a3['passportAddress']!==undefined&&(a4['passportAddress']=a3['passportAddress']),a3['arkConfirmed']!==undefined&&(a4['arkConfirmed']={'recipient':a3['arkConfirmed']['recipient'],'recipientPublicKey':a3['arkConfirmed']['recipientPublicKey'],'signature':a3['arkConfirmed']['signature'],'timestamp':a3['arkConfirmed']['timestamp']}),a3['zipMetadata']!==undefined&&(a4['zipMetadata']=a3['zipMetadata']),a3['lastReceivedLeafIndex']!==undefined&&a3['lastReceivedLeafIndex']!==-0x1&&(a4['lastReceivedLeafIndex']=a3['lastReceivedLeafIndex']),a4;}),R=[h,k]['sort'](),S={'participants':R},T={'session':S,'messages':Q},{sha256:U}=await import('@noble/hashes/sha256'),{bytesToHex:V}=await import('@noble/hashes/utils'),W=canonicalizeJson(T),X='sha256:'+V(U(new TextEncoder()['encode'](W))),Y={'type':'wts','version':'1.0','created':new Date()['toISOString'](),'hash':X,'algorithm':'sha256','startTime':O,'endTime':P,'messageCount':Q['length'],'merkleRoot':Q[Q['length']-0x1]['merkleRoot'],'creator':h,'participant':k},Z={'wts':WTS_SCHEMA_URL,'payload':T,'meta':Y},a0=q+'_'+M+'-'+N+'.wts',a1=g['join'](a,a0);f['writeFileSync'](a1,JSON['stringify'](Z,null,0x2)),t['push'](a1);}const u=n[0x0]?.['createdAt']||0x0,v=n[n['length']-0x1]?.['createdAt']||0x0;return{'files':t,'totalMessageCount':n['length'],'timeRange':{'start':u,'end':v}};}async['addToBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToBlacklist'](b);}async['removeFromBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromBlacklist'](b);}async['clearBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearBlacklist']();}async['getBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getBlacklist']();}async['existInBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInBlacklist'](b);}async['addToFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToFriendsList'](b);}async['removeFromFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromFriendsList'](b);}async['clearFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearFriendsList']();}async['getFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getFriendsList']();}async['existInFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInFriendsList'](b);}async['addToGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToGuardList'](b);}async['removeFromGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromGuardList'](b);}async['getGuardList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getGuardList']();}async['getSettings'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getSettings']();}async['setSettings'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError(MessengerErrorCode['ACCOUNT_NOT_FOUND'],'Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['setSettings'](b);}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash}from'crypto';import*as a183a from'fs';import*as a183b from'path';import{MessengerSession,DecryptionEngine}from'./session.js';import{MessengerServerClient}from'./server.js';import{MessageStorage,SessionStateStorage}from'./storage.js';import{hashPlaintext,verifyMessage,bytesToBase64}from'./crypto.js';import{canonicalizeJson}from'./utils.js';import{DEFAULT_MESSENGER_CONFIG,MessengerError,MessengerErrorCode,MessageDirection,MessageStatus,WTS_FILE_BYTES_LIMIT,NORMAL_MESSAGE_BYTES_LIMIT,CHAIN_PROOF_TYPE}from'./types.js';import{isValidWowAddress}from'../../utils/sui-types.js';async function getAccount(){const {Account:a}=await import('../local/account.js');return a['Instance']();}export class Messenger{['session'];['serverClient'];['config'];['userAddress']=null;['onMessageCallback']=null;['pollingTimer']=null;['messageConsecutiveEmptyPulls']=0x0;['prekeyConsecutiveOkCount']=0x0;['currentMessageInterval'];['isPollingRunning']=![];['messageStorage'];['sessionStateStorage'];['decryptionEngine'];['waitingMessages']=new Map();['failedMessages']=new Map();['waitingMessageRetries']=new Map();constructor(a,b){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']),this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8;}['getUserAddress'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');return this['userAddress'];}async['getPublicKey'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await(await getAccount())['get'](this['userAddress'],![]);return a?.['pubkey']||'';}['isValidGuardMessage'](a,b){return Boolean(a&&b&&isValidWowAddress(a)&&isValidWowAddress(b));}async['generateSignatureParams'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=await(await getAccount())['get'](this['userAddress'],![]);if(!b?.['secret'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20not\x20found\x20or\x20no\x20secret\x20key\x20for\x20'+this['userAddress']);const {Ed25519Keypair:c}=await import('../../keypairs/ed25519/index.js'),d=c['fromSecretKey'](b['secret']),e=d['getPublicKey'](),f=e['toWPublicKey'](),g=Date['now'](),h=this['generateNonce'](),i=a+':'+f+':'+g+':'+h,j=await d['sign'](new TextEncoder()['encode'](i));return{'signatureScheme':'ED25519','signature':Buffer['from'](j)['toString']('base64'),'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['initialize'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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']),await this['checkAndRefillPrekeys'](),this['startPollingTimer']();}async['checkAndRefillPrekeys'](){if(!this['userAddress'])return;await this['session']['ensurePreKeys'](this['userAddress'],![]);}['startPollingTimer'](){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;const a=this['getNextPollInterval']();this['pollingTimer']=setTimeout(()=>{this['poll']()['catch'](b=>{console['error']('[Polling]\x20Error\x20during\x20poll:',b);})['finally'](()=>{this['scheduleNextPoll']();});},a);}['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']();a['messages']['length']>0x0?(this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['onMessageCallback']&&this['onMessageCallback'](a['messages'])):(this['messageConsecutiveEmptyPulls']++,this['messageConsecutiveEmptyPulls']>=(this['config']['message_poll_consecutive_empty_limit']??0x3)&&(this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8,this['messageConsecutiveEmptyPulls']=0x0));if(a['prekey_status']){const b=a['prekey_status'];b['shouldRefill']?(this['prekeyConsecutiveOkCount']=0x0,await this['checkAndRefillPrekeys']()):(this['prekeyConsecutiveOkCount']++,this['prekeyConsecutiveOkCount']>=(this['config']['prekey_poll_consecutive_ok_limit']??0x3)&&(this['prekeyConsecutiveOkCount']=0x0));}}catch(c){console['error']('[Polling]\x20Poll\x20error:',c);}}['triggerFastPoll'](){this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['messageConsecutiveEmptyPulls']=0x0,this['isPollingRunning']&&(this['pollingTimer']&&clearTimeout(this['pollingTimer']),this['scheduleNextPoll']());}async['sendMessage'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=Date['now'](),e=Date['now'](),f=this['generateNonce'](),g=new TextEncoder()['encode'](b)['length'];if(g>NORMAL_MESSAGE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20size\x20('+g+'\x20bytes)\x20exceeds\x20maximum\x20allowed\x20size\x20('+NORMAL_MESSAGE_BYTES_LIMIT+'\x20bytes).\x20Consider\x20using\x20sendZipFile\x20for\x20large\x20content.');await this['pullMessages']();const h=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),i=await this['session']['encryptMessage'](this['userAddress'],a,b),j=Buffer['from'](new Uint8Array(i['body']))['toString']('base64'),k=hashPlaintext(b,d,c?.['guardAddress'],c?.['passportAddress'],h),l=await(await getAccount())['get'](this['userAddress'],![]);if(!l)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const m=l['pubkey'],n=c?.['guardAddress']||'',o=c?.['passportAddress']||'',p=h>=0x0?h['toString']():'',q=c?.['force']?'true':'false',r='send_message:'+this['userAddress']+':'+a+':'+n+':'+o+':'+k+':'+p+':'+m+':'+e+':'+f+':'+q,s=await(await getAccount())['signData'](this['userAddress'],r),t=Buffer['from'](s['signature']['slice'](0x2),'hex'),u=bytesToBase64(new Uint8Array(t)),v=await this['serverClient']['sendMessage']({'sender':s['publicKey'],'recipient':a,'ciphertext':j,'plaintextHash':k,'clientTimestamp':d,'msgType':i['type'],'signatureScheme':'ED25519','signature':u,'timestamp':e,'nonce':f,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':h>=0x0?h:undefined}),w={'messageId':v['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':k,'plaintext':b,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':h,'direction':MessageDirection['SENT'],'status':v['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':i['type'],'createdAt':d};v['merkleData']&&(w['leafIndex']=v['merkleData']['leafIndex'],w['prevRoot']=v['merkleData']['prevRoot'],w['newRoot']=v['merkleData']['newRoot'],w['serverSignature']=v['merkleData']['serverSignature'],w['serverTimestamp']=v['merkleData']['serverTimestamp'],w['serverPublicKey']=v['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':v['merkleData']['newRoot'],'prevRoot':v['merkleData']['prevRoot'],'lastLeafIndex':v['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](w);if(v['pendingMerkleData'])for(const [x,y]of Object['entries'](v['pendingMerkleData'])){const z=this['messageStorage']['getMessage'](x);z&&z['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](x,MessageStatus['CONFIRMED'],{'leafIndex':y['leafIndex'],'newRoot':y['newRoot'],'serverSignature':y['serverSignature'],'serverTimestamp':y['serverTimestamp'],'serverPublicKey':y['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':v['messageId'],'status':w['status'],'merkleData':v['merkleData'],'guardList':v['guard_list'],'lastReceivedLeafIndex':h>=0x0?h:undefined};}async['pullMessages'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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'],![]),f=e?.['pubkey']||'',g=await(await getAccount())['signData'](this['userAddress'],d),h=Buffer['from'](g['signature']['slice'](0x2),'hex'),i={'signatureScheme':'ED25519','signature':bytesToBase64(h),'timestamp':b,'nonce':c},j=await this['serverClient']['pullMessages'](this['userAddress'],f,i,a);if(j['messages']['length']===0x0)return{'messages':[],'prekey_status':j['prekey_status']};const k=[],l=[],m=[...j['messages']]['sort'](function(n,o){return(n['clientTimestamp']||0x0)-(o['clientTimestamp']||0x0);});await this['processWaitingMessages'](k,l);for(const n of m){if(this['waitingMessages']['has'](n['id'])){l['push'](n['id']);continue;}if(this['failedMessages']['has'](n['id'])){l['push'](n['id']);continue;}const o=this['messageStorage']['getMessage'](n['id']);if(o){l['push'](n['id']);continue;}const p=await this['tryDecryptMessage'](n);if(p['success']&&p['message']&&p['decryptedData'])this['messageStorage']['saveMessage'](p['message']),k['push'](p['decryptedData']),l['push'](n['id']),this['waitingMessages']['delete'](n['id']);else p['shouldRetry']?(console['warn']('[Messenger]\x20消息\x20'+n['id']+'\x20解密失败,加入等待池:\x20'+p['error']),this['waitingMessages']['set'](n['id'],n)):(console['error']('[Messenger]\x20消息\x20'+n['id']+'\x20解密永久失败:\x20'+p['error']),this['failedMessages']['set'](n['id'],{'message':n,'error':p['error']||'Unknown\x20error'}),await this['saveFailedMessage'](n,p['error']||'Unknown\x20error'),l['push'](n['id']));}this['waitingMessages']['size']>0x0&&this['isPollingRunning']&&this['reschedulePolling']();if(l['length']>0x0&&this['userAddress']){const q=Date['now'](),r=this['generateNonce'](),s=await(await getAccount())['get'](this['userAddress'],![]);if(s?.['pubkey']){const t='ack_messages:'+this['userAddress']+':'+l['join'](',')+':'+s['pubkey']+':'+q+':'+r,u=await(await getAccount())['signData'](this['userAddress'],t),v=Buffer['from'](u['signature']['slice'](0x2),'hex'),w=bytesToBase64(new Uint8Array(v));await this['serverClient']['acknowledgeMessages'](l,u['publicKey'],{'publicKey':u['publicKey'],'signatureScheme':'ED25519','signature':w,'timestamp':q,'nonce':r});}}return{'messages':k,'prekey_status':j['prekey_status']};}['getLastSentLeafIndex'](a){if(!this['userAddress'])return-0x1;const b=this['messageStorage']['getMessagesBySession'](this['userAddress'],a),c=b['filter'](d=>d['direction']===MessageDirection['SENT']&&d['leafIndex']!==undefined);if(c['length']===0x0)return-0x1;return Math['max'](...c['map'](d=>d['leafIndex']));}['getSessionMessages'](a){if(!this['userAddress'])return[];return this['messageStorage']['getMessagesBySession'](this['userAddress'],a);}['getSessionState'](a){if(!this['userAddress'])return undefined;return this['sessionStateStorage']['getSessionState'](this['userAddress'],a);}async['submitChainProof'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=this['sessionStateStorage']['getSessionState'](this['userAddress'],b);if(!d||!d['currentRoot'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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('../call/proof.js'),k=new j({'proof':JSON['stringify'](i),'server_pubkey':g,'server_signature':h,'proof_type':CHAIN_PROOF_TYPE,'description':c||'Messenger\x20session\x20proof\x20for\x20'+this['userAddress']+'\x20<->\x20'+b,'item_count':d['messageCount'],'about_address':d['sessionId']}),l=await k['call'](a),m=l?.['objectChanges'],n=m?.['find'](o=>o['objectType']?.['includes']('Proof'))?.['objectId'];return{'proofAddress':n||'','txHash':l?.['digest']||''};}['destroy'](){this['stopPollingTimer']();}['disconnect'](){this['destroy']();}['setOnMessageCallback'](a){this['onMessageCallback']=a;}async['sendZipFile'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=await this['loadFileData'](b),{ZipWriter:e,BlobWriter:f,Uint8ArrayReader:g}=await import('@zip.js/zip.js'),h=c?.['fileName']||a183b['basename'](b)||'file.zip',i=c?.['contentType']||this['detectContentType'](h),j=new f('application/zip'),k=new e(j);await k['add'](h,new g(d)),await k['close']();const l=await j['getData'](),m=new Uint8Array(await l['arrayBuffer']());if(m['length']>WTS_FILE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'ZIP\x20file\x20size\x20('+m['length']+'\x20bytes)\x20exceeds\x20local\x20maximum\x20allowed\x20size\x20('+WTS_FILE_BYTES_LIMIT+'\x20bytes)');const n='0x'+createHash('sha256')['update'](m)['digest']('hex'),o=Buffer['from'](m)['toString']('base64'),p={'fileName':h+'.zip','fileSize':m['length'],'fileHash':n,'contentType':i};await this['pullMessages']();const q=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),r=Date['now'](),s=await this['session']['encryptMessage'](this['userAddress'],a,o),t=Buffer['from'](new Uint8Array(s['body']))['toString']('base64'),u=c?.['guardAddress']||'',v=c?.['passportAddress']||'',w=hashPlaintext(o,r,u,v,q),x=Date['now'](),y=this['generateNonce'](),z=await(await getAccount())['get'](this['userAddress'],![]);if(!z)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const A=z['pubkey'],B=q>=0x0?q['toString']():'',C=c?.['force']?'true':'false',D='send_message:'+this['userAddress']+':'+a+':'+u+':'+v+':'+w+':'+B+':'+A+':'+x+':'+y+':'+C,E=await(await getAccount())['signData'](this['userAddress'],D),F=Buffer['from'](E['signature']['slice'](0x2),'hex'),G=bytesToBase64(new Uint8Array(F)),H=await this['serverClient']['sendMessage']({'sender':E['publicKey'],'recipient':a,'ciphertext':t,'plaintextHash':w,'clientTimestamp':r,'msgType':s['type'],'zipMetadata':p,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':q>=0x0?q:undefined,'signatureScheme':'ED25519','signature':G,'timestamp':x,'nonce':y}),I={'messageId':H['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':w,'plaintext':o,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':q,'direction':MessageDirection['SENT'],'status':H['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':s['type'],'zipMetadata':p,'createdAt':r};H['merkleData']&&(I['leafIndex']=H['merkleData']['leafIndex'],I['prevRoot']=H['merkleData']['prevRoot'],I['newRoot']=H['merkleData']['newRoot'],I['serverSignature']=H['merkleData']['serverSignature'],I['serverTimestamp']=H['merkleData']['serverTimestamp'],I['serverPublicKey']=H['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':H['merkleData']['newRoot'],'prevRoot':H['merkleData']['prevRoot'],'lastLeafIndex':H['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](I);if(H['pendingMerkleData'])for(const [J,K]of Object['entries'](H['pendingMerkleData'])){const L=this['messageStorage']['getMessage'](J);L&&L['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](J,MessageStatus['CONFIRMED'],{'leafIndex':K['leafIndex'],'newRoot':K['newRoot'],'serverSignature':K['serverSignature'],'serverTimestamp':K['serverTimestamp'],'serverPublicKey':K['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':H['messageId'],'status':I['status'],'merkleData':H['merkleData'],'guardList':H['guard_list'],'lastReceivedLeafIndex':q>=0x0?q:undefined};}async['loadFileData'](a){if(a['startsWith']('http://')||a['startsWith']('https://')){const d=await fetch(a);if(!d['ok'])throw new MessengerError(MessengerErrorCode['NETWORK_ERROR'],'Failed\x20to\x20fetch\x20file\x20from\x20'+a+':\x20'+d['statusText']);const e=await d['arrayBuffer']();return new Uint8Array(e);}const b=a183b['resolve'](a);if(!a183a['existsSync'](b))throw new MessengerError(MessengerErrorCode['FILE_NOT_FOUND'],'File\x20not\x20found:\x20'+b);const c=a183a['readFileSync'](b);return new Uint8Array(c);}['detectContentType'](a){const b=a183b['extname'](a)['toLowerCase']();switch(b){case'.wts':return'wts';case'.wip':return'wip';default:return'zip';}}async['_createSignedRequest'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d=canonicalizeJson(a),e=b+':'+c+':'+d,f=await(await getAccount())['signData'](this['userAddress'],e),g=Buffer['from'](f['signature']['slice'](0x2),'hex'),h=bytesToBase64(new Uint8Array(g)),i=await(await getAccount())['get'](this['userAddress'],![]);if(!i||!i['pubkey'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20public\x20key\x20not\x20found');return{'userAddress':this['userAddress'],'publicKey':i['pubkey'],'signatureScheme':'ED25519','signature':h,'timestamp':b,'nonce':c,'data':a};}['_validateAddresses'](a){const b=[],c=[];for(const d of a){isValidWowAddress(d)?b['push'](d):c['push'](d);}return{'valid':b,'invalid':c};}async['addToBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearBlacklist'](this['userAddress'],b);}async['getBlacklist'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearFriendsList'](this['userAddress'],b);}async['getFriendsList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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']){const h=this['isRetryableError'](c['error']||'');return{'success':![],'shouldRetry':h,'error':c['error'],'sessionUpdated':c['sessionUpdated']};}const d=c['plaintext'];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 e=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']}:undefined});if(!e['valid'])throw new Error(e['error']);const f={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash'],'plaintext':d,'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':MessageDirection['RECEIVED'],'status':MessageStatus['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']};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 g=a['merkleMetadata']?.['serverTimestamp']||a['clientTimestamp']||Date['now']();if(a['lastReceivedLeafIndex']!==undefined&&a['lastReceivedLeafIndex']>=0x0){const i=this['messageStorage']['getMessagesBySession'](this['userAddress'],a['from'])['filter'](j=>j['direction']===MessageDirection['SENT']&&j['status']===MessageStatus['CONFIRMED']&&j['leafIndex']!==undefined&&j['leafIndex']<=a['lastReceivedLeafIndex']);for(const j of i){this['messageStorage']['updateMessageStatus'](j['messageId'],MessageStatus['READ']);}}return{'success':!![],'shouldRetry':![],'message':f,'decryptedData':{'id':a['id'],'from':a['from'],'plaintext':d,'timestamp':g,'merkleVerified':!!a['merkleMetadata'],'merkleData':a['merkleMetadata']?{'leafIndex':a['merkleMetadata']['leafIndex'],'rootHash':a['merkleMetadata']['newRoot']}:undefined},'sessionUpdated':c['sessionUpdated']};}catch(k){const l=k instanceof Error?k['message']:String(k),m=this['isRetryableError'](l);return{'success':![],'shouldRetry':m,'error':l};}}['isRetryableError'](a){const b=[/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];return b['some'](c=>c['test'](a));}async['processWaitingMessages'](a,b){if(this['waitingMessages']['size']===0x0)return;console['log']('[Messenger]\x20尝试处理\x20'+this['waitingMessages']['size']+'\x20条等待消息');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]\x20等待消息\x20'+f+'\x20解密永久失败:\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,i=h+0x1;i>=0x3?(console['error']('[Messenger]\x20等待消息\x20'+f+'\x20重试3次后仍失败,标记为永久失败'),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)):(this['waitingMessageRetries']['set'](f,i),console['log']('[Messenger]\x20消息\x20'+f+'\x20第\x20'+i+'/3\x20次重试失败,继续等待'));}}}for(const j of c){this['waitingMessages']['delete'](j);}c['length']>0x0&&console['log']('[Messenger]\x20成功处理\x20'+c['length']+'\x20条等待消息');}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':MessageDirection['RECEIVED'],'status':MessageStatus['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;console['log']('[Messenger]\x20重新调度轮询,切换到快速模式(等待消息:\x20'+this['waitingMessages']['size']+')'),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){a?this['failedMessages']['delete'](a):this['failedMessages']['clear']();}['getWaitingMessageCount'](){return this['waitingMessages']['size'];}}
|
|
1
|
+
import{createHash}from'crypto';import*as a183a from'fs';import*as a183b from'path';import{MessengerSession,DecryptionEngine}from'./session.js';import{MessengerServerClient}from'./server.js';import{MessageStorage,SessionStateStorage}from'./storage.js';import{hashPlaintext,verifyMessage,bytesToBase64}from'./crypto.js';import{canonicalizeJson}from'./utils.js';import{DEFAULT_MESSENGER_CONFIG,MessengerError,MessengerErrorCode,MessageDirection,MessageStatus,WTS_FILE_BYTES_LIMIT,NORMAL_MESSAGE_BYTES_LIMIT,CHAIN_PROOF_TYPE}from'./types.js';import{isValidWowAddress}from'../../utils/sui-types.js';async function getAccount(){const {Account:a}=await import('../local/account.js');return a['Instance']();}export class Messenger{['session'];['serverClient'];['config'];['userAddress']=null;['onMessageCallback']=null;['pollingTimer']=null;['messageConsecutiveEmptyPulls']=0x0;['prekeyConsecutiveOkCount']=0x0;['currentMessageInterval'];['isPollingRunning']=![];['messageStorage'];['sessionStateStorage'];['decryptionEngine'];['waitingMessages']=new Map();['failedMessages']=new Map();['waitingMessageRetries']=new Map();constructor(a,b){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']),this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8;}['getUserAddress'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');return this['userAddress'];}async['getPublicKey'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a=await(await getAccount())['get'](this['userAddress'],![]);return a?.['pubkey']||'';}['isValidGuardMessage'](a,b){return Boolean(a&&b&&isValidWowAddress(a)&&isValidWowAddress(b));}async['generateSignatureParams'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=await(await getAccount())['get'](this['userAddress'],![]);if(!b?.['secret'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20not\x20found\x20or\x20no\x20secret\x20key\x20for\x20'+this['userAddress']);const {Ed25519Keypair:c}=await import('../../keypairs/ed25519/index.js'),d=c['fromSecretKey'](b['secret']),e=d['getPublicKey'](),f=e['toWPublicKey'](),g=Date['now'](),h=this['generateNonce'](),i=a+':'+f+':'+g+':'+h,j=await d['sign'](new TextEncoder()['encode'](i));return{'signatureScheme':'ED25519','signature':Buffer['from'](j)['toString']('base64'),'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['initialize'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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']),await this['checkAndRefillPrekeys'](),this['startPollingTimer']();}async['checkAndRefillPrekeys'](){if(!this['userAddress'])return;await this['session']['ensurePreKeys'](this['userAddress'],![]);}['startPollingTimer'](){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;const a=this['getNextPollInterval']();this['pollingTimer']=setTimeout(()=>{this['poll']()['catch'](b=>{})['finally'](()=>{this['scheduleNextPoll']();});},a);}['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']();a['messages']['length']>0x0?(this['messageConsecutiveEmptyPulls']=0x0,this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['onMessageCallback']&&this['onMessageCallback'](a['messages'])):(this['messageConsecutiveEmptyPulls']++,this['messageConsecutiveEmptyPulls']>=(this['config']['message_poll_consecutive_empty_limit']??0x3)&&(this['currentMessageInterval']=this['config']['message_poll_default_interval_ms']??0x6*0x3c*0x3e8,this['messageConsecutiveEmptyPulls']=0x0));if(a['prekey_status']){const b=a['prekey_status'];b['shouldRefill']?(this['prekeyConsecutiveOkCount']=0x0,await this['checkAndRefillPrekeys']()):(this['prekeyConsecutiveOkCount']++,this['prekeyConsecutiveOkCount']>=(this['config']['prekey_poll_consecutive_ok_limit']??0x3)&&(this['prekeyConsecutiveOkCount']=0x0));}}catch(c){}}['triggerFastPoll'](){this['currentMessageInterval']=this['config']['message_poll_fast_interval_ms']??0x6*0x3e8,this['messageConsecutiveEmptyPulls']=0x0,this['isPollingRunning']&&(this['pollingTimer']&&clearTimeout(this['pollingTimer']),this['scheduleNextPoll']());}async['sendMessage'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=Date['now'](),e=Date['now'](),f=this['generateNonce'](),g=new TextEncoder()['encode'](b)['length'];if(g>NORMAL_MESSAGE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'Message\x20size\x20('+g+'\x20bytes)\x20exceeds\x20maximum\x20allowed\x20size\x20('+NORMAL_MESSAGE_BYTES_LIMIT+'\x20bytes).\x20Consider\x20using\x20sendZipFile\x20for\x20large\x20content.');await this['pullMessages']();const h=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),i=await this['session']['encryptMessage'](this['userAddress'],a,b),j=Buffer['from'](new Uint8Array(i['body']))['toString']('base64'),k=hashPlaintext(b,d,c?.['guardAddress'],c?.['passportAddress'],h),l=await(await getAccount())['get'](this['userAddress'],![]);if(!l)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const m=l['pubkey'],n=c?.['guardAddress']||'',o=c?.['passportAddress']||'',p=h>=0x0?h['toString']():'',q=c?.['force']?'true':'false',r='send_message:'+this['userAddress']+':'+a+':'+n+':'+o+':'+k+':'+p+':'+m+':'+e+':'+f+':'+q,s=await(await getAccount())['signData'](this['userAddress'],r),t=Buffer['from'](s['signature']['slice'](0x2),'hex'),u=bytesToBase64(new Uint8Array(t)),v=await this['serverClient']['sendMessage']({'sender':s['publicKey'],'recipient':a,'ciphertext':j,'plaintextHash':k,'clientTimestamp':d,'msgType':i['type'],'signatureScheme':'ED25519','signature':u,'timestamp':e,'nonce':f,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':h>=0x0?h:undefined}),w={'messageId':v['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':k,'plaintext':b,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':h,'direction':MessageDirection['SENT'],'status':v['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':i['type'],'createdAt':d};v['merkleData']&&(w['leafIndex']=v['merkleData']['leafIndex'],w['prevRoot']=v['merkleData']['prevRoot'],w['newRoot']=v['merkleData']['newRoot'],w['serverSignature']=v['merkleData']['serverSignature'],w['serverTimestamp']=v['merkleData']['serverTimestamp'],w['serverPublicKey']=v['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':v['merkleData']['newRoot'],'prevRoot':v['merkleData']['prevRoot'],'lastLeafIndex':v['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](w);if(v['pendingMerkleData'])for(const [x,y]of Object['entries'](v['pendingMerkleData'])){const z=this['messageStorage']['getMessage'](x);z&&z['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](x,MessageStatus['CONFIRMED'],{'leafIndex':y['leafIndex'],'newRoot':y['newRoot'],'serverSignature':y['serverSignature'],'serverTimestamp':y['serverTimestamp'],'serverPublicKey':y['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':v['messageId'],'status':w['status'],'merkleData':v['merkleData'],'guardList':v['guard_list'],'lastReceivedLeafIndex':h>=0x0?h:undefined};}async['pullMessages'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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'],![]),f=e?.['pubkey']||'',g=await(await getAccount())['signData'](this['userAddress'],d),h=Buffer['from'](g['signature']['slice'](0x2),'hex'),i={'signatureScheme':'ED25519','signature':bytesToBase64(h),'timestamp':b,'nonce':c},j=await this['serverClient']['pullMessages'](this['userAddress'],f,i,a);if(j['messages']['length']===0x0)return{'messages':[],'prekey_status':j['prekey_status']};const k=[],l=[],m=[...j['messages']]['sort'](function(n,o){return(n['clientTimestamp']||0x0)-(o['clientTimestamp']||0x0);});await this['processWaitingMessages'](k,l);for(const n of m){if(this['waitingMessages']['has'](n['id'])){l['push'](n['id']);continue;}if(this['failedMessages']['has'](n['id'])){l['push'](n['id']);continue;}const o=this['messageStorage']['getMessage'](n['id']);if(o){l['push'](n['id']);continue;}const p=await this['tryDecryptMessage'](n);if(p['success']&&p['message']&&p['decryptedData'])this['messageStorage']['saveMessage'](p['message']),k['push'](p['decryptedData']),l['push'](n['id']),this['waitingMessages']['delete'](n['id']);else p['shouldRetry']?this['waitingMessages']['set'](n['id'],n):(this['failedMessages']['set'](n['id'],{'message':n,'error':p['error']||'Unknown\x20error'}),await this['saveFailedMessage'](n,p['error']||'Unknown\x20error'),l['push'](n['id']));}this['waitingMessages']['size']>0x0&&this['isPollingRunning']&&this['reschedulePolling']();if(l['length']>0x0&&this['userAddress']){const q=Date['now'](),r=this['generateNonce'](),s=await(await getAccount())['get'](this['userAddress'],![]);if(s?.['pubkey']){const t='ack_messages:'+this['userAddress']+':'+l['join'](',')+':'+s['pubkey']+':'+q+':'+r,u=await(await getAccount())['signData'](this['userAddress'],t),v=Buffer['from'](u['signature']['slice'](0x2),'hex'),w=bytesToBase64(new Uint8Array(v));await this['serverClient']['acknowledgeMessages'](l,u['publicKey'],{'publicKey':u['publicKey'],'signatureScheme':'ED25519','signature':w,'timestamp':q,'nonce':r});}}return{'messages':k,'prekey_status':j['prekey_status']};}['getLastSentLeafIndex'](a){if(!this['userAddress'])return-0x1;const b=this['messageStorage']['getMessagesBySession'](this['userAddress'],a),c=b['filter'](d=>d['direction']===MessageDirection['SENT']&&d['leafIndex']!==undefined);if(c['length']===0x0)return-0x1;return Math['max'](...c['map'](d=>d['leafIndex']));}['getSessionMessages'](a){if(!this['userAddress'])return[];return this['messageStorage']['getMessagesBySession'](this['userAddress'],a);}['getSessionState'](a){if(!this['userAddress'])return undefined;return this['sessionStateStorage']['getSessionState'](this['userAddress'],a);}async['submitChainProof'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=this['sessionStateStorage']['getSessionState'](this['userAddress'],b);if(!d||!d['currentRoot'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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('../call/proof.js'),k=new j({'proof':JSON['stringify'](i),'server_pubkey':g,'server_signature':h,'proof_type':CHAIN_PROOF_TYPE,'description':c||'Messenger\x20session\x20proof\x20for\x20'+this['userAddress']+'\x20<->\x20'+b,'item_count':d['messageCount'],'about_address':d['sessionId']}),l=await k['call'](a),m=l?.['objectChanges'],n=m?.['find'](o=>o['objectType']?.['includes']('Proof'))?.['objectId'];return{'proofAddress':n||'','txHash':l?.['digest']||''};}['destroy'](){this['stopPollingTimer']();}['disconnect'](){this['destroy']();}['setOnMessageCallback'](a){this['onMessageCallback']=a;}async['sendZipFile'](a,b,c){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const d=await this['loadFileData'](b),{ZipWriter:e,BlobWriter:f,Uint8ArrayReader:g}=await import('@zip.js/zip.js'),h=c?.['fileName']||a183b['basename'](b)||'file.zip',i=c?.['contentType']||this['detectContentType'](h),j=new f('application/zip'),k=new e(j);await k['add'](h,new g(d)),await k['close']();const l=await j['getData'](),m=new Uint8Array(await l['arrayBuffer']());if(m['length']>WTS_FILE_BYTES_LIMIT)throw new MessengerError(MessengerErrorCode['INVALID_INPUT'],'ZIP\x20file\x20size\x20('+m['length']+'\x20bytes)\x20exceeds\x20local\x20maximum\x20allowed\x20size\x20('+WTS_FILE_BYTES_LIMIT+'\x20bytes)');const n='0x'+createHash('sha256')['update'](m)['digest']('hex'),o=Buffer['from'](m)['toString']('base64'),p={'fileName':h+'.zip','fileSize':m['length'],'fileHash':n,'contentType':i};await this['pullMessages']();const q=this['messageStorage']['getLastReceivedLeafIndex'](this['userAddress'],a),r=Date['now'](),s=await this['session']['encryptMessage'](this['userAddress'],a,o),t=Buffer['from'](new Uint8Array(s['body']))['toString']('base64'),u=c?.['guardAddress']||'',v=c?.['passportAddress']||'',w=hashPlaintext(o,r,u,v,q),x=Date['now'](),y=this['generateNonce'](),z=await(await getAccount())['get'](this['userAddress'],![]);if(!z)throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20account\x20not\x20found');const A=z['pubkey'],B=q>=0x0?q['toString']():'',C=c?.['force']?'true':'false',D='send_message:'+this['userAddress']+':'+a+':'+u+':'+v+':'+w+':'+B+':'+A+':'+x+':'+y+':'+C,E=await(await getAccount())['signData'](this['userAddress'],D),F=Buffer['from'](E['signature']['slice'](0x2),'hex'),G=bytesToBase64(new Uint8Array(F)),H=await this['serverClient']['sendMessage']({'sender':E['publicKey'],'recipient':a,'ciphertext':t,'plaintextHash':w,'clientTimestamp':r,'msgType':s['type'],'zipMetadata':p,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'force':c?.['force'],'lastReceivedLeafIndex':q>=0x0?q:undefined,'signatureScheme':'ED25519','signature':G,'timestamp':x,'nonce':y}),I={'messageId':H['messageId'],'fromAddress':this['userAddress'],'toAddress':a,'plaintextHash':w,'plaintext':o,'guardAddress':c?.['guardAddress'],'passportAddress':c?.['passportAddress'],'lastReceivedLeafIndex':q,'direction':MessageDirection['SENT'],'status':H['status']==='confirmed'?MessageStatus['CONFIRMED']:MessageStatus['PENDING'],'msgType':s['type'],'zipMetadata':p,'createdAt':r};H['merkleData']&&(I['leafIndex']=H['merkleData']['leafIndex'],I['prevRoot']=H['merkleData']['prevRoot'],I['newRoot']=H['merkleData']['newRoot'],I['serverSignature']=H['merkleData']['serverSignature'],I['serverTimestamp']=H['merkleData']['serverTimestamp'],I['serverPublicKey']=H['merkleData']['serverPublicKey'],this['sessionStateStorage']['updateSessionState'](this['userAddress'],a,{'currentRoot':H['merkleData']['newRoot'],'prevRoot':H['merkleData']['prevRoot'],'lastLeafIndex':H['merkleData']['leafIndex'],'lastSyncAt':Date['now']()}));this['messageStorage']['saveMessage'](I);if(H['pendingMerkleData'])for(const [J,K]of Object['entries'](H['pendingMerkleData'])){const L=this['messageStorage']['getMessage'](J);L&&L['status']===MessageStatus['PENDING']&&this['messageStorage']['updateMessageStatus'](J,MessageStatus['CONFIRMED'],{'leafIndex':K['leafIndex'],'newRoot':K['newRoot'],'serverSignature':K['serverSignature'],'serverTimestamp':K['serverTimestamp'],'serverPublicKey':K['serverPublicKey']});}return this['triggerFastPoll'](),{'messageId':H['messageId'],'status':I['status'],'merkleData':H['merkleData'],'guardList':H['guard_list'],'lastReceivedLeafIndex':q>=0x0?q:undefined};}async['loadFileData'](a){if(a['startsWith']('http://')||a['startsWith']('https://')){const d=await fetch(a);if(!d['ok'])throw new MessengerError(MessengerErrorCode['NETWORK_ERROR'],'Failed\x20to\x20fetch\x20file\x20from\x20'+a+':\x20'+d['statusText']);const e=await d['arrayBuffer']();return new Uint8Array(e);}const b=a183b['resolve'](a);if(!a183a['existsSync'](b))throw new MessengerError(MessengerErrorCode['FILE_NOT_FOUND'],'File\x20not\x20found:\x20'+b);const c=a183a['readFileSync'](b);return new Uint8Array(c);}['detectContentType'](a){const b=a183b['extname'](a)['toLowerCase']();switch(b){case'.wts':return'wts';case'.wip':return'wip';default:return'zip';}}async['_createSignedRequest'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const b=Date['now'](),c=this['generateNonce'](),d=canonicalizeJson(a),e=b+':'+c+':'+d,f=await(await getAccount())['signData'](this['userAddress'],e),g=Buffer['from'](f['signature']['slice'](0x2),'hex'),h=bytesToBase64(new Uint8Array(g)),i=await(await getAccount())['get'](this['userAddress'],![]);if(!i||!i['pubkey'])throw new MessengerError(MessengerErrorCode['IDENTITY_NOT_FOUND'],'Account\x20public\x20key\x20not\x20found');return{'userAddress':this['userAddress'],'publicKey':i['pubkey'],'signatureScheme':'ED25519','signature':h,'timestamp':b,'nonce':c,'data':a};}['_validateAddresses'](a){const b=[],c=[];for(const d of a){isValidWowAddress(d)?b['push'](d):c['push'](d);}return{'valid':b,'invalid':c};}async['addToBlacklist'](a){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearBlacklist'](this['userAddress'],b);}async['getBlacklist'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['IDENTITY_NOT_FOUND'],'User\x20address\x20not\x20set');const a={},b=await this['_createSignedRequest'](a);return this['serverClient']['clearFriendsList'](this['userAddress'],b);}async['getFriendsList'](){if(!this['userAddress'])throw new MessengerError(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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(MessengerErrorCode['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']){const h=this['isRetryableError'](c['error']||'');return{'success':![],'shouldRetry':h,'error':c['error'],'sessionUpdated':c['sessionUpdated']};}const d=c['plaintext'];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 e=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']}:undefined});if(!e['valid'])throw new Error(e['error']);const f={'messageId':a['id'],'fromAddress':a['from'],'toAddress':this['userAddress'],'plaintextHash':a['plaintextHash'],'plaintext':d,'guardAddress':a['guardAddress'],'passportAddress':a['passportAddress'],'lastReceivedLeafIndex':a['lastReceivedLeafIndex'],'direction':MessageDirection['RECEIVED'],'status':MessageStatus['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']};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 g=a['merkleMetadata']?.['serverTimestamp']||a['clientTimestamp']||Date['now']();if(a['lastReceivedLeafIndex']!==undefined&&a['lastReceivedLeafIndex']>=0x0){const i=this['messageStorage']['getMessagesBySession'](this['userAddress'],a['from'])['filter'](j=>j['direction']===MessageDirection['SENT']&&j['status']===MessageStatus['CONFIRMED']&&j['leafIndex']!==undefined&&j['leafIndex']<=a['lastReceivedLeafIndex']);for(const j of i){this['messageStorage']['updateMessageStatus'](j['messageId'],MessageStatus['READ']);}}return{'success':!![],'shouldRetry':![],'message':f,'decryptedData':{'id':a['id'],'from':a['from'],'plaintext':d,'timestamp':g,'merkleVerified':!!a['merkleMetadata'],'merkleData':a['merkleMetadata']?{'leafIndex':a['merkleMetadata']['leafIndex'],'rootHash':a['merkleMetadata']['newRoot']}:undefined},'sessionUpdated':c['sessionUpdated']};}catch(k){const l=k instanceof Error?k['message']:String(k),m=this['isRetryableError'](l);return{'success':![],'shouldRetry':m,'error':l};}}['isRetryableError'](a){const b=[/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];return b['some'](c=>c['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'])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,i=h+0x1;i>=0x3?(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)):this['waitingMessageRetries']['set'](f,i);}}}for(const j of c){this['waitingMessages']['delete'](j);}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':MessageDirection['RECEIVED'],'status':MessageStatus['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){a?this['failedMessages']['delete'](a):this['failedMessages']['clear']();}['getWaitingMessageCount'](){return this['waitingMessages']['size'];}}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { X25519KeyPair, Ed25519KeyPair, MLKEMKeyPair } from "./types.js";
|
|
2
|
+
export declare function generateRandomBytes(length: number): Uint8Array;
|
|
3
|
+
export declare function generateX25519KeyPair(): X25519KeyPair;
|
|
4
|
+
export declare function x25519DH(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array;
|
|
5
|
+
export declare function generateEd25519KeyPair(): Ed25519KeyPair;
|
|
6
|
+
export declare function ed25519Sign(privateKey: Uint8Array, message: Uint8Array): Uint8Array;
|
|
7
|
+
export declare function ed25519Verify(publicKey: Uint8Array, message: Uint8Array, signature: Uint8Array): boolean;
|
|
8
|
+
export declare function ed25519PrivateKeyToX25519(ed25519PrivateKey: Uint8Array): Uint8Array;
|
|
9
|
+
export declare function ed25519PublicKeyToX25519(ed25519PublicKey: Uint8Array): Uint8Array;
|
|
10
|
+
export declare function generateMLKEMKeyPair(): MLKEMKeyPair;
|
|
11
|
+
export declare function mlkemEncapsulate(publicKey: Uint8Array): {
|
|
12
|
+
ciphertext: Uint8Array;
|
|
13
|
+
sharedSecret: Uint8Array;
|
|
14
|
+
};
|
|
15
|
+
export declare function mlkemDecapsulate(ciphertext: Uint8Array, secretKey: Uint8Array): Uint8Array;
|
|
16
|
+
export declare function hkdfDerive(inputKeyMaterial: Uint8Array, info: Uint8Array, length: number, salt?: Uint8Array): Uint8Array;
|
|
17
|
+
export declare function hkdfChainKey(chainKey: Uint8Array, dhOutput: Uint8Array): {
|
|
18
|
+
rootKey: Uint8Array;
|
|
19
|
+
chainKey: Uint8Array;
|
|
20
|
+
};
|
|
21
|
+
export declare function hkdfMessageKey(chainKey: Uint8Array): {
|
|
22
|
+
messageKey: Uint8Array;
|
|
23
|
+
nextChainKey: Uint8Array;
|
|
24
|
+
};
|
|
25
|
+
export declare function hmacSha256(key: Uint8Array, data: Uint8Array): Uint8Array;
|
|
26
|
+
export declare function aesGcmEncrypt(key: Uint8Array, plaintext: Uint8Array, associatedData: Uint8Array): {
|
|
27
|
+
ciphertext: Uint8Array;
|
|
28
|
+
iv: Uint8Array;
|
|
29
|
+
tag: Uint8Array;
|
|
30
|
+
};
|
|
31
|
+
export declare function aesGcmDecrypt(key: Uint8Array, ciphertext: Uint8Array, iv: Uint8Array, tag: Uint8Array, associatedData: Uint8Array): Uint8Array;
|
|
32
|
+
export declare function sha256Hash(data: Uint8Array): Uint8Array;
|
|
33
|
+
export declare function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
34
|
+
export declare function bytesToBase64(bytes: Uint8Array): string;
|
|
35
|
+
export declare function base64ToBytes(base64: string): Uint8Array;
|
|
36
|
+
export declare function bytesToHex(bytes: Uint8Array): string;
|
|
37
|
+
export declare function hexToBytes(hex: string): Uint8Array;
|
|
38
|
+
export declare function concatBytes(...arrays: Uint8Array[]): Uint8Array;
|
|
39
|
+
export declare function deriveRegistrationId(publicKey: Uint8Array): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{x25519}from'@noble/curves/ed25519';import{ed25519}from'@noble/curves/ed25519';import{sha256}from'@noble/hashes/sha256';import{sha512}from'@noble/hashes/sha512';import{hmac}from'@noble/hashes/hmac';import{hkdf}from'@noble/hashes/hkdf';import{randomBytes}from'@noble/hashes/utils';import{ml_kem768}from'@noble/post-quantum/ml-kem.js';import a184a from'node:crypto';import{ROOT_KEY_SIZE,CHAIN_KEY_SIZE,MESSAGE_KEY_SIZE,DH_KEY_SIZE,AES_GCM_IV_SIZE}from'./types.js';export function generateRandomBytes(a){return randomBytes(a);}export function generateX25519KeyPair(){const a=randomBytes(DH_KEY_SIZE),b=x25519['getPublicKey'](a);return{'publicKey':b,'privateKey':a};}export function x25519DH(a,b){return x25519['getSharedSecret'](a,b);}export function generateEd25519KeyPair(){const a=randomBytes(DH_KEY_SIZE),b=ed25519['getPublicKey'](a);return{'publicKey':b,'privateKey':a};}export function ed25519Sign(a,b){return ed25519['sign'](b,a);}export function ed25519Verify(a,b,c){try{return ed25519['verify'](c,b,a);}catch{return![];}}export function ed25519PrivateKeyToX25519(a){const b=sha512(a),c=new Uint8Array(b['slice'](0x0,0x20));return c[0x0]&=0xf8,c[0x1f]&=0x7f,c[0x1f]|=0x40,c;}export function ed25519PublicKeyToX25519(a){return x25519['getPublicKey'](ed25519PublicKeyToX25519(a));}export function generateMLKEMKeyPair(){const {publicKey:a,secretKey:b}=ml_kem768['keygen']();return{'publicKey':a,'secretKey':b};}export function mlkemEncapsulate(a){const {cipherText:b,sharedSecret:c}=ml_kem768['encapsulate'](a);return{'ciphertext':b,'sharedSecret':c};}export function mlkemDecapsulate(a,b){return ml_kem768['decapsulate'](a,b);}export function hkdfDerive(a,b,c,d){return hkdf(sha256,a,d||new Uint8Array(0x0),b,c);}export function hkdfChainKey(a,b){const c=new Uint8Array(a['length']+b['length']);c['set'](a),c['set'](b,a['length']);const d=hkdfDerive(c,new TextEncoder()['encode']('WowokPQChainKey'),ROOT_KEY_SIZE+CHAIN_KEY_SIZE);return{'rootKey':d['slice'](0x0,ROOT_KEY_SIZE),'chainKey':d['slice'](ROOT_KEY_SIZE,ROOT_KEY_SIZE+CHAIN_KEY_SIZE)};}export function hkdfMessageKey(a){const b=hkdfDerive(a,new TextEncoder()['encode']('WowokPQMessageKey'),MESSAGE_KEY_SIZE+CHAIN_KEY_SIZE);return{'messageKey':b['slice'](0x0,MESSAGE_KEY_SIZE),'nextChainKey':b['slice'](MESSAGE_KEY_SIZE,MESSAGE_KEY_SIZE+CHAIN_KEY_SIZE)};}export function hmacSha256(a,b){return hmac(sha256,a,b);}export function aesGcmEncrypt(a,b,c){const d=randomBytes(AES_GCM_IV_SIZE),e=Buffer['from'](a),f=Buffer['from'](d),g=Buffer['from'](b),h=Buffer['from'](c),i=a184a['createCipheriv']('aes-256-gcm',e,f);i['setAAD'](h);const j=Buffer['concat']([i['update'](g),i['final']()]),k=i['getAuthTag']();return{'ciphertext':new Uint8Array(j),'iv':d,'tag':new Uint8Array(k)};}export function aesGcmDecrypt(a,b,c,d,e){const f=Buffer['from'](a),g=Buffer['from'](c),h=Buffer['from'](b),i=Buffer['from'](d),j=Buffer['from'](e),k=a184a['createDecipheriv']('aes-256-gcm',f,g);k['setAAD'](j),k['setAuthTag'](i);const l=Buffer['concat']([k['update'](h),k['final']()]);return new Uint8Array(l);}export function sha256Hash(a){return sha256(a);}export function constantTimeEqual(c,d){if(c['length']!==d['length'])return![];let e=0x0;for(let f=0x0;f<c['length'];f++){e|=c[f]^d[f];}return e===0x0;}export function bytesToBase64(a){return Buffer['from'](a)['toString']('base64');}export function base64ToBytes(a){return new Uint8Array(Buffer['from'](a,'base64'));}export function bytesToHex(a){return Buffer['from'](a)['toString']('hex');}export function hexToBytes(a){return new Uint8Array(Buffer['from'](a,'hex'));}export function concatBytes(...a){const b=a['reduce']((e,f)=>e+f['length'],0x0),c=new Uint8Array(b);let d=0x0;for(const e of a){c['set'](e,d),d+=e['length'];}return c;}export function deriveRegistrationId(a){const b=(a[0x0]<<0x8|a[0x1])>>>0x0;return b===0x0?0x1:b;}
|