@e-techsolutions/e-baas-sdk 1.1.9 → 1.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/index.cjs +2037 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.esm.js +2022 -1
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -2
package/dist/index.cjs
CHANGED
|
@@ -1 +1,2037 @@
|
|
|
1
|
-
'use strict';(function(stringArrayFunction,comparisonValue){function _0xdaaff6(_0x25c8b3,_0x279c24){return _0x1cc1(_0x25c8b3- -0x18b,_0x279c24);}const stringArray=stringArrayFunction();while(!![]){try{const _0x44f560=parseInt(_0xdaaff6(-0x34,-0xaa))/0x1+parseInt(_0xdaaff6(-0x4c,-0xbf))/0x2*(-parseInt(_0xdaaff6(0x62,0xd1))/0x3)+-parseInt(_0xdaaff6(0xa3,0xe9))/0x4+parseInt(_0xdaaff6(0xb3,0x95))/0x5*(parseInt(_0xdaaff6(0x6,0x26))/0x6)+-parseInt(_0xdaaff6(0xb,-0x55))/0x7*(parseInt(_0xdaaff6(0x72,0xa1))/0x8)+parseInt(_0xdaaff6(0x61,0xd3))/0x9+-parseInt(_0xdaaff6(0x2e,0x52))/0xa*(-parseInt(_0xdaaff6(0x2a,-0x2b))/0xb);if(_0x44f560===comparisonValue)break;else stringArray['push'](stringArray['shift']());}catch(_0x89e0b){stringArray['push'](stringArray['shift']());}}}(_0x5014,0xd0420));var axios=require('axios');class EBaaSError extends Error{constructor(_0x1f1e26,status=0x0,_0x57daed){super(_0x1f1e26),this[_0x2c3f67(0x10a,0x146)]='EBaaSError';function _0x2c3f67(_0x5bd21d,_0x4e4db5){return _0x1cc1(_0x5bd21d- -0x34,_0x4e4db5);}this['status']=status,this['details']=_0x57daed,Error[_0x2c3f67(0x12a,0x18f)]&&Error[_0x2c3f67(0x12a,0x197)](this,EBaaSError);}['toJSON'](){function _0x36455f(_0x190aab,_0x1c635e){return _0x1cc1(_0x1c635e-0x8e,_0x190aab);}return{'name':this[_0x36455f(0x148,0x1cc)],'message':this[_0x36455f(0x224,0x1c5)],'status':this[_0x36455f(0x1d2,0x201)],'details':this[_0x36455f(0x16d,0x1c7)],'stack':this['stack']};}[_0x2d9ed0(0x36c,0x382)](){function _0x13846c(_0x48f1d6,_0x5f1277){return _0x1cc1(_0x48f1d6- -0x354,_0x5f1277);}return this['name']+':\x20'+this[_0x13846c(-0x21d,-0x1c4)]+_0x13846c(-0x1ae,-0x147)+this[_0x13846c(-0x1e1,-0x1d0)]+')';}}class HttpClient{constructor(config){this['baseURL']=config['url'];function _0x5f0db6(_0x265f75,_0x4a9d96){return _0x1cc1(_0x4a9d96- -0x22c,_0x265f75);}this[_0x5f0db6(0x1e,-0x52)]=config[_0x5f0db6(-0x5a,-0x52)],this['client']=axios[_0x5f0db6(-0xce,-0xac)]({'baseURL':this[_0x5f0db6(0x34,-0x39)],'timeout':config['timeout']||0x2710,'headers':{'Content-Type':'application/json','apikey':this[_0x5f0db6(0x1,-0x52)],...config[_0x5f0db6(0x6a,-0xc)]}}),this['setupInterceptors']();}['setupInterceptors'](){function _0x671af6(_0x1739d6,_0x2528b0){return _0x1cc1(_0x1739d6-0x10d,_0x2528b0);}this[_0x671af6(0x2f7,0x2f4)][_0x671af6(0x331,0x2fb)]['request']['use'](config=>{return config;},_0x1a928c=>{function _0x3e9fe9(_0x5a6b3d,_0x3a3569){return _0x1cc1(_0x3a3569- -0x2ea,_0x5a6b3d);}return Promise[_0x3e9fe9(-0xbc,-0xe8)](new EBaaSError('Request\x20failed',0x0,_0x1a928c));}),this[_0x671af6(0x2f7,0x301)][_0x671af6(0x331,0x2b6)][_0x671af6(0x318,0x290)][_0x671af6(0x2cc,0x277)](response=>{return response;},_0x401160=>{const status=_0x401160[_0x1556b1(-0xd6,-0x140)]?.[_0x1556b1(-0x16e,-0x1dc)]||0x0,_0x1e82aa=_0x401160[_0x1556b1(-0xd6,-0xed)]?.['data']?.[_0x1556b1(-0x1aa,-0x194)]||_0x401160[_0x1556b1(-0x1aa,-0x14a)]||_0x1556b1(-0x191,-0x1b5),_0x18823a=_0x401160[_0x1556b1(-0xd6,-0x109)]?.['data']||_0x401160;function _0x1556b1(_0xebbe49,_0x3b9b19){return _0x1cc1(_0xebbe49- -0x2e1,_0x3b9b19);}return Promise[_0x1556b1(-0xdf,-0x138)](new EBaaSError(_0x1e82aa,status,_0x18823a));});}async[_0x2d9ed0(0x3e9,0x37b)](_0xb0f5cb,config){function _0x5186b4(_0x23e571,_0x458f93){return _0x1cc1(_0x23e571-0x2d3,_0x458f93);}try{const response=await this[_0x5186b4(0x4bd,0x43e)]['get'](_0xb0f5cb,config);return{'data':response['data'],'status':response[_0x5186b4(0x446,0x47e)],'statusText':response['statusText'],'headers':response['headers']};}catch(_0x27c418){throw this['handleError'](_0x27c418);}}async[_0x2d9ed0(0x3b1,0x39a)](_0x67ef13,data,config){function _0x4918dc(_0x5262d5,_0x399f26){return _0x1cc1(_0x399f26-0x239,_0x5262d5);}try{const response=await this[_0x4918dc(0x44c,0x423)][_0x4918dc(0x3f3,0x3d9)](_0x67ef13,data,config);return{'data':response[_0x4918dc(0x481,0x440)],'status':response[_0x4918dc(0x369,0x3ac)],'statusText':response[_0x4918dc(0x346,0x380)],'headers':response[_0x4918dc(0x46b,0x459)]};}catch(_0x4707ea){throw this['handleError'](_0x4707ea);}}async['put'](_0x158647,data,config){function _0x5fb055(_0x4c78f0,_0x1919ee){return _0x1cc1(_0x1919ee-0x30c,_0x4c78f0);}try{const response=await this['client']['put'](_0x158647,data,config);return{'data':response[_0x5fb055(0x4bc,0x513)],'status':response[_0x5fb055(0x4e9,0x47f)],'statusText':response[_0x5fb055(0x3ef,0x453)],'headers':response['headers']};}catch(_0x2aed93){throw this[_0x5fb055(0x580,0x508)](_0x2aed93);}}async['patch'](_0x45cd15,data,config){function _0x37e221(_0xbcf1fb,_0x711878){return _0x1cc1(_0x711878- -0x2f,_0xbcf1fb);}try{const response=await this['client']['patch'](_0x45cd15,data,config);return{'data':response[_0x37e221(0x1ab,0x1d8)],'status':response['status'],'statusText':response['statusText'],'headers':response['headers']};}catch(_0x34c81b){throw this['handleError'](_0x34c81b);}}async['delete'](_0x3f1a92,config){function _0x447ab1(_0x39dc53,_0x5a4d66){return _0x1cc1(_0x5a4d66- -0x2bd,_0x39dc53);}try{const response=await this['client']['delete'](_0x3f1a92,config);return{'data':response[_0x447ab1(-0xed,-0xb6)],'status':response[_0x447ab1(-0xf3,-0x14a)],'statusText':response['statusText'],'headers':response[_0x447ab1(-0x1c,-0x9d)]};}catch(_0x27395a){throw this[_0x447ab1(-0x144,-0xc1)](_0x27395a);}}['setAuthToken'](_0x3bcb5c){this['client']['defaults']['headers']['common']['Authorization']='Bearer\x20'+_0x3bcb5c;}['removeAuthToken'](){delete this[_0x2dd987(0x5f6,0x5a9)]['defaults']['headers'][_0x2dd987(0x569,0x5f1)]['Authorization'];function _0x2dd987(_0x384e86,_0x523afc){return _0x1cc1(_0x523afc-0x3bf,_0x384e86);}this[_0x2dd987(0x52e,0x5a9)]['defaults']['headers'][_0x2dd987(0x5e2,0x5f1)]['Authorization']=_0x2dd987(0x61a,0x59d)+this['apiKey'];}[_0x2d9ed0(0x40d,0x417)](_0x5f5484){function _0x31b7bf(_0x53859e,_0x1ffa7e){return _0x1cc1(_0x1ffa7e- -0x32,_0x53859e);}if(_0x5f5484 instanceof EBaaSError)return _0x5f5484;return new EBaaSError(_0x5f5484[_0x31b7bf(0xc4,0x105)]||'HTTP\x20request\x20failed',_0x5f5484['status']||0x0,_0x5f5484);}}class AuthClient{constructor(_0x2a5e2d,_0x4f536c){this[_0x2c0741(0x40,0x7c)]=null,this['httpClient']=_0x2a5e2d;function _0x2c0741(_0x20b923,_0x1a4df2){return _0x1cc1(_0x20b923- -0x115,_0x1a4df2);}this['workspaceId']=_0x4f536c,this['loadSession']();}async['signUp'](data){function _0x4ffcf2(_0x396021,_0x3abe3e){return _0x1cc1(_0x396021-0x1f5,_0x3abe3e);}try{const response=await this['httpClient'][_0x4ffcf2(0x395,0x31b)]('/auth/v1/signup',data);return response['data'][_0x4ffcf2(0x380,0x3f9)]&&this['setSessionInternal'](response[_0x4ffcf2(0x3fc,0x47f)]['session']),response[_0x4ffcf2(0x3fc,0x3cb)];}catch(_0x23f628){throw this[_0x4ffcf2(0x349,0x334)](_0x23f628);}}async[_0x2d9ed0(0x416,0x476)](data){function _0x28fa23(_0xafa13a,_0x44f812){return _0x1cc1(_0x44f812- -0x3a8,_0xafa13a);}try{const headers={};this['workspaceId']&&(headers['X-Workspace-ID']=this['workspaceId']);const response=await this['httpClient']['post']('/auth/v1/sdk/signin',data,{'headers':headers});return response[_0x28fa23(-0x17e,-0x1a1)][_0x28fa23(-0x247,-0x21d)]&&this[_0x28fa23(-0x28b,-0x242)](response['data'][_0x28fa23(-0x285,-0x21d)]),response['data'];}catch(_0x44811b){throw this['handleAuthError'](_0x44811b);}}async[_0x2d9ed0(0x42d,0x3f6)](){function _0x43be53(_0x1c815a,_0xb3153b){return _0x1cc1(_0x1c815a-0x2c8,_0xb3153b);}try{await this['httpClient']['post']('/auth/v1/signout'),this[_0x43be53(0x4fd,0x500)]();}catch(_0x1eab0f){this[_0x43be53(0x4fd,0x4a4)]();throw this[_0x43be53(0x41c,0x432)](_0x1eab0f);}}async[_0x2d9ed0(0x36b,0x344)](){if(!this[_0x2c5b14(0x2a3,0x2d3)]?.[_0x2c5b14(0x2ff,0x37d)])return null;function _0x2c5b14(_0x557bba,_0x22f3ce){return _0x1cc1(_0x557bba-0x14e,_0x22f3ce);}try{const response=await this[_0x2c5b14(0x2f1,0x372)][_0x2c5b14(0x326,0x304)](_0x2c5b14(0x335,0x3af));return response['data'][_0x2c5b14(0x2be,0x2b1)];}catch(_0x1ecb09){if(_0x1ecb09 instanceof EBaaSError&&_0x1ecb09[_0x2c5b14(0x2c1,0x330)]===0x191)return this[_0x2c5b14(0x383,0x408)](),null;throw this['handleAuthError'](_0x1ecb09);}}async[_0x2d9ed0(0x390,0x310)](){function _0x5c62a8(_0x19ec1c,_0x5d055a){return _0x1cc1(_0x5d055a-0x7,_0x19ec1c);}if(!this['currentSession']?.['refresh_token'])return null;try{const response=await this['httpClient']['post']('/auth/v1/refresh',{'refresh_token':this['currentSession']['refresh_token']});if(response['data'][_0x5c62a8(0x16c,0x192)])return this['setSession'](response['data'][_0x5c62a8(0x1f7,0x192)]),response[_0x5c62a8(0x1e0,0x20e)]['session'];return null;}catch(_0x1b6ccf){this[_0x5c62a8(0x233,0x23c)]();throw this['handleAuthError'](_0x1b6ccf);}}async[_0x2d9ed0(0x3f5,0x45d)](_0x2e8607){function _0x491f07(_0x34de8b,_0x394240){return _0x1cc1(_0x34de8b- -0x50,_0x394240);}try{await this['httpClient']['post']('/auth/v1/reset-password',{'email':_0x2e8607});}catch(_0x255428){throw this[_0x491f07(0x104,0x16f)](_0x255428);}}async['updateUser'](data){function _0x48bdab(_0x1e08c3,_0x321fe8){return _0x1cc1(_0x1e08c3-0x6c,_0x321fe8);}try{const response=await this['httpClient'][_0x48bdab(0x28a,0x2a0)]('/auth/v1/user',data);return response[_0x48bdab(0x273,0x2dd)][_0x48bdab(0x1dc,0x1d1)];}catch(_0x26f253){throw this[_0x48bdab(0x1c0,0x1cb)](_0x26f253);}}[_0x2d9ed0(0x35d,0x3e1)](){function _0x1727bd(_0x4266c2,_0x219175){return _0x1cc1(_0x219175-0x77,_0x4266c2);}return this[_0x1727bd(0x1d3,0x1cc)];}[_0x2d9ed0(0x41d,0x3ee)](_0x5046fb){this['currentSession']=_0x5046fb;function _0x4e45df(_0x7d7906,_0x4af624){return _0x1cc1(_0x7d7906-0x32,_0x4af624);}this[_0x4e45df(0x1d5,0x1a2)]['setAuthToken'](_0x5046fb[_0x4e45df(0x1e3,0x17d)]),typeof localStorage!==_0x4e45df(0x1b4,0x217)&&localStorage[_0x4e45df(0x21a,0x231)](_0x4e45df(0x1e8,0x163),JSON['stringify'](_0x5046fb));}['onAuthStateChange'](_0x177cce){return()=>{};}[_0x2d9ed0(0x419,0x453)](_0x42dd60){this['workspaceId']=_0x42dd60;}['setSessionInternal'](_0x2c634e){function _0x2b82aa(_0x134eb2,_0xf593fc){return _0x1cc1(_0xf593fc-0x7d,_0x134eb2);}this['currentSession']=_0x2c634e,this[_0x2b82aa(0x268,0x220)]['setAuthToken'](_0x2c634e['access_token']),typeof localStorage!==_0x2b82aa(0x1a7,0x1ff)&&localStorage['setItem']('ebaas.auth.session',JSON[_0x2b82aa(0x1ed,0x1be)](_0x2c634e));}[_0x2d9ed0(0x446,0x494)](){function _0x4a30eb(_0x3bc185,_0x4364e9){return _0x1cc1(_0x4364e9-0x3c6,_0x3bc185);}this['currentSession']=null,this['httpClient']['removeAuthToken'](),typeof localStorage!==_0x4a30eb(0x59c,0x548)&&localStorage['removeItem'](_0x4a30eb(0x558,0x57c));}['loadSession'](){function _0x4d688a(_0x5084ae,_0x2ee56b){return _0x1cc1(_0x5084ae- -0x3b9,_0x2ee56b);}if(typeof localStorage!==_0x4d688a(-0x237,-0x24f)){const _0x487909=localStorage['getItem'](_0x4d688a(-0x203,-0x225));if(_0x487909)try{const _0x1d058d=JSON['parse'](_0x487909);this['setSessionInternal'](_0x1d058d);}catch(_0x398a2c){this[_0x4d688a(-0x184,-0x160)]();}}}[_0x2d9ed0(0x365,0x33b)](_0x39d41a){if(_0x39d41a instanceof EBaaSError)return _0x39d41a;function _0x588f55(_0x548a5b,_0x2720c0){return _0x1cc1(_0x548a5b-0x236,_0x2720c0);}return new EBaaSError(_0x39d41a['message']||_0x588f55(0x413,0x46e),_0x39d41a['status']||0x0,_0x39d41a);}}class QueryBuilder{constructor(_0x557821,_0xfb5267,_0x5531b5,_0x5330d5){this[_0x34c433(-0x16b,-0x17e)]=_0x557821;function _0x34c433(_0x15a5bd,_0x3ff152){return _0x1cc1(_0x3ff152- -0x321,_0x15a5bd);}this[_0x34c433(-0x111,-0x178)]=_0xfb5267,this['schema']=_0x5531b5,this['workspaceId']=_0x5330d5,this['query']={'filters':[]};}['select'](_0xe39d8e='*',_0x5d6296){function _0x29cf52(_0x2810c1,_0x27d54d){return _0x1cc1(_0x2810c1-0x3e2,_0x27d54d);}return this[_0x29cf52(0x5e0,0x596)]['select']=_0xe39d8e,this;}[_0x2d9ed0(0x3c1,0x33f)](data,_0x3ddf8a){function _0x46b168(_0x4b0c96,_0x1bbe13){return _0x1cc1(_0x1bbe13-0x10d,_0x4b0c96);}return this['executeQuery']('POST',_0x46b168(0x28a,0x2c8)+this['table']+'?operation=insert',{'data':data,'options':_0x3ddf8a});}[_0x2d9ed0(0x3cb,0x37b)](data,_0x47e7f4){function _0x2ec773(_0x2a3a2c,_0x1c6e03){return _0x1cc1(_0x2a3a2c- -0x2c,_0x1c6e03);}return this['query'][_0x2ec773(0x16b,0xfd)]=data,this['query'][_0x2ec773(0x12c,0x115)]=_0x47e7f4,this;}['upsert'](data,_0x1bc05c){return this['executeQuery']('POST','/sdk/v1/'+this['table']+'?operation=upsert',{'data':data,'options':{..._0x1bc05c,'upsert':!![]}});}['delete'](_0x258a4f){this['query']['deleteOptions']=_0x258a4f;function _0x31581e(_0x22a440,_0x957d45){return _0x1cc1(_0x957d45-0x71,_0x22a440);}return this[_0x31581e(0x21a,0x26f)]['isDelete']=!![],this;}['eq'](_0x4b2289,_0x16f199){function _0x38e2af(_0x425082,_0x1ab011){return _0x1cc1(_0x1ab011-0x1f6,_0x425082);}return this[_0x38e2af(0x3bd,0x3f4)][_0x38e2af(0x2f1,0x340)]['push']({'column':_0x4b2289,'operator':'eq','value':_0x16f199}),this;}[_0x2d9ed0(0x38e,0x408)](_0x305547,_0x321aaa){function _0x552fa9(_0x3a35c7,_0x12a9f4){return _0x1cc1(_0x3a35c7-0x2e,_0x12a9f4);}return this[_0x552fa9(0x22c,0x1a8)]['filters'][_0x552fa9(0x170,0x183)]({'column':_0x305547,'operator':_0x552fa9(0x1ab,0x1bc),'value':_0x321aaa}),this;}['gt'](_0xdc734d,_0x20c06d){this[_0x22ccf2(-0x14,-0x85)]['filters']['push']({'column':_0xdc734d,'operator':'gt','value':_0x20c06d});function _0x22ccf2(_0x10ba40,_0x392fba){return _0x1cc1(_0x10ba40- -0x212,_0x392fba);}return this;}[_0x2d9ed0(0x373,0x3b1)](_0x4d00ac,_0x3a4205){function _0x21e348(_0x4129d4,_0x3e4764){return _0x1cc1(_0x4129d4- -0x263,_0x3e4764);}return this['query'][_0x21e348(-0x119,-0x159)]['push']({'column':_0x4d00ac,'operator':_0x21e348(-0x101,-0xa8),'value':_0x3a4205}),this;}['lt'](_0x45c6c1,_0x78cb3b){return this['query']['filters']['push']({'column':_0x45c6c1,'operator':'lt','value':_0x78cb3b}),this;}[_0x2d9ed0(0x39d,0x389)](_0x5a71da,_0x46ffcb){function _0x1f1943(_0x1701dc,_0x5b7001){return _0x1cc1(_0x5b7001-0xeb,_0x1701dc);}return this['query']['filters']['push']({'column':_0x5a71da,'operator':_0x1f1943(0x231,0x277),'value':_0x46ffcb}),this;}[_0x2d9ed0(0x414,0x3e9)](_0x39826a,_0x29cbd6){return this['query']['filters']['push']({'column':_0x39826a,'operator':'like','value':_0x29cbd6}),this;}[_0x2d9ed0(0x436,0x3ca)](_0x3bc5e4,_0x14ff70){function _0x4c06dc(_0x1214aa,_0x3a0770){return _0x1cc1(_0x1214aa-0x3bf,_0x3a0770);}return this[_0x4c06dc(0x5bd,0x616)][_0x4c06dc(0x509,0x49f)][_0x4c06dc(0x501,0x568)]({'column':_0x3bc5e4,'operator':_0x4c06dc(0x5e4,0x56a),'value':_0x14ff70}),this;}['is'](_0x35b156,_0x21ff9e){function _0x3914e0(_0xb745d4,_0x15df31){return _0x1cc1(_0x15df31- -0x13b,_0xb745d4);}return this[_0x3914e0(0x66,0xc3)]['filters']['push']({'column':_0x35b156,'operator':'is','value':_0x21ff9e}),this;}['in'](_0x2707f8,_0x5e5263){function _0xaad54e(_0x1b6e57,_0x18b8c1){return _0x1cc1(_0x18b8c1-0xdc,_0x1b6e57);}return this[_0xaad54e(0x2a8,0x2da)]['filters'][_0xaad54e(0x216,0x21e)]({'column':_0x2707f8,'operator':'in','value':_0x5e5263}),this;}['contains'](_0x527673,_0x41ec5f){function _0x199097(_0x493b15,_0x399712){return _0x1cc1(_0x399712-0xf0,_0x493b15);}return this[_0x199097(0x27d,0x2ee)]['filters'][_0x199097(0x1c5,0x232)]({'column':_0x527673,'operator':'contains','value':_0x41ec5f}),this;}[_0x2d9ed0(0x432,0x422)](_0x56a2e3){Object['entries'](_0x56a2e3)[_0x5bf32b(0x1fd,0x273)](([_0x12af96,_0x455042])=>{this['eq'](_0x12af96,_0x455042);});function _0x5bf32b(_0x23d8f0,_0x4b2f25){return _0x1cc1(_0x4b2f25-0x10f,_0x23d8f0);}return this;}[_0x2d9ed0(0x41f,0x428)](_0x53b542,_0x10ce8d){function _0x4f610a(_0x2025b7,_0x53239d){return _0x1cc1(_0x2025b7- -0x4c,_0x53239d);}return!this['query'][_0x4f610a(0x1c2,0x1fe)]&&(this[_0x4f610a(0x1b2,0x21d)][_0x4f610a(0x1c2,0x1cf)]=[]),this[_0x4f610a(0x1b2,0x19f)]['order']['push']({'column':_0x53b542,'ascending':_0x10ce8d?.[_0x4f610a(0x186,0x16a)]!==![]}),this;}[_0x2d9ed0(0x349,0x3c9)](count){return this['query']['limit']=count,this;}['range'](from,_0x3766ec){function _0x2dea41(_0x1dfdcd,_0x1211e7){return _0x1cc1(_0x1dfdcd-0x1ad,_0x1211e7);}return this['query'][_0x2dea41(0x3d6,0x3d0)]={'from':from,'to':_0x3766ec},this;}async[_0x2d9ed0(0x39a,0x39e)](){function _0xf4767c(_0x1fff8b,_0x35aa86){return _0x1cc1(_0x35aa86- -0x1ef,_0x1fff8b);}if(this['query']['updateData'])return this[_0xf4767c(0x5d,-0x6)]('PATCH',_0xf4767c(0x3c,-0x34)+this['table'],{'data':this['query']['updateData'],'options':this['query']['updateOptions'],'filters':this[_0xf4767c(-0x63,0xf)][_0xf4767c(-0x99,-0xa5)]});else return this[_0xf4767c(-0xd,0xf)]['isDelete']?this[_0xf4767c(-0x5a,-0x6)]('DELETE',_0xf4767c(0x4c,-0x34)+this[_0xf4767c(-0x37,-0x46)]+'?operation=delete',{'options':this[_0xf4767c(-0x11,0xf)][_0xf4767c(-0xb8,-0x32)],'filters':this['query'][_0xf4767c(-0x8d,-0xa5)]}):this[_0xf4767c(0x7b,-0x6)]('GET',_0xf4767c(-0x13,-0x34)+this['table']+'?operation=select',{'select':this[_0xf4767c(0x3e,0xf)]['select'],'filters':this['query']['filters'],'order':this['query'][_0xf4767c(0x58,0x1f)],'limit':this['query']['limit'],'range':this['query'][_0xf4767c(0x21,0x3a)]});}async['single'](){this[_0x589e13(-0x83,-0x5e)](0x1);function _0x589e13(_0x5ed4f8,_0x13d447){return _0x1cc1(_0x5ed4f8- -0x1bb,_0x13d447);}const result=await this[_0x589e13(-0x32,-0xf)]();return{'data':result[_0x589e13(0x4c,0x97)]?.[0x0]||null,'error':result[_0x589e13(-0x2b,-0x17)]};}async[_0x2d9ed0(0x3fa,0x47c)](_0x4b6732,_0x48a9fe,_0x18ba05){function _0x1c0892(_0x3dd93f,_0x5cde45){return _0x1cc1(_0x5cde45-0x236,_0x3dd93f);}try{let response;const headers={};this[_0x1c0892(0x3cd,0x3e2)]&&(headers['x-workspace-id']=this['workspaceId']);if(_0x4b6732==='GET'){const _0x5578c0=_0x48a9fe['split']('?'),_0x5119ff=_0x5578c0[0x0],existingParams=new URLSearchParams(_0x5578c0[0x1]||'');if(_0x18ba05[_0x1c0892(0x398,0x37f)])existingParams[_0x1c0892(0x3d2,0x42b)](_0x1c0892(0x3ce,0x37f),_0x18ba05['select']);_0x18ba05['filters']?.['length']&&_0x18ba05['filters']['forEach'](filter=>{function _0x1762f8(_0x3bb321,_0x5d4d01){return _0x1cc1(_0x5d4d01- -0x34c,_0x3bb321);}existingParams[_0x1762f8(-0x13e,-0x157)](filter[_0x1762f8(-0x1c3,-0x184)],filter['operator']+'.'+filter['value']);});if(_0x18ba05['order']?.['length']){const orderStr=_0x18ba05[_0x1c0892(0x497,0x444)]['map'](_0x35946c=>''+_0x35946c['column']+(_0x35946c[_0x1c0892(0x3f1,0x408)]?'.asc':_0x1c0892(0x39e,0x405)))[_0x1c0892(0x417,0x38f)](',');existingParams[_0x1c0892(0x3e6,0x42b)]('order',orderStr);}if(_0x18ba05[_0x1c0892(0x309,0x36e)])existingParams['append'](_0x1c0892(0x325,0x36e),_0x18ba05['limit']['toString']());_0x18ba05[_0x1c0892(0x4e0,0x45f)]&&(existingParams['append']('offset',_0x18ba05['range'][_0x1c0892(0x435,0x450)]['toString']()),existingParams['append'](_0x1c0892(0x31b,0x36e),(_0x18ba05['range']['to']-_0x18ba05[_0x1c0892(0x439,0x45f)][_0x1c0892(0x3ce,0x450)]+0x1)[_0x1c0892(0x3a1,0x391)]())),response=await this['httpClient'][_0x1c0892(0x394,0x40e)](_0x5119ff+'?'+existingParams['toString'](),{'headers':headers});}else{if(_0x4b6732==='DELETE'){const _0x1c24cd=_0x48a9fe['split']('?'),_0x4c6e91=_0x1c24cd[0x0],existingParams=new URLSearchParams(_0x1c24cd[0x1]||'');!existingParams[_0x1c0892(0x3a0,0x3a8)](_0x1c0892(0x44e,0x40c))&&existingParams['append']('operation',_0x1c0892(0x387,0x400));_0x18ba05['filters']?.['length']&&_0x18ba05[_0x1c0892(0x388,0x380)]['forEach'](filter=>{function _0x25d054(_0x3a8d8b,_0x37c200){return _0x1cc1(_0x3a8d8b- -0x3a9,_0x37c200);}existingParams[_0x25d054(-0x1b4,-0x150)](filter[_0x25d054(-0x1e1,-0x256)],filter[_0x25d054(-0x25a,-0x229)]+'.'+filter[_0x25d054(-0x1eb,-0x202)]);});const deleteUrl=_0x4c6e91+'?'+existingParams[_0x1c0892(0x321,0x391)]();console[_0x1c0892(0x4b2,0x455)]('\uD83D\uDD27 DELETE URL construída:',deleteUrl),console['log']('\uD83D\uDD27 DELETE headers:',headers),console[_0x1c0892(0x3eb,0x455)]('\uD83D\uDD27 DELETE filtros originais:',_0x18ba05[_0x1c0892(0x3c4,0x380)]),response=await this['httpClient']['delete'](deleteUrl,{'headers':headers});}else{if(_0x4b6732==='PATCH'){const _0x568901=_0x48a9fe[_0x1c0892(0x493,0x41b)]('?'),_0x4f6429=_0x568901[0x0],existingParams=new URLSearchParams(_0x568901[0x1]||'');!existingParams['has']('operation')&&existingParams[_0x1c0892(0x461,0x42b)]('operation','update');_0x18ba05['filters']?.[_0x1c0892(0x4be,0x470)]&&_0x18ba05[_0x1c0892(0x30d,0x380)][_0x1c0892(0x31d,0x39a)](filter=>{function _0x5daf2(_0x45e6fd,_0x35ed0b){return _0x1cc1(_0x45e6fd- -0x19c,_0x35ed0b);}existingParams['append'](filter[_0x5daf2(0x2c,-0x4d)],filter[_0x5daf2(-0x4d,-0xaf)]+'.'+filter['value']);});_0x18ba05[_0x1c0892(0x3bf,0x41c)]?.[_0x1c0892(0x427,0x44c)]&&(headers['Prefer']=_0x18ba05['options']['prefer']);const updateUrl=_0x4f6429+'?'+existingParams[_0x1c0892(0x343,0x391)]();response=await this['httpClient']['patch'](updateUrl,_0x18ba05[_0x1c0892(0x498,0x43d)],{'headers':headers});}else{let _0x429e45=_0x18ba05[_0x1c0892(0x484,0x43d)];!headers['Prefer']&&(headers[_0x1c0892(0x350,0x3cb)]='return=representation'),_0x18ba05[_0x1c0892(0x414,0x41c)]?.[_0x1c0892(0x3b7,0x3c0)]&&(headers[_0x1c0892(0x42e,0x3cb)]=_0x1c0892(0x43a,0x44f)),_0x18ba05['dataArray']&&(_0x429e45=_0x18ba05['dataArray']),response=await this[_0x1c0892(0x447,0x3d9)]['post'](_0x48a9fe,_0x429e45,{'headers':headers});}}}return{'data':response[_0x1c0892(0x462,0x43d)],'error':null,'count':response[_0x1c0892(0x42b,0x456)]?.[_0x1c0892(0x459,0x3f7)]?parseInt(response[_0x1c0892(0x483,0x456)][_0x1c0892(0x3f8,0x3f7)]):undefined};}catch(_0x1a2cfb){return{'data':null,'error':_0x1a2cfb instanceof EBaaSError?_0x1a2cfb:new EBaaSError(_0x1a2cfb instanceof Error?_0x1a2cfb['message']:_0x1c0892(0x418,0x448),0x0,_0x1a2cfb)};}}}class CustomDatabaseManager{constructor(_0x4ebea5,_0x3c1dbd){this['httpClient']=_0x4ebea5,this['workspaceId']=_0x3c1dbd;}async[_0x2d9ed0(0x38a,0x346)](){function _0x378e1e(_0x3cd74e,_0x1358ab){return _0x1cc1(_0x3cd74e- -0x242,_0x1358ab);}if(!this[_0x378e1e(-0x96,-0x15)])return{'hasCustomDatabase':![]};try{const response=await this['httpClient'][_0x378e1e(-0x6a,0x11)]('/admin/v1/workspace/custom-database',{'headers':{'x-workspace-id':this['workspaceId']}});if(response[_0x378e1e(-0xcf,-0xa8)]===0xc8&&response['data']?.[_0x378e1e(-0xc8,-0x11d)]){const config=response[_0x378e1e(-0x3b,-0xc0)]['config'],_0x2be8c9={'host':config['postgresHost'],'port':config['postgresPort'],'database':config[_0x378e1e(-0xf5,-0x10f)],'username':config['postgresUsername'],'password':'','schema':config['postgresSchema'],'sslEnabled':config['sslEnabled']};return this[_0x378e1e(-0xb4,-0xb8)]={'hasCustomDatabase':!![],'config':config,'credentials':_0x2be8c9},this['detectedConfig'];}}catch(_0x2cfd03){if(_0x2cfd03?.['status']===0x194)return this['detectedConfig']={'hasCustomDatabase':![]},this['detectedConfig'];console['warn']('Failed to detect custom database configuration:',_0x2cfd03);}return this['detectedConfig']={'hasCustomDatabase':![]},this[_0x378e1e(-0xb4,-0xeb)];}async[_0x2d9ed0(0x3d5,0x36d)](_0x42baff){function _0x4f9ad7(_0xfeb35,_0x13dc80){return _0x1cc1(_0xfeb35-0x128,_0x13dc80);}try{const response=await this['httpClient'][_0x4f9ad7(0x2c8,0x283)]('/admin/v1/workspace/custom-database/test-connection',_0x42baff,{'headers':this[_0x4f9ad7(0x2d4,0x2c5)]?{'X-Workspace-ID':this[_0x4f9ad7(0x2d4,0x2f2)]}:{}});return response[_0x4f9ad7(0x32f,0x3b3)];}catch(_0x3c6348){return{'success':![],'message':_0x3c6348?.['message']||_0x4f9ad7(0x360,0x370)};}}async[_0x2d9ed0(0x385,0x32b)](_0x2a385e){if(!this[_0x4393f0(0xdf,0x13e)])throw new Error('Workspace ID is required to configure custom database');const response=await this[_0x4393f0(0x1b1,0x135)][_0x4393f0(0x134,0x132)]('/admin/v1/workspace/custom-database',{'workspaceId':this[_0x4393f0(0x128,0x13e)],..._0x2a385e},{'headers':{'X-Workspace-ID':this['workspaceId']}}),config=response['data']['config'];function _0x4393f0(_0x5acd09,_0x254582){return _0x1cc1(_0x254582- -0x6e,_0x5acd09);}return this['detectedConfig']={'hasCustomDatabase':!![],'config':config,'credentials':_0x2a385e},config;}async['removeCustomDatabase'](){if(!this['workspaceId'])throw new Error('Workspace ID is required to remove custom database');await this['httpClient']['delete']('/admin/v1/workspace/custom-database',{'headers':{'X-Workspace-ID':this['workspaceId']}}),this['detectedConfig']={'hasCustomDatabase':![]};}[_0x2d9ed0(0x3b8,0x3f4)](){return this['detectedConfig'];}[_0x2d9ed0(0x392,0x37a)](){return this['detectedConfig']?.['hasCustomDatabase']??![];}[_0x2d9ed0(0x420,0x449)](){function _0x473745(_0x348e84,_0x5a5767){return _0x1cc1(_0x5a5767- -0x1f2,_0x348e84);}return this['detectedConfig']?.[_0x473745(0xa,0x18)];}['setWorkspaceId'](_0xda1eb){function _0x122587(_0x1aa1aa,_0x213c16){return _0x1cc1(_0x213c16-0x1bd,_0x1aa1aa);}this['workspaceId']=_0xda1eb,this[_0x122587(0x2de,0x34b)]=undefined;}[_0x2d9ed0(0x3b9,0x335)](){function _0x62e7e3(_0x401528,_0x453b78){return _0x1cc1(_0x453b78-0xb4,_0x401528);}return this[_0x62e7e3(0x2a8,0x260)];}[_0x2d9ed0(0x38d,0x335)](){function _0x20fffa(_0x427792,_0x175990){return _0x1cc1(_0x427792- -0x25,_0x175990);}return{'workspaceId':this['workspaceId'],'hasConfig':this[_0x20fffa(0x15c,0x149)](),'configDetails':this[_0x20fffa(0x169,0x127)]?.['credentials']?{'host':this['detectedConfig'][_0x20fffa(0x1e5,0x232)][_0x20fffa(0x117,0xed)],'port':this['detectedConfig']['credentials'][_0x20fffa(0x12d,0x1a3)],'database':this['detectedConfig'][_0x20fffa(0x1e5,0x1a9)][_0x20fffa(0x1a7,0x13c)],'schema':this['detectedConfig']['credentials'][_0x20fffa(0x1a4,0x175)]||'public','sslEnabled':this['detectedConfig'][_0x20fffa(0x1e5,0x1dd)][_0x20fffa(0x20e,0x232)]||![]}:undefined};}}class DatabaseClient{constructor(_0x83f18f,_0x1103bd){this['httpClient']=_0x83f18f,this['customDatabaseManager']=new CustomDatabaseManager(_0x83f18f,_0x1103bd);}[_0x2d9ed0(0x42b,0x424)](_0x3dd9e0){function _0x54e761(_0x4aa470,_0xa0942d){return _0x1cc1(_0x4aa470-0x293,_0xa0942d);}return new QueryBuilder(this[_0x54e761(0x436,0x4b7)],_0x3dd9e0,this['currentSchema'],this[_0x54e761(0x494,0x4ff)][_0x54e761(0x43b,0x479)]());}['rpc'](_0x2fa189,_0x28e7d3){function _0x2cbdb5(_0x448463,_0x11081f){return _0x1cc1(_0x448463-0x356,_0x11081f);}return this[_0x2cbdb5(0x4f9,0x4e7)][_0x2cbdb5(0x4f6,0x4cf)]('/rpc/'+_0x2fa189,_0x28e7d3);}[_0x2d9ed0(0x3da,0x43b)](_0x38e738){function _0x176f48(_0x42d677,_0x2ff6f5){return _0x1cc1(_0x2ff6f5- -0xf2,_0x42d677);}const _0x314f80=new DatabaseClient(this[_0x176f48(0x48,0xb1)],this['customDatabaseManager'][_0x176f48(0xf5,0xb6)]());return _0x314f80[_0x176f48(0x44,0x7a)]=_0x38e738,_0x314f80['customDatabaseManager']=this['customDatabaseManager'],_0x314f80;}async['detectCustomDatabase'](){function _0xb4a1d7(_0x2bf064,_0x578e90){return _0x1cc1(_0x578e90-0x275,_0x2bf064);}return this[_0xb4a1d7(0x44a,0x476)][_0xb4a1d7(0x44b,0x3ee)]();}async[_0x2d9ed0(0x346,0x2da)](_0x52d75b){return this['customDatabaseManager']['testConnection'](_0x52d75b);}async[_0x2d9ed0(0x385,0x332)](_0x2d2d24){function _0x477438(_0x47bcac,_0x59ebf1){return _0x1cc1(_0x47bcac-0x105,_0x59ebf1);}return this[_0x477438(0x306,0x282)]['configureCustomDatabase'](_0x2d2d24);}async['removeCustomDatabase'](){function _0x34548c(_0x491872,_0x4c5cb7){return _0x1cc1(_0x491872- -0x3ad,_0x4c5cb7);}return this[_0x34548c(-0x1ac,-0x187)]['removeCustomDatabase']();}['isUsingCustomDatabase'](){function _0x1f125c(_0x189792,_0x5a4055){return _0x1cc1(_0x189792-0x318,_0x5a4055);}return this['customDatabaseManager'][_0x1f125c(0x499,0x4db)]();}['getCustomDatabaseStatus'](){return this['customDatabaseManager']['getStatus']();}[_0x2d9ed0(0x419,0x496)](_0x31205b){this['customDatabaseManager']['setWorkspaceId'](_0x31205b);}async[_0x2d9ed0(0x434,0x4a1)](){function _0x1b3238(_0x908072,_0xb1935c){return _0x1cc1(_0x908072-0x42,_0xb1935c);}try{await this[_0x1b3238(0x243,0x22c)]['detectCustomDatabase']();}catch(_0x5ec993){console[_0x1b3238(0x25d,0x295)]('Failed to initialize custom database detection:',_0x5ec993);}}}class StorageBucket{constructor(_0x4629a6,bucketId){this['httpClient']=_0x4629a6;function _0x48b0a2(_0x4c7ffb,_0x33b3a2){return _0x1cc1(_0x33b3a2-0xc6,_0x4c7ffb);}this[_0x48b0a2(0x289,0x203)]=bucketId;}async['upload'](_0x4e6008,_0x17686e,_0x3dc09a){function _0x3a77d5(_0x2aa567,_0x3561b8){return _0x1cc1(_0x3561b8- -0x1e3,_0x2aa567);}try{const _0x21959e=new FormData();if(_0x17686e instanceof File)_0x21959e['append']('file',_0x17686e);else{if(_0x17686e instanceof Blob)_0x21959e[_0x3a77d5(0x5a,0x12)](_0x3a77d5(-0xe3,-0x5f),_0x17686e,_0x4e6008);else{if(_0x17686e instanceof ArrayBuffer)_0x21959e['append']('file',new Blob([_0x17686e]),_0x4e6008);else typeof _0x17686e==='string'&&_0x21959e[_0x3a77d5(-0x43,0x12)]('file',new Blob([_0x17686e],{'type':_0x3a77d5(0xc6,0x4c)}),_0x4e6008);}}_0x21959e[_0x3a77d5(0x26,0x12)]('path',_0x4e6008);_0x3dc09a?.['cacheControl']&&_0x21959e['append']('cacheControl',_0x3dc09a[_0x3a77d5(-0xa4,-0x30)]);_0x3dc09a?.[_0x3a77d5(-0x9,0x59)]&&_0x21959e[_0x3a77d5(-0x35,0x12)](_0x3a77d5(-0x4,0x59),_0x3dc09a['contentType']);_0x3dc09a?.['metadata']&&_0x21959e[_0x3a77d5(-0xe,0x12)](_0x3a77d5(-0x1a,-0x7b),JSON['stringify'](_0x3dc09a[_0x3a77d5(-0x19,-0x7b)]));const _0x55fd25=_0x3a77d5(0xc9,0x56)+this['bucketId']+'/files'+(_0x3dc09a?.['upsert']?'?upsert=true':''),response=await this[_0x3a77d5(-0xc2,-0x40)]['post'](_0x55fd25,_0x21959e,{'headers':{'Content-Type':_0x3a77d5(-0x20,-0x23)}});return{'data':response['data'],'error':null};}catch(_0x758307){return{'data':null,'error':_0x758307 instanceof EBaaSError?_0x758307:new EBaaSError(_0x758307 instanceof Error?_0x758307['message']:'Failed\x20to\x20upload\x20file',0x0,_0x758307)};}}async[_0x2d9ed0(0x43d,0x435)](_0x5ec4bc,_0x17ff35){function _0x369f1e(_0x561f00,_0x42eeec){return _0x1cc1(_0x42eeec-0x2fa,_0x561f00);}try{const _0x181e05=new URLSearchParams();_0x17ff35?.[_0x369f1e(0x474,0x481)]&&Object[_0x369f1e(0x453,0x497)](_0x17ff35['transform'])[_0x369f1e(0x41c,0x45e)](([_0x13384d,_0x2c6fad])=>{function _0x51c9c3(_0x1839ae,_0x678587){return _0x1cc1(_0x678587- -0x3c3,_0x1839ae);}_0x2c6fad!==undefined&&_0x181e05[_0x51c9c3(-0x1a1,-0x1ce)](_0x13384d,String(_0x2c6fad));});const _0x5df430=_0x369f1e(0x519,0x533)+this[_0x369f1e(0x440,0x437)]+_0x369f1e(0x482,0x4ca)+_0x5ec4bc+(_0x181e05[_0x369f1e(0x42b,0x455)]()?'?'+_0x181e05[_0x369f1e(0x477,0x455)]():''),response=await this['httpClient']['get'](_0x5df430,{'responseType':'blob'});return{'data':response['data'],'error':null};}catch(_0x1ed4e0){return{'data':null,'error':_0x1ed4e0 instanceof EBaaSError?_0x1ed4e0:new EBaaSError(_0x1ed4e0 instanceof Error?_0x1ed4e0['message']:'Failed\x20to\x20download\x20file',0x0,_0x1ed4e0)};}}async['list'](_0x14618d,_0x2adb55){function _0x4bb1b3(_0x3f0685,_0x2fc584){return _0x1cc1(_0x2fc584-0xb3,_0x3f0685);}try{const _0x2d7327=new URLSearchParams();_0x14618d&&_0x2d7327['append'](_0x4bb1b3(0x1b4,0x239),_0x14618d);_0x2adb55?.['limit']&&_0x2d7327[_0x4bb1b3(0x29f,0x2a8)]('limit',String(_0x2adb55[_0x4bb1b3(0x23e,0x1eb)]));_0x2adb55?.[_0x4bb1b3(0x21e,0x258)]&&_0x2d7327[_0x4bb1b3(0x2a1,0x2a8)]('offset',String(_0x2adb55[_0x4bb1b3(0x24a,0x258)]));_0x2adb55?.[_0x4bb1b3(0x278,0x238)]&&_0x2d7327[_0x4bb1b3(0x32c,0x2a8)](_0x4bb1b3(0x1b2,0x238),JSON['stringify'](_0x2adb55[_0x4bb1b3(0x2b0,0x238)]));_0x2adb55?.['search']&&_0x2d7327[_0x4bb1b3(0x29e,0x2a8)]('search',_0x2adb55[_0x4bb1b3(0x26e,0x27a)]);const _0x1bd955=_0x4bb1b3(0x327,0x2ec)+this[_0x4bb1b3(0x199,0x1f0)]+'/files'+(_0x2d7327[_0x4bb1b3(0x23b,0x20e)]()?'?'+_0x2d7327['toString']():''),response=await this[_0x4bb1b3(0x229,0x256)][_0x4bb1b3(0x259,0x28b)](_0x1bd955);return{'data':response['data'],'error':null};}catch(_0x15f9cf){return{'data':null,'error':_0x15f9cf instanceof EBaaSError?_0x15f9cf:new EBaaSError(_0x15f9cf instanceof Error?_0x15f9cf[_0x4bb1b3(0x1df,0x1ea)]:'Failed\x20to\x20list\x20files',0x0,_0x15f9cf)};}}async['remove'](_0xb2201a){function _0x25c3d5(_0x5cc73c,_0x54f1aa){return _0x1cc1(_0x54f1aa-0x340,_0x5cc73c);}try{const response=await this['httpClient']['delete']('/storage/buckets/'+this[_0x25c3d5(0x462,0x47d)]+_0x25c3d5(0x55c,0x520),{'data':{'paths':_0xb2201a}});return{'data':response['data'],'error':null};}catch(_0x4698a1){return{'data':null,'error':_0x4698a1 instanceof EBaaSError?_0x4698a1:new EBaaSError(_0x4698a1 instanceof Error?_0x4698a1['message']:'Failed\x20to\x20remove\x20files',0x0,_0x4698a1)};}}async['move'](fromPath,_0x19cdfc){function _0x44dcd7(_0xde467,_0x460989){return _0x1cc1(_0x460989- -0x1fd,_0xde467);}try{const response=await this[_0x44dcd7(-0x47,-0x5a)][_0x44dcd7(0x1b,-0x5d)](_0x44dcd7(0x64,0x3c)+this['bucketId']+_0x44dcd7(-0x11b,-0x94),{'sourceKey':fromPath,'destinationKey':_0x19cdfc});return{'data':response['data'],'error':null};}catch(_0x3f83af){return{'data':null,'error':_0x3f83af instanceof EBaaSError?_0x3f83af:new EBaaSError(_0x3f83af instanceof Error?_0x3f83af[_0x44dcd7(-0x66,-0xc6)]:_0x44dcd7(-0xe4,-0x8c),0x0,_0x3f83af)};}}async['copy'](fromPath,_0x1f5ebe){function _0x1640c8(_0x218cca,_0x5d53c6){return _0x1cc1(_0x5d53c6-0x1dd,_0x218cca);}try{const response=await this['httpClient']['post']('/storage/buckets/'+this[_0x1640c8(0x2cb,0x31a)]+_0x1640c8(0x37c,0x395),{'sourceKey':fromPath,'destinationKey':_0x1f5ebe});return{'data':response[_0x1640c8(0x45e,0x3e4)],'error':null};}catch(_0x4c9093){return{'data':null,'error':_0x4c9093 instanceof EBaaSError?_0x4c9093:new EBaaSError(_0x4c9093 instanceof Error?_0x4c9093[_0x1640c8(0x383,0x314)]:'Failed\x20to\x20copy\x20file',0x0,_0x4c9093)};}}async[_0x2d9ed0(0x3e4,0x398)](_0x3eb838,_0x32a2ac,_0x4b8930){function _0x2dcfab(_0x43f931,_0x2f2d9b){return _0x1cc1(_0x2f2d9b-0x2ca,_0x43f931);}try{const response=await this['httpClient']['post']('/storage/buckets/'+this['bucketId']+_0x2dcfab(0x425,0x49a)+_0x3eb838+_0x2dcfab(0x42d,0x41d),{'expiresIn':_0x32a2ac,..._0x4b8930});return{'data':response[_0x2dcfab(0x529,0x4d1)],'error':null};}catch(_0x58d24c){return{'data':null,'error':_0x58d24c instanceof EBaaSError?_0x58d24c:new EBaaSError(_0x58d24c instanceof Error?_0x58d24c[_0x2dcfab(0x3d2,0x401)]:'Failed\x20to\x20create\x20signed\x20URL',0x0,_0x58d24c)};}}[_0x2d9ed0(0x359,0x354)](_0x56c1c1,_0x35e71d){const _0x5562e2=new URLSearchParams();function _0xfc79cf(_0x3d93c3,_0x5cb1d6){return _0x1cc1(_0x3d93c3- -0x30c,_0x5cb1d6);}_0x35e71d?.['transform']&&Object['entries'](_0x35e71d['transform'])[_0xfc79cf(-0x1a8,-0x140)](([_0xdc9650,_0x2e6ea4])=>{function _0x1358ff(_0x565c5d,_0x29881a){return _0x1cc1(_0x565c5d-0x111,_0x29881a);}_0x2e6ea4!==undefined&&_0x5562e2[_0x1358ff(0x306,0x298)](_0xdc9650,String(_0x2e6ea4));});const _0xc4026d=this[_0xfc79cf(-0x169,-0x12b)]['baseURL']||'',_0x28a624=_0xc4026d+_0xfc79cf(-0xd3,-0x60)+this['bucketId']+'/files/'+_0x56c1c1+(_0x5562e2['toString']()?'?'+_0x5562e2['toString']():'');return{'data':{'publicUrl':_0x28a624}};}async['getFileInfo'](_0x4cdf2f){function _0x2a199b(_0x38e755,_0x486253){return _0x1cc1(_0x486253- -0x1fe,_0x38e755);}try{const response=await this['httpClient'][_0x2a199b(0xd,-0x26)](_0x2a199b(0x2d,0x3b)+this['bucketId']+'/files/'+_0x4cdf2f+'/info');return{'data':response[_0x2a199b(0x80,0x9)],'error':null};}catch(_0x3a6ab9){return{'data':null,'error':_0x3a6ab9 instanceof EBaaSError?_0x3a6ab9:new EBaaSError(_0x3a6ab9 instanceof Error?_0x3a6ab9['message']:'Failed\x20to\x20get\x20file\x20info',0x0,_0x3a6ab9)};}}async[_0x2d9ed0(0x367,0x311)](_0xb15f88,metadata){function _0x229dfa(_0x14b1c3,_0x2d1c8c){return _0x1cc1(_0x2d1c8c-0x37a,_0x14b1c3);}try{const response=await this[_0x229dfa(0x4a7,0x51d)]['put'](_0x229dfa(0x547,0x5b3)+this['bucketId']+'/files/'+_0xb15f88+'/metadata',{'metadata':metadata});return{'data':response['data'],'error':null};}catch(_0x12825e){return{'data':null,'error':_0x12825e instanceof EBaaSError?_0x12825e:new EBaaSError(_0x12825e instanceof Error?_0x12825e[_0x229dfa(0x502,0x4b1)]:_0x229dfa(0x5fb,0x583),0x0,_0x12825e)};}}}class StorageClient{constructor(_0xed8117){function _0x10c05c(_0x16f829,_0xa2bdde){return _0x1cc1(_0x16f829- -0x1d,_0xa2bdde);}this[_0x10c05c(0x186,0x177)]=_0xed8117;}[_0x2d9ed0(0x42b,0x3ff)](bucketId){return new StorageBucket(this['httpClient'],bucketId);}async['createBucket'](_0x49e764,_0x5e5188){function _0x5ead8b(_0x3f5995,_0x4359cf){return _0x1cc1(_0x3f5995- -0x1d3,_0x4359cf);}try{const response=await this[_0x5ead8b(-0x30,-0x9c)]['post']('/storage/buckets',{'id':_0x49e764,..._0x5e5188});return{'data':response[_0x5ead8b(0x34,-0x3f)],'error':null};}catch(_0x3a8cb2){return{'data':null,'error':_0x3a8cb2 instanceof EBaaSError?_0x3a8cb2:new EBaaSError(_0x3a8cb2 instanceof Error?_0x3a8cb2['message']:'Failed\x20to\x20create\x20bucket',0x0,_0x3a8cb2)};}}async[_0x2d9ed0(0x342,0x30d)](_0x483b86){function _0x8c09ed(_0x1f55b9,_0x4ac1df){return _0x1cc1(_0x4ac1df- -0x3a,_0x1f55b9);}try{const response=await this['httpClient']['get']('/storage/buckets/'+_0x483b86);return{'data':response[_0x8c09ed(0x1f0,0x1cd)],'error':null};}catch(_0x570b69){return{'data':null,'error':_0x570b69 instanceof EBaaSError?_0x570b69:new EBaaSError(_0x570b69 instanceof Error?_0x570b69['message']:'Failed\x20to\x20get\x20bucket',0x0,_0x570b69)};}}async['listBuckets'](){function _0x7efb1(_0x1e27a2,_0x1b1f20){return _0x1cc1(_0x1e27a2- -0x26e,_0x1b1f20);}try{const response=await this['httpClient']['get'](_0x7efb1(-0x93,-0x20));return{'data':response['data'],'error':null};}catch(_0x430c35){return{'data':null,'error':_0x430c35 instanceof EBaaSError?_0x430c35:new EBaaSError(_0x430c35 instanceof Error?_0x430c35[_0x7efb1(-0x137,-0x1a1)]:'Failed\x20to\x20list\x20buckets',0x0,_0x430c35)};}}async['updateBucket'](_0x2eebe5,_0x5b9353){function _0x369b95(_0x1a3efd,_0xdb4305){return _0x1cc1(_0xdb4305-0x12,_0x1a3efd);}try{const response=await this['httpClient'][_0x369b95(0x228,0x230)]('/storage/buckets/'+_0x2eebe5,_0x5b9353);return{'data':response['data'],'error':null};}catch(_0x328203){return{'data':null,'error':_0x328203 instanceof EBaaSError?_0x328203:new EBaaSError(_0x328203 instanceof Error?_0x328203['message']:'Failed\x20to\x20update\x20bucket',0x0,_0x328203)};}}async['deleteBucket'](_0x31ab27){function _0x4b084f(_0x5c1b96,_0x178dab){return _0x1cc1(_0x5c1b96- -0x132,_0x178dab);}try{const response=await this['httpClient'][_0x4b084f(0x98,0xeb)]('/storage/buckets/'+_0x31ab27);return{'data':response[_0x4b084f(0xd5,0x56)],'error':null};}catch(_0x8716ed){return{'data':null,'error':_0x8716ed instanceof EBaaSError?_0x8716ed:new EBaaSError(_0x8716ed instanceof Error?_0x8716ed[_0x4b084f(0x5,0x67)]:'Failed\x20to\x20delete\x20bucket',0x0,_0x8716ed)};}}async[_0x2d9ed0(0x428,0x490)](){function _0x30e510(_0x3c4e1c,_0xb78e72){return _0x1cc1(_0xb78e72-0x2c7,_0x3c4e1c);}try{const response=await this['httpClient'][_0x30e510(0x4bc,0x49f)](_0x30e510(0x46a,0x468));return{'data':response[_0x30e510(0x457,0x4ce)],'error':null};}catch(_0x4f96c5){return{'data':null,'error':_0x4f96c5 instanceof EBaaSError?_0x4f96c5:new EBaaSError(_0x4f96c5 instanceof Error?_0x4f96c5[_0x30e510(0x444,0x3fe)]:'Failed\x20to\x20get\x20storage\x20usage',0x0,_0x4f96c5)};}}}class EventManager{constructor(){this['events']=new Map(),this['maxListeners']=0xa;}['on'](_0x51374f,_0x4d8ccb){function _0x42724c(_0x22a8f7,_0x2702f0){return _0x1cc1(_0x22a8f7- -0x373,_0x2702f0);}!this[_0x42724c(-0x1c4,-0x207)]['has'](_0x51374f)&&this[_0x42724c(-0x1c4,-0x223)]['set'](_0x51374f,new Set()),this['events']['get'](_0x51374f)['add'](_0x4d8ccb);}[_0x2d9ed0(0x389,0x339)](_0x2e98a4,_0x6e7117){if(!this[_0x2730b4(0x515,0x529)]['has'](_0x2e98a4))return;const _0xe9d992=this['events']['get'](_0x2e98a4);_0x6e7117?_0xe9d992[_0x2730b4(0x5aa,0x544)](_0x6e7117):_0xe9d992['clear']();function _0x2730b4(_0x3bdf28,_0x3dc010){return _0x1cc1(_0x3dc010-0x37a,_0x3bdf28);}_0xe9d992[_0x2730b4(0x507,0x53d)]===0x0&&this['events'][_0x2730b4(0x50f,0x544)](_0x2e98a4);}[_0x2d9ed0(0x3bb,0x420)](_0x43e751,..._0x530c23){if(!this[_0x2a61e7(-0x55,0x29)][_0x2a61e7(-0x22,-0x14)](_0x43e751))return![];function _0x2a61e7(_0x2b75e8,_0xe85d38){return _0x1cc1(_0xe85d38- -0x186,_0x2b75e8);}const _0x48edfe=this['events']['get'](_0x43e751);for(const _0xe1dfe1 of _0x48edfe){try{_0xe1dfe1(..._0x530c23);}catch(_0x141f27){console['error']('Error\x20in\x20event\x20listener\x20for\x20\x22'+_0x43e751+'\x22:',_0x141f27);}}return _0x48edfe[_0x2a61e7(-0x16,0x3d)]>0x0;}['removeAllListeners'](_0x5bf537){_0x5bf537?this['events']['delete'](_0x5bf537):this['events']['clear']();}[_0x2d9ed0(0x372,0x34d)](_0x563465){function _0x58a86d(_0x1a0412,_0x51b6e2){return _0x1cc1(_0x51b6e2- -0x17a,_0x1a0412);}return this[_0x58a86d(0x35,0x35)]['get'](_0x563465)?.['size']??0x0;}[_0x2d9ed0(0x386,0x3e9)](){function _0x45f1cb(_0x876823,_0x176aa2){return _0x1cc1(_0x176aa2-0xe5,_0x876823);}return Array['from'](this[_0x45f1cb(0x304,0x294)][_0x45f1cb(0x388,0x30b)]());}['listeners'](_0x5a957c){function _0x44fd7e(_0x24ca84,_0x4e9872){return _0x1cc1(_0x4e9872-0x1a6,_0x24ca84);}return Array['from'](this['events'][_0x44fd7e(0x3d4,0x37e)](_0x5a957c)??[]);}[_0x2d9ed0(0x3af,0x434)](_0x3b38dd,_0x2b14d2){this['on'](_0x3b38dd,_0x2b14d2);}['removeListener'](_0x341db7,_0x163f67){this['off'](_0x341db7,_0x163f67);}[_0x2d9ed0(0x433,0x41e)](_0x520e79,_0x43314a){const _0x4d404b=(..._0x463c57)=>{function _0x1cf8eb(_0x207b64,_0x228e73){return _0x1cc1(_0x228e73-0x331,_0x207b64);}this[_0x1cf8eb(0x4cc,0x4a9)](_0x520e79,_0x4d404b),_0x43314a(..._0x463c57);};this['on'](_0x520e79,_0x4d404b);}[_0x2d9ed0(0x345,0x2ce)](_0x23c2ab,_0x3cd260){this['on'](_0x23c2ab,_0x3cd260);}[_0x2d9ed0(0x448,0x4b2)](_0x11ecb3,_0x1972b1){const _0x2633fc=(..._0x44d09e)=>{this['off'](_0x11ecb3,_0x2633fc),_0x1972b1(..._0x44d09e);};this['on'](_0x11ecb3,_0x2633fc);}[_0x2d9ed0(0x38c,0x3f9)](_0x172a56){this[_0x4a811a(-0x1cd,-0x1b3)]=_0x172a56;function _0x4a811a(_0x4988aa,_0x105ee1){return _0x1cc1(_0x4988aa- -0x334,_0x105ee1);}return this;}[_0x2d9ed0(0x3a9,0x37c)](){function _0x523095(_0x5b5323,_0x20775c){return _0x1cc1(_0x20775c- -0x310,_0x5b5323);}return this[_0x523095(-0x125,-0x1a9)];}[_0x2d9ed0(0x405,0x3d6)](_0x23bc62){return this['listeners'](_0x23bc62);}}class RealtimeChannel extends EventManager{constructor(_0x143bdf,_0x114886){super(),this['joinedOnce']=![];function _0x3c4a7e(_0x1a24db,_0x4542e1){return _0x1cc1(_0x4542e1-0x322,_0x1a24db);}this['state']='closed',this['subscriptions']=new Map(),this[_0x3c4a7e(0x51e,0x51a)]=_0x143bdf,this[_0x3c4a7e(0x4f0,0x4ed)]=_0x114886;}['subscribe'](_0x283e00){function _0x28e821(_0x5bcaf7,_0x88018d){return _0x1cc1(_0x88018d- -0x6f,_0x5bcaf7);}return!this['joinedOnce']&&(this[_0x28e821(0x1e6,0x1a9)]=!![],this['_join']()),_0x283e00&&this['on'](_0x28e821(0x81,0x104),_0x283e00),this;}[_0x2d9ed0(0x417,0x498)](filter,_0x57f3f2){const _0x52ae6e=_0x393d02(-0x179,-0x110)+JSON['stringify'](filter);this['on'](_0x52ae6e,_0x57f3f2);const _0x9e757c={'unsubscribe':()=>{function _0x316df5(_0x626566,_0x591a23){return _0x1cc1(_0x626566-0x3d3,_0x591a23);}this['off'](_0x52ae6e,_0x57f3f2),this[_0x316df5(0x50d,0x582)][_0x316df5(0x59d,0x563)](_0x52ae6e);}};this['subscriptions'][_0x393d02(-0x11d,-0x99)](_0x52ae6e,_0x9e757c);this['socket']?.['connected']&&this[_0x393d02(-0x17,-0x91)]===_0x393d02(-0xcb,-0x114)&&this[_0x393d02(-0x7d,-0xa5)]['emit'](_0x393d02(-0x86,-0x97),{'topic':this[_0x393d02(-0x8b,-0x78)],'filter':filter,'ref':this['makeRef']()});function _0x393d02(_0x5cac1e,_0x5632e9){return _0x1cc1(_0x5632e9- -0x270,_0x5cac1e);}return _0x9e757c;}['onBroadcast'](filter,_0x308cfa){const _0x116083='broadcast:'+JSON[_0x423b85(0xe2,0xe0)](filter);this['on'](_0x116083,_0x308cfa);const _0x2d1204={'unsubscribe':()=>{this[_0x423bf6(-0x45,0x2)](_0x116083,_0x308cfa);function _0x423bf6(_0x5add93,_0x4dc743){return _0x1cc1(_0x4dc743- -0x176,_0x5add93);}this['subscriptions'][_0x423bf6(0x49,0x54)](_0x116083);}};this[_0x423b85(0xb7,0xd9)]['set'](_0x116083,_0x2d1204);function _0x423b85(_0x5d7cf3,_0x5598b4){return _0x1cc1(_0x5598b4- -0x61,_0x5d7cf3);}return _0x2d1204;}[_0x2d9ed0(0x41e,0x47e)](filter,_0xe8ae){const _0x2b8f8f=_0x559261(0x487,0x43c)+JSON['stringify'](filter);this['on'](_0x2b8f8f,_0xe8ae);const _0x4ac224={'unsubscribe':()=>{this[_0x1dc28f(0x3a8,0x33d)](_0x2b8f8f,_0xe8ae);function _0x1dc28f(_0x7b5bb5,_0x3730d5){return _0x1cc1(_0x3730d5-0x1c5,_0x7b5bb5);}this[_0x1dc28f(0x35b,0x2ff)][_0x1dc28f(0x37b,0x38f)](_0x2b8f8f);}};function _0x559261(_0x2bcb70,_0x2cf06c){return _0x1cc1(_0x2cf06c-0x260,_0x2bcb70);}return this[_0x559261(0x390,0x39a)][_0x559261(0x3f0,0x437)](_0x2b8f8f,_0x4ac224),_0x4ac224;}['send'](_0x466f98){return new Promise(_0x26117b=>{function _0x4de238(_0x56d9a9,_0x9c254a){return _0x1cc1(_0x9c254a-0x179,_0x56d9a9);}this['socket']?.['connected']&&this[_0x4de238(0x374,0x358)]==='joined'?(this[_0x4de238(0x398,0x344)][_0x4de238(0x305,0x323)]('broadcast',{'topic':this[_0x4de238(0x2fc,0x371)],'event':_0x466f98[_0x4de238(0x340,0x3b6)],'payload':_0x466f98,'ref':this[_0x4de238(0x327,0x367)]()}),_0x26117b('ok')):_0x26117b(_0x4de238(0x2b8,0x309));});}['track'](_0x19c7b8){return new Promise(_0xeade3d=>{function _0x41c99e(_0x35744a,_0x1de3fd){return _0x1cc1(_0x1de3fd- -0xc2,_0x35744a);}this[_0x41c99e(0x138,0x109)]?.[_0x41c99e(0x8c,0x6e)]&&this['state']===_0x41c99e(0x59,0x9a)?(this['socket']['emit']('presence',{'topic':this[_0x41c99e(0x109,0x136)],'event':_0x41c99e(0xbc,0xcd),'payload':_0x19c7b8,'ref':this['makeRef']()}),_0xeade3d('ok')):_0xeade3d('error');});}['untrack'](){return new Promise(_0x50d1b0=>{function _0x59b3a1(_0x7fa5a6,_0x3c8ca6){return _0x1cc1(_0x3c8ca6-0x254,_0x7fa5a6);}this['socket']?.['connected']&&this[_0x59b3a1(0x3c4,0x433)]==='joined'?(this[_0x59b3a1(0x451,0x41f)][_0x59b3a1(0x416,0x3fe)]('presence',{'topic':this[_0x59b3a1(0x3cd,0x44c)],'event':'untrack','ref':this['makeRef']()}),_0x50d1b0('ok')):_0x50d1b0(_0x59b3a1(0x462,0x3e4));});}['unsubscribe'](){return new Promise(_0x2d4bd8=>{this['state']=_0x1c4de8(-0x6b,-0xeb),this[_0x1c4de8(-0xde,-0x88)][_0x1c4de8(-0xb4,-0x8f)](_0x38c384=>{_0x38c384['unsubscribe']();}),this['subscriptions'][_0x1c4de8(-0xe2,-0x74)]();function _0x1c4de8(_0x114b24,_0xc6f351){return _0x1cc1(_0x114b24- -0x218,_0xc6f351);}this[_0x1c4de8(-0x4d,-0x47)]?.['connected']&&this[_0x1c4de8(-0x4d,-0x7c)]['emit'](_0x1c4de8(-0x9a,-0x6a),{'topic':this[_0x1c4de8(-0x20,-0x2d)],'ref':this['makeRef']()}),this['state']=_0x1c4de8(0x15,0x7e),this['removeAllListeners'](),_0x2d4bd8('ok');});}['_join'](){if(this[_0x101455(-0x16,-0x46)]==='leaving')return;function _0x101455(_0x25aacd,_0x394db5){return _0x1cc1(_0x25aacd- -0x1f5,_0x394db5);}this['state']=_0x101455(-0x6d,-0x36),this[_0x101455(-0x2a,0x59)]?.[_0x101455(-0xc5,-0x82)]&&(this[_0x101455(-0x2a,0x37)][_0x101455(-0x4b,-0x4b)]('join',{'topic':this[_0x101455(0x3,-0x7e)],'ref':this[_0x101455(-0x7,-0x57)]()}),setTimeout(()=>{function _0x1a9e9a(_0x3f1739,_0x5bc083){return _0x1cc1(_0x3f1739- -0x18c,_0x5bc083);}this['state']==='joining'&&(this['state']='joined',this[_0x1a9e9a(0x1e,-0x4f)](_0x1a9e9a(-0x19,0x5c),_0x1a9e9a(-0x5a,-0x4f)));},0x64));}['_rejoin'](){function _0x1ff155(_0x21b37f,_0x3f75c8){return _0x1cc1(_0x21b37f-0x278,_0x3f75c8);}this['joinedOnce']&&(this['_join'](),this['subscriptions'][_0x1ff155(0x3dc,0x3a0)]((_0x2d96a2,_0x39b6d5)=>{function _0xd84eb7(_0x3897bc,_0x421a18){return _0x1cc1(_0x421a18- -0x352,_0x3897bc);}if(_0x39b6d5['startsWith'](_0xd84eb7(-0x1e8,-0x1f2))){const filter=JSON[_0xd84eb7(-0x24c,-0x1db)](_0x39b6d5[_0xd84eb7(-0x1f6,-0x18d)]('postgres_changes:',''));this[_0xd84eb7(-0x1b9,-0x187)]?.[_0xd84eb7(-0x18a,-0x1a8)]('subscribe_postgres_changes',{'topic':this['topic'],'filter':filter,'ref':this['makeRef']()});}}));}[_0x2d9ed0(0x3ab,0x342)](_0x50357e,_0x39e1aa){function _0x243fdf(_0x455a54,_0x7c4639){return _0x1cc1(_0x7c4639- -0x55,_0x455a54);}if(_0x50357e==='postgres_changes'){const _0x2ed6bb=_0x243fdf(0xc0,0x10b)+JSON['stringify'](_0x39e1aa['filter']||{});this[_0x243fdf(0x1c1,0x155)](_0x2ed6bb,_0x39e1aa);}else{if(_0x50357e===_0x243fdf(0x13d,0xee)){const _0x5264b3='broadcast:'+JSON['stringify']({'event':_0x39e1aa['event']});this[_0x243fdf(0x10d,0x155)](_0x5264b3,_0x39e1aa);}else{if(_0x50357e==='presence'){const _0x2786b8=_0x243fdf(0x1f1,0x187)+JSON['stringify']({'event':_0x39e1aa[_0x243fdf(0x230,0x1e8)]});this['emit'](_0x2786b8,_0x39e1aa);}}}this['emit'](_0x50357e,_0x39e1aa);}[_0x2d9ed0(0x447,0x426)](_0xc08a70){this['state']=_0xc08a70;let status;switch(_0xc08a70){case _0x4108b2(0x2bf,0x2b1):status='SUBSCRIBED';break;case _0x4108b2(0x2d6,0x2f1):status=_0x4108b2(0x340,0x380);break;case _0x4108b2(0x3df,0x382):status='CLOSED';break;default:return;}function _0x4108b2(_0x4090f6,_0x947458){return _0x1cc1(_0x947458-0x155,_0x4090f6);}this['emit']('status',status);}[_0x2d9ed0(0x3ff,0x3e5)](){return Math['random']()['toString'](0x24)['substring'](0x2,0xf);}['getState'](){return this['state'];}}function getEnvironment(){function _0x10a2b6(_0x452a7b,_0x1dadf4){return _0x1cc1(_0x452a7b-0x233,_0x1dadf4);}if(typeof navigator!==_0x10a2b6(0x3b5,0x337)&&navigator['product']===_0x10a2b6(0x378,0x388))return'react-native';if(typeof window!=='undefined'&&typeof document!=='undefined')return'browser';if(typeof global!=='undefined'&&typeof process!==_0x10a2b6(0x3b5,0x42a)&&process[_0x10a2b6(0x424,0x433)]?.['node'])return _0x10a2b6(0x414,0x49a);return _0x10a2b6(0x3a0,0x3c9);}function isSocketIOAvailable(){function _0x3408ad(_0x1e9417,_0x7d9d45){return _0x1cc1(_0x7d9d45-0x362,_0x1e9417);}try{const _0x13f0a1=getEnvironment();switch(_0x13f0a1){case _0x3408ad(0x501,0x543):return typeof require!==_0x3408ad(0x4a2,0x4e4)&&require['resolve']&&!!require[_0x3408ad(0x5a9,0x562)](_0x3408ad(0x58f,0x55c));case'browser':if(typeof globalThis!=='undefined'&&'io'in globalThis)return!![];return typeof require!==_0x3408ad(0x4f4,0x4e4)&&require['resolve']&&!!require[_0x3408ad(0x4e7,0x562)]('socket.io-client');case _0x3408ad(0x5d4,0x59d):try{return typeof require!==_0x3408ad(0x4bc,0x4e4)&&!!require('socket.io-client');}catch{return![];}default:return![];}}catch{return![];}}function getSocketIO(){function _0x430eb2(_0x3b2c2e,_0x136890){return _0x1cc1(_0x136890-0xe6,_0x3b2c2e);}try{if(typeof require!=='undefined')return require('socket.io-client');if(typeof globalThis!==_0x430eb2(0x222,0x268)&&'io'in globalThis)return{'io':globalThis['io']};throw new Error(_0x430eb2(0x2b4,0x2d5));}catch(_0x33cd91){throw new Error('Socket.io-client\x20não\x20está\x20disponível\x20neste\x20ambiente.\x20Para\x20usar\x20funcionalidades\x20de\x20realtime,\x20instale:\x20npm\x20install\x20socket.io-client');}}class WebSocketAdapter{constructor(){function _0x140209(_0x3026b6,_0x496488){return _0x1cc1(_0x496488-0x314,_0x3026b6);}this[_0x140209(0x47d,0x4df)]=null;}async[_0x2d9ed0(0x438,0x49b)](_0x451c1f,_0x1b095e){if(!isSocketIOAvailable())throw new Error('Socket.io-client não está disponível. Para usar funcionalidades de realtime, instale: npm install socket.io-client');const {io:_0x15110f}=getSocketIO();return new Promise((_0x22f9ad,_0x1b5edc)=>{this['socket']=_0x15110f(_0x451c1f,_0x1b095e),this['socket']['on']('connect',()=>_0x22f9ad()),this['socket']['on']('connect_error',_0x34c2b2=>_0x1b5edc(_0x34c2b2));});}['disconnect'](){function _0x29fa39(_0x389cdb,_0x42151e){return _0x1cc1(_0x389cdb-0x3c8,_0x42151e);}this[_0x29fa39(0x593,0x60e)]&&(this['socket'][_0x29fa39(0x536,0x520)](),this[_0x29fa39(0x593,0x5d8)]=null);}[_0x2d9ed0(0x3bb,0x37d)](_0x6ececb,data){function _0x3eaad3(_0x23529c,_0x3634f6){return _0x1cc1(_0x23529c-0x1a6,_0x3634f6);}this[_0x3eaad3(0x371,0x325)]?.[_0x3eaad3(0x350,0x2d9)](_0x6ececb,data);}['on'](_0x5d41dd,_0x4777cf){this['socket']?.['on'](_0x5d41dd,_0x4777cf);}['off'](_0x528e20,_0x263932){function _0x1caa65(_0x2bb537,_0x194ae8){return _0x1cc1(_0x194ae8-0xed,_0x2bb537);}_0x263932?this[_0x1caa65(0x291,0x2b8)]?.['off'](_0x528e20,_0x263932):this['socket']?.['off'](_0x528e20);}get[_0x2d9ed0(0x341,0x2d5)](){function _0x5f7694(_0x497602,_0x1b1214){return _0x1cc1(_0x497602-0x10b,_0x1b1214);}return this[_0x5f7694(0x2d6,0x333)]?.['connected']??![];}}function _0x5014(){const _0x5d774e=['yNjVD3nLCG','zgLZy29UBMvJDa','x2DLDfnVy2TLDa','DxnLCG','rMfPBgvKihrVig1VDMuGzMLSzq','AgfZ','C3rHDhvZ','y29UzMLNDxjLq3vZDg9Trgf0ywjHC2u','zxzLBNroyw1LCW','C3rVCMfNzq','CgfYC2u','B2zM','zgv0zwn0q3vZDg9Trgf0ywjHC2u','y29UzMLN','C2v0twf4tgLZDgvUzxjZ','z2v0u3rHDhvZ','BMvX','BgvHDMu','CMvMCMvZAfnLC3nPB24','y3jLyxrL','AgfZq3vZDg9Trgf0ywjHC2u','Dw5KzwzPBMvK','ms4XlJG','zMLSzq','C29YDej5','ChjLzML4','DhjHBNnMB3jT','AM9PBMLUzW','zxHLy3v0zq','DxbZzxj0','C2vZC2LVBG','BhrL','rMfPBgvKihrVigDLDcbMDw5JDgLVBIbSB2DZ','zgv0zwn0zwrdB25MAwC','DhjHy2S','zxjYB3i','nZe1mZK4sg9NCwLb','rgf0ywjHC2vdBgLLBNq','Aw5PDgLHBgL6zun1C3rVBurHDgfIyxnL','y29UBMvJDf9LCNjVCG','uhjLzMvY','ndC3mtLKtK1uqLi','DxbKyxrLrgf0yq','z2v0twf4tgLZDgvUzxjZ','yxv0Aa','x3rYAwDNzxi','uMvHBhrPBwvdBgLLBNq','zxjYB3jLza','zw50CMLLCW','ywrKtgLZDgvUzxi','Cg9ZDgDYzxnFy2HHBMDLCW','Cg9ZDa','l3n0B3jHz2uVDxnHz2u','zw50CNLWB2LUDa','Ahr0CenSAwvUDa','yM9KEq','B2zMC2v0','icHtDgf0Dxm6ia','z2v0rgv0zwn0zwrdB25MAwC','z2v0v29YA3nWywnLswq','DgfIBgu','zw1PDa','igf0DgvTChrZoIa','D29YA3nWywnLswq','BgvHDMLUzW','q3vZDg9Trgf0ywjHC2vnyw5Hz2vY','zxzLBNrZ','Aw5Zzxj0','ywnJzxnZx3rVA2vU','l2vUDG','y2fJAgvdB250CM9S','DxbKyxrLrw52','mtuYndKYodLJDKDosvi','zwjHyxmUyxv0Ac5ZzxnZAw9U','B25dB25Uzwn0Aw9Uu3rHDgvdAgfUz2u','l2zPBgvZl2nVChK','mtbuuM52zgy','DxbKyxrL','l3nKAY92ms8','u3rVCMfNzuj1y2TLDa','zgvSzxrLt3b0Aw9UCW','DMfSDwu','DxnL','BxvSDgLWyxj0l2zVCM0Tzgf0yq','Ec10B3rHBc1JB3vUDa','uMvHBhrPBwvdAgfUBMvS','C2L6zq','DgvZDenVBM5Ly3rPB24','CMvWBgfJzq','y2HHBM5LBhm','C2vHCMnO','y29SDw1U','C2nOzw1H','zgvSzxrL','C29JA2v0','zgf0ywjHC2u','AgvHCNrIzwf0','z2v0twv0CMLJCW','lMrLC2m','l2zPBgvZlW','C2v0DxbizwfYDgjLyxq','yxnJzw5KAw5N','y3jLyxrLu2LNBMvKvxjS','C3rYAw5N','DMvYAwz5','B3bLCMf0Aw9U','C2v0','z2v0','C3vIC2nYAwjLx3bVC3rNCMvZx2nOyw5Nzxm','yxbPs2v5','l3n0B3jHz2uVyNvJA2v0CW','ChjLC2vUy2u6','qxv0AgvUDgLJyxrPB24GzMfPBgvK','qMvHCMvYia','C3rHDgu','l2zPBgvZ','BM9Kzq','CMvTB3zLqwXSq2HHBM5LBhm','zgLZy29UBMvJDgvK','CMvZzxrqyxnZD29Yza','C3bSAxq','B3b0Aw9UCW','l2f1DgGVDJeVDxnLCG','C2v0sxrLBq','zxHLy3v0zvf1zxj5','y2XPzw50','rNvUy3rPB25Zq2XPzw50','odyWndu0mfzoANHfuG','mJrcz2v1v1i','BwfRzvjLzG','C29JA2v0lMLVlwnSAwvUDcbUB3qGyxzHAwXHyMXL','C29JA2v0qwrHChrLCG','DMvYC2LVBNm','AgvHCNrIzwf0sw50zxj2ywW','yMfZzvvsta','CMf3tgLZDgvUzxjZ','yxbWzw5K','CMvJB25Uzwn0qxr0zw1WDhm','Bwf4uMvJB25Uzwn0qxr0zw1WDhm','Dg9WAwm','CNbJ','C29JA2v0lMLVlwnSAwvUDa','Dw5ZDwjZy3jPyMu','AgfUzgXLrxjYB3i','mJa4vefnAKHc','CxvLCNK','rNvUy3rPB24GAw52B2nHDgLVBIbMywLSzwq','CMvZB2X2zq','y3vZDg9Trgf0ywjHC2vnyw5Hz2vY','CMvQzwn0','BgLRzq','l2z1BMn0Aw9UCY92mq','C2LNBKLU','B25qB3n0z3jLC0nOyw5Nzxm','zgf0yq','C2v0v29YA3nWywnLswq','rMfPBgvKihrVihvWzgf0zsbMAwXLig1LDgfKyxrH','y3jLzgvUDgLHBhm','CMvZCg9UC2u','C2v0u2vZC2LVBG','B25qCMvZzw5Jzq','B3jKzxi','z2v0q3vZDg9Tq3jLzgvUDgLHBhm','D2vIC29JA2v0','rMfPBgvKihrVihvWzgf0zsbMDw5JDgLVBIbLBNzPCM9UBwvUDa','rgf0ywjHC2uGB3bLCMf0Aw9UigzHAwXLza','y29Kzq','rMfPBgvKihrVigDLDcbMDw5JDgLVBIbTzxrYAwnZ','DxjS','ChjLzMvY','z2v0vxnHz2u','AM9PBMvKt25Jzq','CMvZB2X1DgLVBJ1TzxjNzs1KDxbSAwnHDgvZlhjLDhvYBJ1YzxbYzxnLBNrHDgLVBG','zNjVBq','D2fYBG','C2LNBK91Da','Aw52B2TL','Chv0','Bg9N','AgvHzgvYCW','Bwf0y2G','B25Jzq','Aw5PDgLHBgL6zq','Aw50zxjJzxb0B3jZ','AwXPA2u','A2v5CW','y29UBMvJDa','z2v0q3vZDg9Trgf0ywjHC2vtDgf0Dxm','CMfUz2u','u3rVCMfNzunSAwvUDa','q0HbtK5ftf9fuLjpuG','zg93BMXVywq','y2XVC2vK','ntuXnZe3nMPzEujTCW','Dgv4Dc9WBgfPBG','zw52','rMfPBgvKihrVigrLBgv0zsbMDw5JDgLVBG','y29TBw9U','C3nSrw5HyMXLza','x2PVAw4','y2XLyxjtzxnZAw9U','x3nLDfn0yxrL','ChjLCgvUze9Uy2vmAxn0zw5LCG','rMfPBgvKihrVihrLC3qGy29UBMvJDgLVBG','l3n0B3jHz2uVyNvJA2v0CY8','BgvUz3rO','CMvHy3qTBMf0AxzL','y29UDgvUDfr5Cgu','zxzLBNq','nuPesvr1zW','rujHyvnfCNjVCG','y29UBMvJDgvK','z2v0qNvJA2v0','u1vcu0nssujfra','l2XVz3m','ChjLCgvUzeXPC3rLBMvY','DgvZDen1C3rVBunVBM5Ly3rPB24','y2XLyxi','BwvZC2fNzq','BgLTAxq','zgv0ywLSCW','C3vIC2nYAxb0Aw9UCW','Aw1WB3j0twfW','Ag9ZDa','yNvJA2v0swq','BMfTzq','nda0odzQCgnzrfC','y2HHBM5LBa','C3rYAw5NAwz5','ChvZAa','yNjVywrJyxn0','y29UBMvJDgLVBLn0yxrL','uMvHy3royxrPDMu','shr0CenSAwvUDa','C3rHDhvZvgv4Da','z2v0uhvIBgLJvxjS','C2vSzwn0','zMLSDgvYCW','rMfPBgvKihrVigrLCgXVEsbMDw5JDgLVBG','z2v0u2vZC2LVBG','Cg9ZDgDYzxneyxrHyMfZzq','l2z1BMn0Aw9UCY92ms8','B3bLCMf0B3i','vw5RBM93BIbLCNjVCG','CgvYAw9K','Cg9YDa','l3nPz24','AgfUzgXLqxv0AevYCM9Y','y3vYCMvUDfnLC3nPB24','DxbKyxrLrMLSzu1LDgfKyxrH','mta5oteYqM9pvwnh','DxbKyxrLt3b0Aw9UCW','AM9PBG','z2v0vxnLCG','Dg9tDhjPBMC','AM9PBMvK','Bwv0Ag9K','y2fWDhvYzvn0ywnRvhjHy2u','CMvHBhrPBwu','Cg9ZDgDYzxnFy2HHBMDLCZO','BgLZDgvUzxjdB3vUDa','z3rL','Bgv2zwW','zM9YrwfJAa','Dg9vChbLCKnHC2u','C2v0u2vZC2LVBKLUDgvYBMfS','Bwf4tgLZDgvUzxjZ','Bwv0ywrHDge','l2zPBgvZl21VDMu','ChjLC2vUy2u','BM93','y3vYCMvUDfnJAgvTyq'];_0x5014=function(){return _0x5d774e;};return _0x5014();}class ReactNativeSocketAdapter{constructor(){function _0x33b5eb(_0x50e257,_0x3026f4){return _0x1cc1(_0x50e257- -0x149,_0x3026f4);}this[_0x33b5eb(0x82,0xa9)]=null;}async[_0x2d9ed0(0x438,0x46c)](_0xd774f3,_0x366fc8){if(!isSocketIOAvailable())throw new Error('Socket.io-client\x20não\x20está\x20disponível.\x20Para\x20React\x20Native,\x20instale:\x20npm\x20install\x20socket.io-client');const {io:_0x50b167}=getSocketIO();return new Promise((_0x101a3d,_0xbbfccc)=>{this[_0x4cbd02(0x1e4,0x1e5)]=_0x50b167(_0xd774f3,{..._0x366fc8,'transports':[_0x4cbd02(0x28a,0x22a)],'upgrade':![],'autoConnect':!![]});function _0x4cbd02(_0x217ebf,_0x2adfa6){return _0x1cc1(_0x2adfa6-0x1a,_0x217ebf);}this['socket']['on'](_0x4cbd02(0x1e8,0x241),()=>_0x101a3d()),this['socket']['on']('connect_error',_0x10af4b=>_0xbbfccc(_0x10af4b));});}['disconnect'](){function _0x450e68(_0x2c8d19,_0x54008e){return _0x1cc1(_0x54008e-0x36a,_0x2c8d19);}this[_0x450e68(0x587,0x535)]&&(this['socket']['disconnect'](),this[_0x450e68(0x4eb,0x535)]=null);}[_0x2d9ed0(0x3bb,0x3c0)](_0x5365e1,data){function _0x82b17e(_0x21cf14,_0x14b65a){return _0x1cc1(_0x14b65a-0x247,_0x21cf14);}this['socket']?.[_0x82b17e(0x441,0x3f1)](_0x5365e1,data);}['on'](_0x43516c,_0x2506b8){function _0x5bb51c(_0x24f681,_0x2a743e){return _0x1cc1(_0x2a743e-0x369,_0x24f681);}this[_0x5bb51c(0x586,0x534)]?.['on'](_0x43516c,_0x2506b8);}['off'](_0x177a5b,_0x31fc59){function _0x5a7a3c(_0x52074a,_0x46c255){return _0x1cc1(_0x52074a-0x35f,_0x46c255);}_0x31fc59?this[_0x5a7a3c(0x52a,0x4cb)]?.[_0x5a7a3c(0x4d7,0x527)](_0x177a5b,_0x31fc59):this['socket']?.[_0x5a7a3c(0x4d7,0x4a4)](_0x177a5b);}get[_0x2d9ed0(0x341,0x37b)](){return this['socket']?.['connected']??![];}}function createSocketAdapter(){const _0x2c26e7=getEnvironment();function _0x4a4d7e(_0x10792e,_0x4b6d25){return _0x1cc1(_0x4b6d25- -0x31d,_0x10792e);}switch(_0x2c26e7){case _0x4a4d7e(-0xc9,-0xe2):return new ReactNativeSocketAdapter();case'browser':case _0x4a4d7e(-0xde,-0x13c):default:return new WebSocketAdapter();}}class RealtimeClient{constructor(_0x53313f,_0xd3510c,_0x1a5669={}){this[_0x1b3f8d(0x2e,0x2d)]=null;function _0x1b3f8d(_0x3fdb32,_0x32f6b8){return _0x1cc1(_0x3fdb32- -0x19d,_0x32f6b8);}this['channels']=new Map(),this[_0x1b3f8d(-0x59,-0x6d)]=_0x1b3f8d(0x46,0x28),this[_0x1b3f8d(0x59,-0x20)]=0x0,this[_0x1b3f8d(0x5a,0xca)]=0x5,this[_0x1b3f8d(0x78,0x2)]=_0x53313f,this['apiKey']=_0xd3510c,this['options']={'heartbeatInterval':0x7530,'reconnectInterval':0x1388,'maxReconnectAttempts':0x5,..._0x1a5669},this[_0x1b3f8d(0x53,0x71)]=createSocketAdapter();}['connect'](){return new Promise(async(_0x34cc6b,_0x20e2a2)=>{if(this[_0x20562d(-0xb8,-0xfc)][_0x20562d(-0x178,-0x11b)]){_0x34cc6b();return;}this['connectionState']='connecting';function _0x20562d(_0x511232,_0x10cbcf){return _0x1cc1(_0x511232- -0x2a8,_0x10cbcf);}try{await this[_0x20562d(-0xb8,-0x38)][_0x20562d(-0x81,-0x8e)](this['url'],{'auth':{'apikey':this['apiKey']},'transports':[_0x20562d(-0x98,-0x5e)],'reconnection':!![],'reconnectionDelay':this[_0x20562d(-0xc2,-0x125)]['reconnectInterval'],'reconnectionAttempts':this['options']['maxReconnectAttempts'],...this[_0x20562d(-0xc2,-0x7f)]['socketOptions']}),this['socket']=this[_0x20562d(-0xb8,-0x10e)]['socket'],this[_0x20562d(-0xb8,-0xe8)]['on'](_0x20562d(-0x81,-0x85),()=>{this[_0x1d8f1d(-0x14f,-0xe9)]=_0x1d8f1d(-0x177,-0xfd);function _0x1d8f1d(_0x581037,_0x3bef6f){return _0x1cc1(_0x3bef6f- -0x22d,_0x581037);}this[_0x1d8f1d(-0x4a,-0x37)]=0x0,this[_0x1d8f1d(0x7,-0x5c)](),_0x34cc6b();}),this['socketAdapter']['on'](_0x20562d(-0x13a,-0x180),()=>{this['connectionState']=_0x2ba231(-0xfc,-0x169);function _0x2ba231(_0x44fa68,_0x2fc121){return _0x1cc1(_0x2fc121- -0x34c,_0x44fa68);}this['channels']['forEach'](channel=>{channel['_setState']('closed');});}),this['socketAdapter']['on']('connect_error',_0x17ed77=>{function _0x24529a(_0x3c9ec2,_0x3a61e1){return _0x1cc1(_0x3c9ec2- -0x391,_0x3a61e1);}this[_0x24529a(-0x24d,-0x2c1)]=_0x24529a(-0x201,-0x1ad),this['reconnectAttempts']++,this[_0x24529a(-0x19b,-0x1d6)]>=this['maxReconnectAttempts']&&_0x20e2a2(new Error('Failed\x20to\x20connect\x20after\x20'+this['maxReconnectAttempts']+_0x24529a(-0x1e6,-0x21b)+_0x17ed77['message']));}),this['socketAdapter']['on']('reconnect',()=>{function _0x3ef6f9(_0x5afc22,_0x23531c){return _0x1cc1(_0x23531c-0x29e,_0x5afc22);}this[_0x3ef6f9(0x3d1,0x3e2)]='connected',this[_0x3ef6f9(0x513,0x494)]=0x0,this[_0x3ef6f9(0x4c7,0x464)]['forEach'](channel=>{channel['_rejoin']();});}),this[_0x20562d(-0xb8,-0xd6)]['on']('postgres_changes',_0x503624=>{function _0x3b9f9f(_0x90dc89,_0x41446c){return _0x1cc1(_0x41446c- -0x37b,_0x90dc89);}const channel=this['channels']['get'](_0x503624['topic']);channel&&channel[_0x3b9f9f(-0x176,-0x1e1)](_0x3b9f9f(-0x1be,-0x1dc),_0x503624);}),this[_0x20562d(-0xb8,-0xce)]['on'](_0x20562d(-0x165,-0x1e5),_0xed52a1=>{const channel=this['channels']['get'](_0xed52a1['topic']);channel&&channel['_trigger']('broadcast',_0xed52a1);}),this['socketAdapter']['on']('presence',_0x4d4a3d=>{function _0x50dc26(_0x2a03ab,_0x427619){return _0x1cc1(_0x427619- -0x3a8,_0x2a03ab);}const channel=this[_0x50dc26(-0x205,-0x1e2)][_0x50dc26(-0x159,-0x1d0)](_0x4d4a3d[_0x50dc26(-0x13b,-0x1b0)]);channel&&channel['_trigger'](_0x50dc26(-0x1fd,-0x23e),_0x4d4a3d);});}catch(_0x118dfe){this[_0x20562d(-0x164,-0x150)]=_0x20562d(-0x118,-0xaa),_0x20e2a2(_0x118dfe);}});}['disconnect'](){this['socketAdapter']&&(this['socketAdapter'][_0x33ead9(0x187,0x10c)](),this['socket']=null);this['connectionState']=_0x33ead9(0x128,0x181);function _0x33ead9(_0x8084d5,_0x2ac5de){return _0x1cc1(_0x2ac5de- -0x62,_0x8084d5);}this['channels']['clear']();}[_0x2d9ed0(0x351,0x33c)](_0x202f90){function _0x1e6766(_0x4b43df,_0x1c0a70){return _0x1cc1(_0x1c0a70- -0x186,_0x4b43df);}if(this['channels'][_0x1e6766(-0x18,-0x14)](_0x202f90))return this['channels'][_0x1e6766(0x3c,0x52)](_0x202f90);const channel=new RealtimeChannel(_0x202f90,this[_0x1e6766(-0x30,0x45)]);return this['channels']['set'](_0x202f90,channel),this[_0x1e6766(0x7,-0x42)]==='connected'&&channel[_0x1e6766(0xe6,0xae)](),channel;}['removeChannel'](channel){function _0x20f278(_0x1b74ec,_0x1655a8){return _0x1cc1(_0x1655a8-0x93,_0x1b74ec);}const _0x580344=channel['topic'];this[_0x20f278(0x293,0x259)]['has'](_0x580344)&&(this[_0x20f278(0x296,0x259)][_0x20f278(0x220,0x25d)](_0x580344),channel[_0x20f278(0x2a7,0x28e)]());}[_0x2d9ed0(0x3f3,0x41c)](){this['channels']['forEach'](channel=>{channel['unsubscribe']();}),this['channels']['clear']();}['getChannels'](){function _0x59ce0f(_0x2151c0,_0x3dc898){return _0x1cc1(_0x3dc898- -0x122,_0x2151c0);}return Array[_0x59ce0f(0x156,0xf8)](this[_0x59ce0f(0x39,0xa4)]['values']());}['isConnected'](){function _0x4b2b69(_0xe906bf,_0x309929){return _0x1cc1(_0x309929- -0x1b8,_0xe906bf);}return this['connectionState']==='connected'&&this['socketAdapter'][_0x4b2b69(-0x38,-0x88)];}['getConnectionState'](){return this['connectionState'];}[_0x2d9ed0(0x3c8,0x3e1)](_0x44a2b8){function _0x17996e(_0x5a55a9,_0x2a5fad){return _0x1cc1(_0x5a55a9-0x28e,_0x2a5fad);}const _0x4e1731=()=>_0x44a2b8(this[_0x17996e(0x3d2,0x413)]);return this['socketAdapter']&&(this['socketAdapter']['on']('connect',()=>{this['connectionState']='connected',_0x4e1731();}),this['socketAdapter']['on'](_0x17996e(0x3fc,0x3e1),()=>{this[_0xde80da(-0x1a8,-0x169)]=_0xde80da(-0x112,-0xca);function _0xde80da(_0x3c4f1b,_0x199b27){return _0x1cc1(_0x199b27- -0x2ad,_0x3c4f1b);}_0x4e1731();}),this[_0x17996e(0x47e,0x416)]['on'](_0x17996e(0x422,0x439),()=>{this['connectionState']=_0x4a26b1(0x47a,0x479);function _0x4a26b1(_0xa1af37,_0xb77a4a){return _0x1cc1(_0xb77a4a-0x2e9,_0xa1af37);}_0x4e1731();})),()=>{function _0x18f671(_0x9f1dfe,_0x2901f3){return _0x1cc1(_0x9f1dfe- -0x9d,_0x2901f3);}this[_0x18f671(0x153,0x103)]&&(this['socketAdapter'][_0x18f671(0xdb,0x7f)]('connect',_0x4e1731),this[_0x18f671(0x153,0x1bb)]['off'](_0x18f671(0xd1,0xec),_0x4e1731),this[_0x18f671(0x153,0x10c)][_0x18f671(0xdb,0xfe)](_0x18f671(0xf7,0x14c),_0x4e1731));};}['setupHeartbeat'](){if(!this['options'][_0x3e4173(0x162,0x1da)]||!this[_0x3e4173(0x160,0x12a)])return;function _0x3e4173(_0x49e150,_0xe3c7ed){return _0x1cc1(_0x49e150- -0x90,_0xe3c7ed);}const interval=setInterval(()=>{function _0x176c9f(_0x5331b3,_0x245ed5){return _0x1cc1(_0x5331b3-0x9c,_0x245ed5);}this[_0x176c9f(0x28c,0x20f)]?.['connected']?this['socketAdapter'][_0x176c9f(0x246,0x1c2)](_0x176c9f(0x269,0x291),{'timestamp':Date[_0x176c9f(0x207,0x284)]()}):clearInterval(interval);},this[_0x3e4173(0x156,0xf2)]['heartbeatInterval']);}[_0x2d9ed0(0x380,0x2fe)](){function _0x575208(_0x4e1de4,_0x45dc34){return _0x1cc1(_0x45dc34-0x97,_0x4e1de4);}return this[_0x575208(0x278,0x262)];}}class FunctionsClient{constructor(_0x509fcf){function _0x3480fe(_0x324a39,_0x3b246e){return _0x1cc1(_0x3b246e- -0x1ca,_0x324a39);}this[_0x3480fe(0x51,-0x27)]=_0x509fcf;}async['invoke'](_0x356afc,_0x557892){function _0x369aee(_0x11ea09,_0x41bef0){return _0x1cc1(_0x41bef0- -0x67,_0x11ea09);}try{const _0x1a7a39=_0x557892?.[_0x369aee(0x12b,0xf6)]||'POST',headers={'Content-Type':'application/json',..._0x557892?.['headers']};let response;const _0x27e368='/functions/v1/'+_0x356afc;switch(_0x1a7a39[_0x369aee(0x119,0xfe)]()){case'GET':response=await this['httpClient'][_0x369aee(0x1d7,0x171)](_0x27e368,{'headers':headers,'params':_0x557892?.['body']});break;case'POST':response=await this['httpClient']['post'](_0x27e368,_0x557892?.['body'],{'headers':headers});break;case'PUT':response=await this['httpClient']['put'](_0x27e368,_0x557892?.['body'],{'headers':headers});break;case'PATCH':response=await this[_0x369aee(0x139,0x13c)]['patch'](_0x27e368,_0x557892?.[_0x369aee(0x1b5,0x13d)],{'headers':headers});break;case'DELETE':response=await this['httpClient'][_0x369aee(0x10e,0x163)](_0x27e368,{'headers':headers,'data':_0x557892?.['body']});break;default:throw new EBaaSError('Unsupported\x20HTTP\x20method:\x20'+_0x1a7a39,0x190);}return{'data':response['data'],'error':null};}catch(_0x165119){return{'data':null,'error':_0x165119 instanceof EBaaSError?_0x165119:new EBaaSError(_0x165119 instanceof Error?_0x165119[_0x369aee(0xce,0xd0)]:_0x369aee(0x1bd,0x198),0x0,_0x165119)};}}async['list'](){function _0x379ceb(_0x4f1555,_0x478185){return _0x1cc1(_0x478185-0x22e,_0x4f1555);}try{const response=await this[_0x379ceb(0x3fc,0x3d1)][_0x379ceb(0x3a4,0x406)](_0x379ceb(0x433,0x432));return{'data':response[_0x379ceb(0x3fa,0x435)],'error':null};}catch(_0x4afca4){return{'data':null,'error':_0x4afca4 instanceof EBaaSError?_0x4afca4:new EBaaSError(_0x4afca4 instanceof Error?_0x4afca4[_0x379ceb(0x336,0x365)]:'Failed\x20to\x20list\x20functions',0x0,_0x4afca4)};}}async['get'](_0x46b45a){function _0x56570b(_0x500f67,_0x4e0636){return _0x1cc1(_0x500f67-0x1be,_0x4e0636);}try{const response=await this['httpClient']['get']('/functions/v1/'+_0x46b45a+'/info');return{'data':response[_0x56570b(0x3c5,0x3c7)],'error':null};}catch(_0x14736d){return{'data':null,'error':_0x14736d instanceof EBaaSError?_0x14736d:new EBaaSError(_0x14736d instanceof Error?_0x14736d[_0x56570b(0x2f5,0x279)]:'Failed\x20to\x20get\x20function',0x0,_0x14736d)};}}async['deploy'](_0x45b3b3,_0xe3238c){function _0x465662(_0x7727df,_0x2440d4){return _0x1cc1(_0x2440d4-0x3b1,_0x7727df);}try{const _0x580644=new FormData();if(_0xe3238c['code']instanceof File)_0x580644['append'](_0x465662(0x542,0x5c4),_0xe3238c['code']);else typeof _0xe3238c['code']===_0x465662(0x586,0x585)&&_0x580644[_0x465662(0x5ac,0x5a6)](_0x465662(0x61c,0x5c4),new Blob([_0xe3238c[_0x465662(0x5bf,0x5c4)]],{'type':_0x465662(0x57c,0x5e0)}),'index.ts');_0xe3238c['entrypoint']&&_0x580644[_0x465662(0x58c,0x5a6)]('entrypoint',_0xe3238c[_0x465662(0x58b,0x553)]);_0xe3238c[_0x465662(0x5d5,0x5e1)]&&_0x580644[_0x465662(0x5ad,0x5a6)]('env',JSON['stringify'](_0xe3238c[_0x465662(0x656,0x5e1)]));_0xe3238c['importMap']&&_0x580644['append'](_0x465662(0x527,0x4ec),JSON['stringify'](_0xe3238c['importMap']));_0xe3238c[_0x465662(0x558,0x586)]!==undefined&&_0x580644[_0x465662(0x541,0x5a6)](_0x465662(0x5a1,0x586),String(_0xe3238c['verify']));const response=await this['httpClient']['post'](_0x465662(0x4f6,0x4ff)+_0x45b3b3+'/deploy',_0x580644,{'headers':{'Content-Type':_0x465662(0x5b7,0x571)}});return{'data':response['data'],'error':null};}catch(_0x291ee2){return{'data':null,'error':_0x291ee2 instanceof EBaaSError?_0x291ee2:new EBaaSError(_0x291ee2 instanceof Error?_0x291ee2['message']:_0x465662(0x47d,0x4fc),0x0,_0x291ee2)};}}async['delete'](_0x35c956){function _0x4f9d77(_0x4e696a,_0x32c484){return _0x1cc1(_0x4e696a- -0x7,_0x32c484);}try{const response=await this['httpClient'][_0x4f9d77(0x1c3,0x248)](_0x4f9d77(0x147,0x1ca)+_0x35c956);return{'data':response[_0x4f9d77(0x200,0x26e)],'error':null};}catch(_0x437552){return{'data':null,'error':_0x437552 instanceof EBaaSError?_0x437552:new EBaaSError(_0x437552 instanceof Error?_0x437552[_0x4f9d77(0x130,0x186)]:_0x4f9d77(0x22a,0x1ba),0x0,_0x437552)};}}async[_0x2d9ed0(0x3c5,0x3c0)](_0x3599c9,_0x65417f){function _0x258db9(_0x1692db,_0x2b35d1){return _0x1cc1(_0x1692db- -0x2fd,_0x2b35d1);}try{const response=await this['httpClient'][_0x258db9(-0xdf,-0xa1)]('/functions/v1/'+_0x3599c9+_0x258db9(-0x14b,-0x10a),{'env':_0x65417f});return{'data':response[_0x258db9(-0xf6,-0xb7)],'error':null};}catch(_0x18f944){return{'data':null,'error':_0x18f944 instanceof EBaaSError?_0x18f944:new EBaaSError(_0x18f944 instanceof Error?_0x18f944[_0x258db9(-0x1c6,-0x149)]:_0x258db9(-0xec,-0x14e),0x0,_0x18f944)};}}async['getLogs'](_0x854431,_0x93bbef){function _0x39c207(_0xe5afee,_0x523f67){return _0x1cc1(_0x523f67-0x27b,_0xe5afee);}try{const _0x4b8b47=new URLSearchParams();_0x93bbef?.['limit']&&_0x4b8b47['append'](_0x39c207(0x3a6,0x3b3),String(_0x93bbef[_0x39c207(0x32e,0x3b3)]));_0x93bbef?.[_0x39c207(0x3f7,0x420)]&&_0x4b8b47['append'](_0x39c207(0x463,0x420),String(_0x93bbef[_0x39c207(0x411,0x420)]));_0x93bbef?.['level']&&_0x4b8b47[_0x39c207(0x433,0x470)]('level',_0x93bbef[_0x39c207(0x407,0x3de)]);const _0x438d8a=_0x39c207(0x421,0x3c9)+_0x854431+_0x39c207(0x3c9,0x3ae)+(_0x4b8b47[_0x39c207(0x428,0x3d6)]()?'?'+_0x4b8b47[_0x39c207(0x3c2,0x3d6)]():''),response=await this[_0x39c207(0x42e,0x41e)]['get'](_0x438d8a);return{'data':response['data'],'error':null};}catch(_0x4ed004){return{'data':null,'error':_0x4ed004 instanceof EBaaSError?_0x4ed004:new EBaaSError(_0x4ed004 instanceof Error?_0x4ed004[_0x39c207(0x3d2,0x3b2)]:_0x39c207(0x40d,0x408),0x0,_0x4ed004)};}}async[_0x2d9ed0(0x3df,0x41a)](_0x1c9f18,_0x179902){function _0x2cb924(_0x54d59e,_0x161dd5){return _0x1cc1(_0x161dd5-0x203,_0x54d59e);}try{const _0x109018=new URLSearchParams();_0x179902?.[_0x2cb924(0x3b5,0x354)]&&_0x109018[_0x2cb924(0x382,0x3f8)](_0x2cb924(0x3bb,0x354),_0x179902['period']);const _0x51bda8='/functions/v1/'+_0x1c9f18+'/metrics'+(_0x109018['toString']()?'?'+_0x109018[_0x2cb924(0x38b,0x35e)]():''),response=await this[_0x2cb924(0x350,0x3a6)][_0x2cb924(0x3dd,0x3db)](_0x51bda8);return{'data':response['data'],'error':null};}catch(_0x4afcad){return{'data':null,'error':_0x4afcad instanceof EBaaSError?_0x4afcad:new EBaaSError(_0x4afcad instanceof Error?_0x4afcad['message']:_0x2cb924(0x48b,0x417),0x0,_0x4afcad)};}}}class EBaaSClient{constructor(_0x2b5299,_0x48f6d9,_0x3637b1){this['options']=_0x3637b1;function _0x391538(_0x129cde,_0x3b52b8){return _0x1cc1(_0x129cde-0x3d2,_0x3b52b8);}this[_0x391538(0x575,0x5b5)]=new HttpClient({'url':_0x2b5299,'apiKey':_0x48f6d9,'timeout':0x7530,'headers':_0x3637b1?.['global']?.[_0x391538(0x5f2,0x627)]}),this[_0x391538(0x56b,0x5ce)]=new AuthClient(this['httpClient'],_0x3637b1?.[_0x391538(0x59e,0x533)]?.[_0x391538(0x57e,0x573)]),this[_0x391538(0x59e,0x5bc)]=new DatabaseClient(this['httpClient'],_0x3637b1?.['database']?.[_0x391538(0x57e,0x56b)]),this['storage']=new StorageClient(this['httpClient']),this['realtime']=new RealtimeClient(_0x2b5299,_0x48f6d9,_0x3637b1?.[_0x391538(0x531,0x4f6)]),this['functions']=new FunctionsClient(this['httpClient']),this[_0x391538(0x565,0x4f0)]();}[_0x2d9ed0(0x42b,0x3c8)](_0x184dcd){function _0x210000(_0x4c47c6,_0x355d1a){return _0x1cc1(_0x4c47c6- -0xcc,_0x355d1a);}return this[_0x210000(0x100,0xc6)][_0x210000(0x14e,0x168)](_0x184dcd);}[_0x2d9ed0(0x40a,0x418)](_0x11825a,_0x459990){function _0x57fa52(_0x4b9659,_0x33f3f0){return _0x1cc1(_0x33f3f0-0x376,_0x4b9659);}return this[_0x57fa52(0x563,0x542)][_0x57fa52(0x4f4,0x56f)](_0x11825a,_0x459990);}['bucket'](_0x5f8b3d){function _0x140f9b(_0xf1b979,_0x52779a){return _0x1cc1(_0x52779a-0x1b0,_0xf1b979);}return this[_0x140f9b(0x31d,0x326)]['from'](_0x5f8b3d);}[_0x2d9ed0(0x351,0x326)](_0x56a609){function _0x479af5(_0x100688,_0x5633c4){return _0x1cc1(_0x100688- -0x2a4,_0x5633c4);}return this[_0x479af5(-0x145,-0x103)][_0x479af5(-0x164,-0xf7)](_0x56a609);}[_0x2d9ed0(0x42e,0x3d7)](_0x2d75b4,_0x300464){return this['functions']['invoke'](_0x2d75b4,_0x300464);}async[_0x2d9ed0(0x3a4,0x391)](){function _0x5c31c3(_0x24c2cb,_0x5ca1e4){return _0x1cc1(_0x24c2cb-0x1bb,_0x5ca1e4);}if(this['options']?.[_0x5c31c3(0x387,0x3a3)]?.['autoDetectCustomDatabase'])try{await this['database']['initialize']();}catch(_0x5b3265){console[_0x5c31c3(0x3d6,0x3f6)]('Failed to initialize custom database detection:',_0x5b3265);}}async[_0x2d9ed0(0x419,0x3b8)](_0x570b71){this[_0x26f2ce(-0x133,-0x1a5)]['setWorkspaceId'](_0x570b71);function _0x26f2ce(_0x47959e,_0xa14cce){return _0x1cc1(_0x47959e- -0x2cc,_0xa14cce);}this['database'][_0x26f2ce(-0xc4,-0xe6)](_0x570b71),this['options']?.['database']?.['autoDetectCustomDatabase']&&await this['database']['initialize']();}async['configureCustomDatabase'](_0x14c63f){await this['database']['configureCustomDatabase'](_0x14c63f);}['getCustomDatabaseStatus'](){function _0x22f9b7(_0x25222c,_0x306cbd){return _0x1cc1(_0x25222c-0x178,_0x306cbd);}return this['database'][_0x22f9b7(0x3a0,0x390)]();}}function createClient(_0x3dc09d,_0x3cfa50,_0x153eb2){return new EBaaSClient(_0x3dc09d,_0x3cfa50,_0x153eb2);}const version=_0x2d9ed0(0x394,0x388);function _0x1cc1(_0x579a85,_0x44b311){const _0x501481=_0x5014();return _0x1cc1=function(_0x1cc137,_0x43300d){_0x1cc137=_0x1cc137-0x130;let _0x348c9f=_0x501481[_0x1cc137];if(_0x1cc1['gQEMuN']===undefined){var _0x215787=function(_0x1f1e26){const _0x57daed='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1a928c='',_0x401160='';for(let _0x1e82aa=0x0,_0x18823a,_0xb0f5cb,_0x27c418=0x0;_0xb0f5cb=_0x1f1e26['charAt'](_0x27c418++);~_0xb0f5cb&&(_0x18823a=_0x1e82aa%0x4?_0x18823a*0x40+_0xb0f5cb:_0xb0f5cb,_0x1e82aa++%0x4)?_0x1a928c+=String['fromCharCode'](0xff&_0x18823a>>(-0x2*_0x1e82aa&0x6)):0x0){_0xb0f5cb=_0x57daed['indexOf'](_0xb0f5cb);}for(let _0x67ef13=0x0,_0x4707ea=_0x1a928c['length'];_0x67ef13<_0x4707ea;_0x67ef13++){_0x401160+='%'+('00'+_0x1a928c['charCodeAt'](_0x67ef13)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x401160);};_0x1cc1['oPmtIK']=_0x215787,_0x579a85=arguments,_0x1cc1['gQEMuN']=!![];}const _0x3aa26e=_0x501481[0x0],_0x4cbb01=_0x1cc137+_0x3aa26e,_0x527f8b=_0x579a85[_0x4cbb01];return!_0x527f8b?(_0x348c9f=_0x1cc1['oPmtIK'](_0x348c9f),_0x579a85[_0x4cbb01]=_0x348c9f):_0x348c9f=_0x527f8b,_0x348c9f;},_0x1cc1(_0x579a85,_0x44b311);}exports['AuthClient']=AuthClient;function _0x2d9ed0(_0x43bf20,_0x4f09d2){return _0x1cc1(_0x43bf20-0x211,_0x4f09d2);}exports[_0x2d9ed0(0x3bf,0x445)]=CustomDatabaseManager,exports[_0x2d9ed0(0x3a3,0x421)]=DatabaseClient,exports['EBaaSClient']=EBaaSClient,exports[_0x2d9ed0(0x450,0x3ff)]=EBaaSError,exports[_0x2d9ed0(0x3fc,0x3b7)]=FunctionsClient,exports[_0x2d9ed0(0x357,0x3c7)]=HttpClient,exports['QueryBuilder']=QueryBuilder,exports[_0x2d9ed0(0x3d3,0x3dc)]=RealtimeChannel,exports[_0x2d9ed0(0x3ac,0x335)]=RealtimeClient,exports[_0x2d9ed0(0x3cd,0x3e1)]=StorageBucket,exports[_0x2d9ed0(0x43b,0x3c2)]=StorageClient,exports['createClient']=createClient,exports['version']=version;
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var axios = require('axios');
|
|
4
|
+
|
|
5
|
+
class EBaaSError extends Error {
|
|
6
|
+
constructor(message, status = 0, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'EBaaSError';
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.details = details;
|
|
11
|
+
if (Error.captureStackTrace) {
|
|
12
|
+
Error.captureStackTrace(this, EBaaSError);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
toJSON() {
|
|
16
|
+
return {
|
|
17
|
+
name: this.name,
|
|
18
|
+
message: this.message,
|
|
19
|
+
status: this.status,
|
|
20
|
+
details: this.details,
|
|
21
|
+
stack: this.stack
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
toString() {
|
|
25
|
+
return `${this.name}: ${this.message} (Status: ${this.status})`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
class HttpClient {
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.baseURL = config.url;
|
|
32
|
+
this.apiKey = config.apiKey;
|
|
33
|
+
this.client = axios.create({
|
|
34
|
+
baseURL: this.baseURL,
|
|
35
|
+
timeout: config.timeout || 10000,
|
|
36
|
+
headers: {
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
'apikey': this.apiKey,
|
|
39
|
+
...config.headers,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
this.setupInterceptors();
|
|
43
|
+
}
|
|
44
|
+
setupInterceptors() {
|
|
45
|
+
// Request interceptor
|
|
46
|
+
this.client.interceptors.request.use((config) => {
|
|
47
|
+
return config;
|
|
48
|
+
}, (error) => {
|
|
49
|
+
return Promise.reject(new EBaaSError('Request failed', 0, error));
|
|
50
|
+
});
|
|
51
|
+
// Response interceptor
|
|
52
|
+
this.client.interceptors.response.use((response) => {
|
|
53
|
+
return response;
|
|
54
|
+
}, (error) => {
|
|
55
|
+
const status = error.response?.status || 0;
|
|
56
|
+
const message = error.response?.data?.message || error.message || 'Unknown error';
|
|
57
|
+
const details = error.response?.data || error;
|
|
58
|
+
return Promise.reject(new EBaaSError(message, status, details));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async get(url, config) {
|
|
62
|
+
try {
|
|
63
|
+
const response = await this.client.get(url, config);
|
|
64
|
+
return {
|
|
65
|
+
data: response.data,
|
|
66
|
+
status: response.status,
|
|
67
|
+
statusText: response.statusText,
|
|
68
|
+
headers: response.headers,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw this.handleError(error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async post(url, data, config) {
|
|
76
|
+
try {
|
|
77
|
+
const response = await this.client.post(url, data, config);
|
|
78
|
+
return {
|
|
79
|
+
data: response.data,
|
|
80
|
+
status: response.status,
|
|
81
|
+
statusText: response.statusText,
|
|
82
|
+
headers: response.headers,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw this.handleError(error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async put(url, data, config) {
|
|
90
|
+
try {
|
|
91
|
+
const response = await this.client.put(url, data, config);
|
|
92
|
+
return {
|
|
93
|
+
data: response.data,
|
|
94
|
+
status: response.status,
|
|
95
|
+
statusText: response.statusText,
|
|
96
|
+
headers: response.headers,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw this.handleError(error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async patch(url, data, config) {
|
|
104
|
+
try {
|
|
105
|
+
const response = await this.client.patch(url, data, config);
|
|
106
|
+
return {
|
|
107
|
+
data: response.data,
|
|
108
|
+
status: response.status,
|
|
109
|
+
statusText: response.statusText,
|
|
110
|
+
headers: response.headers,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
throw this.handleError(error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async delete(url, config) {
|
|
118
|
+
try {
|
|
119
|
+
const response = await this.client.delete(url, config);
|
|
120
|
+
return {
|
|
121
|
+
data: response.data,
|
|
122
|
+
status: response.status,
|
|
123
|
+
statusText: response.statusText,
|
|
124
|
+
headers: response.headers,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw this.handleError(error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
setAuthToken(token) {
|
|
132
|
+
this.client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
|
|
133
|
+
}
|
|
134
|
+
removeAuthToken() {
|
|
135
|
+
delete this.client.defaults.headers.common['Authorization'];
|
|
136
|
+
this.client.defaults.headers.common['Authorization'] = `Bearer ${this.apiKey}`;
|
|
137
|
+
}
|
|
138
|
+
handleError(error) {
|
|
139
|
+
if (error instanceof EBaaSError) {
|
|
140
|
+
return error;
|
|
141
|
+
}
|
|
142
|
+
return new EBaaSError(error.message || 'HTTP request failed', error.status || 0, error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
class AuthClient {
|
|
147
|
+
constructor(httpClient, workspaceId) {
|
|
148
|
+
this.currentSession = null;
|
|
149
|
+
this.httpClient = httpClient;
|
|
150
|
+
this.workspaceId = workspaceId;
|
|
151
|
+
this.loadSession();
|
|
152
|
+
}
|
|
153
|
+
async signUp(data) {
|
|
154
|
+
try {
|
|
155
|
+
const headers = {};
|
|
156
|
+
console.log('🔍 [SDK DEBUG] SignUp - workspaceId:', this.workspaceId);
|
|
157
|
+
// Incluir x-workspace-id se workspaceId foi fornecido (igual ao signIn)
|
|
158
|
+
if (this.workspaceId) {
|
|
159
|
+
headers['x-workspace-id'] = this.workspaceId;
|
|
160
|
+
console.log('✅ [SDK DEBUG] SignUp - header x-workspace-id adicionado:', this.workspaceId);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.log('❌ [SDK DEBUG] SignUp - workspaceId é undefined, header não adicionado');
|
|
164
|
+
}
|
|
165
|
+
console.log('🔍 [SDK DEBUG] SignUp - headers finais:', headers);
|
|
166
|
+
const response = await this.httpClient.post('/auth/v1/signup', data, {
|
|
167
|
+
headers
|
|
168
|
+
});
|
|
169
|
+
if (response.data.session) {
|
|
170
|
+
this.setSessionInternal(response.data.session);
|
|
171
|
+
}
|
|
172
|
+
return response.data;
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw this.handleAuthError(error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async signIn(data) {
|
|
179
|
+
try {
|
|
180
|
+
const headers = {};
|
|
181
|
+
// Incluir x-workspace-id se workspaceId foi fornecido
|
|
182
|
+
if (this.workspaceId) {
|
|
183
|
+
headers['x-workspace-id'] = this.workspaceId;
|
|
184
|
+
}
|
|
185
|
+
const response = await this.httpClient.post('/auth/v1/sdk/signin', data, {
|
|
186
|
+
headers
|
|
187
|
+
});
|
|
188
|
+
if (response.data.session) {
|
|
189
|
+
this.setSessionInternal(response.data.session);
|
|
190
|
+
}
|
|
191
|
+
return response.data;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
throw this.handleAuthError(error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async signOut() {
|
|
198
|
+
try {
|
|
199
|
+
await this.httpClient.post('/auth/v1/signout');
|
|
200
|
+
this.clearSession();
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
this.clearSession();
|
|
204
|
+
throw this.handleAuthError(error);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async getUser() {
|
|
208
|
+
if (!this.currentSession?.access_token) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
const response = await this.httpClient.get('/auth/v1/user');
|
|
213
|
+
return response.data.user;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (error instanceof EBaaSError && error.status === 401) {
|
|
217
|
+
this.clearSession();
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
throw this.handleAuthError(error);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async refreshSession() {
|
|
224
|
+
if (!this.currentSession?.refresh_token) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const response = await this.httpClient.post('/auth/v1/refresh', {
|
|
229
|
+
refresh_token: this.currentSession.refresh_token
|
|
230
|
+
});
|
|
231
|
+
if (response.data.session) {
|
|
232
|
+
this.setSession(response.data.session);
|
|
233
|
+
return response.data.session;
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
this.clearSession();
|
|
239
|
+
throw this.handleAuthError(error);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async resetPassword(email) {
|
|
243
|
+
try {
|
|
244
|
+
await this.httpClient.post('/auth/v1/reset-password', { email });
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
throw this.handleAuthError(error);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async updateUser(data) {
|
|
251
|
+
try {
|
|
252
|
+
const response = await this.httpClient.put('/auth/v1/user', data);
|
|
253
|
+
return response.data.user;
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
throw this.handleAuthError(error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
getSession() {
|
|
260
|
+
return this.currentSession;
|
|
261
|
+
}
|
|
262
|
+
setSession(session) {
|
|
263
|
+
this.currentSession = session;
|
|
264
|
+
this.httpClient.setAuthToken(session.access_token);
|
|
265
|
+
// Persist session
|
|
266
|
+
if (typeof localStorage !== 'undefined') {
|
|
267
|
+
localStorage.setItem('ebaas.auth.session', JSON.stringify(session));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
onAuthStateChange(callback) {
|
|
271
|
+
// Implementation for auth state change listener
|
|
272
|
+
// This would integrate with the actual auth state management system
|
|
273
|
+
return () => { };
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Atualiza o workspace ID (útil quando o usuário troca de workspace)
|
|
277
|
+
*/
|
|
278
|
+
setWorkspaceId(workspaceId) {
|
|
279
|
+
this.workspaceId = workspaceId;
|
|
280
|
+
}
|
|
281
|
+
setSessionInternal(session) {
|
|
282
|
+
this.currentSession = session;
|
|
283
|
+
this.httpClient.setAuthToken(session.access_token);
|
|
284
|
+
// Persist session
|
|
285
|
+
if (typeof localStorage !== 'undefined') {
|
|
286
|
+
localStorage.setItem('ebaas.auth.session', JSON.stringify(session));
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
clearSession() {
|
|
290
|
+
this.currentSession = null;
|
|
291
|
+
this.httpClient.removeAuthToken();
|
|
292
|
+
// Clear persisted session
|
|
293
|
+
if (typeof localStorage !== 'undefined') {
|
|
294
|
+
localStorage.removeItem('ebaas.auth.session');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
loadSession() {
|
|
298
|
+
if (typeof localStorage !== 'undefined') {
|
|
299
|
+
const storedSession = localStorage.getItem('ebaas.auth.session');
|
|
300
|
+
if (storedSession) {
|
|
301
|
+
try {
|
|
302
|
+
const session = JSON.parse(storedSession);
|
|
303
|
+
this.setSessionInternal(session);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
this.clearSession();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
handleAuthError(error) {
|
|
312
|
+
if (error instanceof EBaaSError) {
|
|
313
|
+
return error;
|
|
314
|
+
}
|
|
315
|
+
return new EBaaSError(error.message || 'Authentication failed', error.status || 0, error);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
class QueryBuilder {
|
|
320
|
+
constructor(httpClient, table, schema, workspaceId, restUrl) {
|
|
321
|
+
this.httpClient = httpClient;
|
|
322
|
+
this.table = table;
|
|
323
|
+
this.schema = schema;
|
|
324
|
+
this.workspaceId = workspaceId;
|
|
325
|
+
this.restUrl = restUrl || '/sdk/v1';
|
|
326
|
+
this.query = {
|
|
327
|
+
filters: []
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
select(columns = '*', options) {
|
|
331
|
+
this.query.select = columns;
|
|
332
|
+
return this;
|
|
333
|
+
}
|
|
334
|
+
insert(data, options) {
|
|
335
|
+
return this.executeQuery('POST', `${this.restUrl}/${this.table}?operation=insert`, { data, options });
|
|
336
|
+
}
|
|
337
|
+
update(data, options) {
|
|
338
|
+
this.query.updateData = data;
|
|
339
|
+
this.query.updateOptions = options;
|
|
340
|
+
return this;
|
|
341
|
+
}
|
|
342
|
+
upsert(data, options) {
|
|
343
|
+
return this.executeQuery('POST', `${this.restUrl}/${this.table}?operation=upsert`, {
|
|
344
|
+
data,
|
|
345
|
+
options: { ...options, upsert: true }
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
delete(options) {
|
|
349
|
+
this.query.deleteOptions = options;
|
|
350
|
+
this.query.isDelete = true;
|
|
351
|
+
return this;
|
|
352
|
+
}
|
|
353
|
+
// Filter methods
|
|
354
|
+
eq(column, value) {
|
|
355
|
+
this.query.filters.push({ column, operator: 'eq', value });
|
|
356
|
+
return this;
|
|
357
|
+
}
|
|
358
|
+
neq(column, value) {
|
|
359
|
+
this.query.filters.push({ column, operator: 'neq', value });
|
|
360
|
+
return this;
|
|
361
|
+
}
|
|
362
|
+
gt(column, value) {
|
|
363
|
+
this.query.filters.push({ column, operator: 'gt', value });
|
|
364
|
+
return this;
|
|
365
|
+
}
|
|
366
|
+
gte(column, value) {
|
|
367
|
+
this.query.filters.push({ column, operator: 'gte', value });
|
|
368
|
+
return this;
|
|
369
|
+
}
|
|
370
|
+
lt(column, value) {
|
|
371
|
+
this.query.filters.push({ column, operator: 'lt', value });
|
|
372
|
+
return this;
|
|
373
|
+
}
|
|
374
|
+
lte(column, value) {
|
|
375
|
+
this.query.filters.push({ column, operator: 'lte', value });
|
|
376
|
+
return this;
|
|
377
|
+
}
|
|
378
|
+
like(column, pattern) {
|
|
379
|
+
this.query.filters.push({ column, operator: 'like', value: pattern });
|
|
380
|
+
return this;
|
|
381
|
+
}
|
|
382
|
+
ilike(column, pattern) {
|
|
383
|
+
this.query.filters.push({ column, operator: 'ilike', value: pattern });
|
|
384
|
+
return this;
|
|
385
|
+
}
|
|
386
|
+
is(column, value) {
|
|
387
|
+
this.query.filters.push({ column, operator: 'is', value });
|
|
388
|
+
return this;
|
|
389
|
+
}
|
|
390
|
+
in(column, values) {
|
|
391
|
+
this.query.filters.push({ column, operator: 'in', value: values });
|
|
392
|
+
return this;
|
|
393
|
+
}
|
|
394
|
+
contains(column, value) {
|
|
395
|
+
this.query.filters.push({ column, operator: 'contains', value });
|
|
396
|
+
return this;
|
|
397
|
+
}
|
|
398
|
+
match(query) {
|
|
399
|
+
Object.entries(query).forEach(([column, value]) => {
|
|
400
|
+
this.eq(column, value);
|
|
401
|
+
});
|
|
402
|
+
return this;
|
|
403
|
+
}
|
|
404
|
+
// Ordering methods
|
|
405
|
+
order(column, options) {
|
|
406
|
+
if (!this.query.order) {
|
|
407
|
+
this.query.order = [];
|
|
408
|
+
}
|
|
409
|
+
this.query.order.push({
|
|
410
|
+
column,
|
|
411
|
+
ascending: options?.ascending !== false
|
|
412
|
+
});
|
|
413
|
+
return this;
|
|
414
|
+
}
|
|
415
|
+
// Limiting methods
|
|
416
|
+
limit(count) {
|
|
417
|
+
this.query.limit = count;
|
|
418
|
+
return this;
|
|
419
|
+
}
|
|
420
|
+
range(from, to) {
|
|
421
|
+
this.query.range = { from, to };
|
|
422
|
+
return this;
|
|
423
|
+
}
|
|
424
|
+
// Execution method for SELECT, UPDATE, or DELETE
|
|
425
|
+
async execute() {
|
|
426
|
+
// Detectar tipo de operação baseado nos dados do query
|
|
427
|
+
if (this.query.updateData) {
|
|
428
|
+
// UPDATE operation
|
|
429
|
+
return this.executeQuery('PATCH', `${this.restUrl}/${this.table}`, {
|
|
430
|
+
data: this.query.updateData,
|
|
431
|
+
options: this.query.updateOptions,
|
|
432
|
+
filters: this.query.filters
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
else if (this.query.isDelete) {
|
|
436
|
+
// DELETE operation
|
|
437
|
+
return this.executeQuery('DELETE', `${this.restUrl}/${this.table}?operation=delete`, {
|
|
438
|
+
options: this.query.deleteOptions,
|
|
439
|
+
filters: this.query.filters
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// SELECT operation (default)
|
|
444
|
+
return this.executeQuery('GET', `${this.restUrl}/${this.table}?operation=select`, {
|
|
445
|
+
select: this.query.select,
|
|
446
|
+
filters: this.query.filters,
|
|
447
|
+
order: this.query.order,
|
|
448
|
+
limit: this.query.limit,
|
|
449
|
+
range: this.query.range
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Single row execution
|
|
454
|
+
async single() {
|
|
455
|
+
this.limit(1);
|
|
456
|
+
const result = await this.execute();
|
|
457
|
+
return {
|
|
458
|
+
data: result.data?.[0] || null,
|
|
459
|
+
error: result.error,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
async executeQuery(method, url, payload) {
|
|
463
|
+
try {
|
|
464
|
+
let response;
|
|
465
|
+
// Configurar headers obrigatórios
|
|
466
|
+
const headers = {};
|
|
467
|
+
if (this.workspaceId) {
|
|
468
|
+
headers['x-workspace-id'] = this.workspaceId;
|
|
469
|
+
}
|
|
470
|
+
if (method === 'GET') {
|
|
471
|
+
// Extrair parâmetros existentes da URL (como operation=select)
|
|
472
|
+
const urlParts = url.split('?');
|
|
473
|
+
const baseUrl = urlParts[0];
|
|
474
|
+
const existingParams = new URLSearchParams(urlParts[1] || '');
|
|
475
|
+
// Adicionar novos parâmetros de query
|
|
476
|
+
if (payload.select)
|
|
477
|
+
existingParams.append('select', payload.select);
|
|
478
|
+
// Converter filtros para formato PostgREST
|
|
479
|
+
if (payload.filters?.length) {
|
|
480
|
+
payload.filters.forEach((filter) => {
|
|
481
|
+
existingParams.append(filter.column, `${filter.operator}.${filter.value}`);
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
// Converter ordenação para formato PostgREST
|
|
485
|
+
if (payload.order?.length) {
|
|
486
|
+
const orderStr = payload.order.map((ord) => `${ord.column}${ord.ascending ? '.asc' : '.desc'}`).join(',');
|
|
487
|
+
existingParams.append('order', orderStr);
|
|
488
|
+
}
|
|
489
|
+
if (payload.limit)
|
|
490
|
+
existingParams.append('limit', payload.limit.toString());
|
|
491
|
+
if (payload.range) {
|
|
492
|
+
existingParams.append('offset', payload.range.from.toString());
|
|
493
|
+
existingParams.append('limit', (payload.range.to - payload.range.from + 1).toString());
|
|
494
|
+
}
|
|
495
|
+
response = await this.httpClient.get(`${baseUrl}?${existingParams.toString()}`, { headers });
|
|
496
|
+
}
|
|
497
|
+
else if (method === 'DELETE') {
|
|
498
|
+
// Para DELETE, os filtros devem estar na URL (query string), não no body
|
|
499
|
+
// Extrair parâmetros existentes da URL (como operation=delete)
|
|
500
|
+
const urlParts = url.split('?');
|
|
501
|
+
const baseUrl = urlParts[0];
|
|
502
|
+
const existingParams = new URLSearchParams(urlParts[1] || '');
|
|
503
|
+
// Adicionar parâmetro operation=delete se não estiver presente
|
|
504
|
+
if (!existingParams.has('operation')) {
|
|
505
|
+
existingParams.append('operation', 'delete');
|
|
506
|
+
}
|
|
507
|
+
if (payload.filters?.length) {
|
|
508
|
+
// Converter filtros para formato PostgREST
|
|
509
|
+
payload.filters.forEach((filter) => {
|
|
510
|
+
existingParams.append(filter.column, `${filter.operator}.${filter.value}`);
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
const deleteUrl = `${baseUrl}?${existingParams.toString()}`;
|
|
514
|
+
console.log('🔧 DELETE URL construída:', deleteUrl);
|
|
515
|
+
console.log('🔧 DELETE headers:', headers);
|
|
516
|
+
console.log('🔧 DELETE filtros originais:', payload.filters);
|
|
517
|
+
response = await this.httpClient.delete(deleteUrl, { headers });
|
|
518
|
+
}
|
|
519
|
+
else if (method === 'PATCH') {
|
|
520
|
+
// Para UPDATE (PATCH), os filtros também devem estar na URL
|
|
521
|
+
// Extrair parâmetros existentes da URL (como operation=update)
|
|
522
|
+
const urlParts = url.split('?');
|
|
523
|
+
const baseUrl = urlParts[0];
|
|
524
|
+
const existingParams = new URLSearchParams(urlParts[1] || '');
|
|
525
|
+
// Adicionar parâmetro operation=update se não estiver presente
|
|
526
|
+
if (!existingParams.has('operation')) {
|
|
527
|
+
existingParams.append('operation', 'update');
|
|
528
|
+
}
|
|
529
|
+
if (payload.filters?.length) {
|
|
530
|
+
// Converter filtros para formato PostgREST
|
|
531
|
+
payload.filters.forEach((filter) => {
|
|
532
|
+
existingParams.append(filter.column, `${filter.operator}.${filter.value}`);
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
// Adicionar headers Prefer se necessário
|
|
536
|
+
if (payload.options?.prefer) {
|
|
537
|
+
headers['Prefer'] = payload.options.prefer;
|
|
538
|
+
}
|
|
539
|
+
const updateUrl = `${baseUrl}?${existingParams.toString()}`;
|
|
540
|
+
response = await this.httpClient.patch(updateUrl, payload.data, { headers });
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
// POST mantém o payload no body (para INSERT)
|
|
544
|
+
let postData = payload.data;
|
|
545
|
+
// Sempre retornar dados inseridos por padrão
|
|
546
|
+
if (!headers['Prefer']) {
|
|
547
|
+
headers['Prefer'] = 'return=representation';
|
|
548
|
+
}
|
|
549
|
+
// Se for upsert, adicionar header Prefer
|
|
550
|
+
if (payload.options?.upsert) {
|
|
551
|
+
headers['Prefer'] = 'resolution=merge-duplicates,return=representation';
|
|
552
|
+
}
|
|
553
|
+
// Se for inserção múltipla, usar dataArray
|
|
554
|
+
if (payload.dataArray) {
|
|
555
|
+
postData = payload.dataArray;
|
|
556
|
+
}
|
|
557
|
+
response = await this.httpClient.post(url, postData, { headers });
|
|
558
|
+
}
|
|
559
|
+
return {
|
|
560
|
+
data: response.data,
|
|
561
|
+
error: null,
|
|
562
|
+
count: response.headers?.['x-total-count'] ? parseInt(response.headers['x-total-count']) : undefined
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
catch (error) {
|
|
566
|
+
return {
|
|
567
|
+
data: null,
|
|
568
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Database operation failed', 0, error)
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
class CustomDatabaseManager {
|
|
575
|
+
constructor(httpClient, workspaceId) {
|
|
576
|
+
this.httpClient = httpClient;
|
|
577
|
+
this.workspaceId = workspaceId;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Detecta automaticamente se o workspace usa banco customizado
|
|
581
|
+
*/
|
|
582
|
+
async detectCustomDatabase() {
|
|
583
|
+
if (!this.workspaceId) {
|
|
584
|
+
return { hasCustomDatabase: false };
|
|
585
|
+
}
|
|
586
|
+
try {
|
|
587
|
+
// Busca a configuração do workspace
|
|
588
|
+
const response = await this.httpClient.get('/admin/v1/workspace/custom-database', {
|
|
589
|
+
headers: {
|
|
590
|
+
'x-workspace-id': this.workspaceId,
|
|
591
|
+
},
|
|
592
|
+
});
|
|
593
|
+
if (response.status === 200 && response.data?.config) {
|
|
594
|
+
const config = response.data.config;
|
|
595
|
+
// Converte para formato de credenciais do SDK
|
|
596
|
+
const credentials = {
|
|
597
|
+
host: config.postgresHost,
|
|
598
|
+
port: config.postgresPort,
|
|
599
|
+
database: config.postgresDatabase,
|
|
600
|
+
username: config.postgresUsername,
|
|
601
|
+
password: '', // Senha não é retornada pela API por segurança
|
|
602
|
+
schema: config.postgresSchema,
|
|
603
|
+
sslEnabled: config.sslEnabled,
|
|
604
|
+
};
|
|
605
|
+
this.detectedConfig = {
|
|
606
|
+
hasCustomDatabase: true,
|
|
607
|
+
config,
|
|
608
|
+
credentials,
|
|
609
|
+
};
|
|
610
|
+
return this.detectedConfig;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
// Se erro 404, significa que não há configuração customizada
|
|
615
|
+
if (error?.status === 404) {
|
|
616
|
+
this.detectedConfig = { hasCustomDatabase: false };
|
|
617
|
+
return this.detectedConfig;
|
|
618
|
+
}
|
|
619
|
+
console.warn('Failed to detect custom database configuration:', error);
|
|
620
|
+
}
|
|
621
|
+
this.detectedConfig = { hasCustomDatabase: false };
|
|
622
|
+
return this.detectedConfig;
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Testa conexão com banco customizado
|
|
626
|
+
*/
|
|
627
|
+
async testConnection(credentials) {
|
|
628
|
+
try {
|
|
629
|
+
const response = await this.httpClient.post('/admin/v1/workspace/custom-database/test-connection', credentials, {
|
|
630
|
+
headers: this.workspaceId ? { 'X-Workspace-ID': this.workspaceId } : {},
|
|
631
|
+
});
|
|
632
|
+
return response.data;
|
|
633
|
+
}
|
|
634
|
+
catch (error) {
|
|
635
|
+
return {
|
|
636
|
+
success: false,
|
|
637
|
+
message: error?.message || 'Failed to test connection',
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Configura credenciais customizadas para o workspace
|
|
643
|
+
*/
|
|
644
|
+
async configureCustomDatabase(credentials) {
|
|
645
|
+
if (!this.workspaceId) {
|
|
646
|
+
throw new Error('Workspace ID is required to configure custom database');
|
|
647
|
+
}
|
|
648
|
+
const response = await this.httpClient.post('/admin/v1/workspace/custom-database', {
|
|
649
|
+
workspaceId: this.workspaceId,
|
|
650
|
+
...credentials,
|
|
651
|
+
}, {
|
|
652
|
+
headers: {
|
|
653
|
+
'X-Workspace-ID': this.workspaceId,
|
|
654
|
+
},
|
|
655
|
+
});
|
|
656
|
+
const config = response.data.config;
|
|
657
|
+
// Atualiza a configuração detectada
|
|
658
|
+
this.detectedConfig = {
|
|
659
|
+
hasCustomDatabase: true,
|
|
660
|
+
config,
|
|
661
|
+
credentials,
|
|
662
|
+
};
|
|
663
|
+
return config;
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Remove configuração de banco customizado
|
|
667
|
+
*/
|
|
668
|
+
async removeCustomDatabase() {
|
|
669
|
+
if (!this.workspaceId) {
|
|
670
|
+
throw new Error('Workspace ID is required to remove custom database');
|
|
671
|
+
}
|
|
672
|
+
await this.httpClient.delete('/admin/v1/workspace/custom-database', {
|
|
673
|
+
headers: {
|
|
674
|
+
'X-Workspace-ID': this.workspaceId,
|
|
675
|
+
},
|
|
676
|
+
});
|
|
677
|
+
// Limpa a configuração detectada
|
|
678
|
+
this.detectedConfig = { hasCustomDatabase: false };
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* Retorna a configuração detectada em cache
|
|
682
|
+
*/
|
|
683
|
+
getDetectedConfig() {
|
|
684
|
+
return this.detectedConfig;
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Verifica se tem configuração customizada em cache
|
|
688
|
+
*/
|
|
689
|
+
hasCustomDatabase() {
|
|
690
|
+
return this.detectedConfig?.hasCustomDatabase ?? false;
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Retorna as credenciais customizadas se disponíveis
|
|
694
|
+
*/
|
|
695
|
+
getCustomCredentials() {
|
|
696
|
+
return this.detectedConfig?.credentials;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Atualiza o workspace ID
|
|
700
|
+
*/
|
|
701
|
+
setWorkspaceId(workspaceId) {
|
|
702
|
+
this.workspaceId = workspaceId;
|
|
703
|
+
// Limpa configuração anterior quando workspace muda
|
|
704
|
+
this.detectedConfig = undefined;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* Retorna o workspace ID atual
|
|
708
|
+
*/
|
|
709
|
+
getWorkspaceId() {
|
|
710
|
+
return this.workspaceId;
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Retorna informações sobre o status do banco customizado
|
|
714
|
+
*/
|
|
715
|
+
getStatus() {
|
|
716
|
+
return {
|
|
717
|
+
workspaceId: this.workspaceId,
|
|
718
|
+
hasConfig: this.hasCustomDatabase(),
|
|
719
|
+
configDetails: this.detectedConfig?.credentials ? {
|
|
720
|
+
host: this.detectedConfig.credentials.host,
|
|
721
|
+
port: this.detectedConfig.credentials.port,
|
|
722
|
+
database: this.detectedConfig.credentials.database,
|
|
723
|
+
schema: this.detectedConfig.credentials.schema || 'public',
|
|
724
|
+
sslEnabled: this.detectedConfig.credentials.sslEnabled || false,
|
|
725
|
+
} : undefined,
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
class DatabaseClient {
|
|
731
|
+
constructor(httpClient, workspaceId, restUrl) {
|
|
732
|
+
this.httpClient = httpClient;
|
|
733
|
+
this.customDatabaseManager = new CustomDatabaseManager(httpClient, workspaceId);
|
|
734
|
+
this.restUrl = restUrl || '/sdk/v1';
|
|
735
|
+
}
|
|
736
|
+
from(table) {
|
|
737
|
+
return new QueryBuilder(this.httpClient, table, this.currentSchema, this.customDatabaseManager.getWorkspaceId(), this.restUrl);
|
|
738
|
+
}
|
|
739
|
+
rpc(fn, args) {
|
|
740
|
+
return this.httpClient.post(`/rpc/${fn}`, args);
|
|
741
|
+
}
|
|
742
|
+
schema(schema) {
|
|
743
|
+
const client = new DatabaseClient(this.httpClient, this.customDatabaseManager.getWorkspaceId(), this.restUrl);
|
|
744
|
+
client.currentSchema = schema;
|
|
745
|
+
client.customDatabaseManager = this.customDatabaseManager;
|
|
746
|
+
return client;
|
|
747
|
+
}
|
|
748
|
+
// Métodos para gerenciar banco customizado
|
|
749
|
+
/**
|
|
750
|
+
* Detecta automaticamente se o workspace usa banco customizado
|
|
751
|
+
*/
|
|
752
|
+
async detectCustomDatabase() {
|
|
753
|
+
return this.customDatabaseManager.detectCustomDatabase();
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* Testa conexão com credenciais customizadas
|
|
757
|
+
*/
|
|
758
|
+
async testCustomConnection(credentials) {
|
|
759
|
+
return this.customDatabaseManager.testConnection(credentials);
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Configura banco customizado para o workspace
|
|
763
|
+
*/
|
|
764
|
+
async configureCustomDatabase(credentials) {
|
|
765
|
+
return this.customDatabaseManager.configureCustomDatabase(credentials);
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Remove configuração de banco customizado
|
|
769
|
+
*/
|
|
770
|
+
async removeCustomDatabase() {
|
|
771
|
+
return this.customDatabaseManager.removeCustomDatabase();
|
|
772
|
+
}
|
|
773
|
+
/**
|
|
774
|
+
* Verifica se o workspace está usando banco customizado
|
|
775
|
+
*/
|
|
776
|
+
isUsingCustomDatabase() {
|
|
777
|
+
return this.customDatabaseManager.hasCustomDatabase();
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* Retorna informações sobre o banco customizado
|
|
781
|
+
*/
|
|
782
|
+
getCustomDatabaseStatus() {
|
|
783
|
+
return this.customDatabaseManager.getStatus();
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Atualiza o workspace ID (útil quando o usuário troca de workspace)
|
|
787
|
+
*/
|
|
788
|
+
setWorkspaceId(workspaceId) {
|
|
789
|
+
this.customDatabaseManager.setWorkspaceId(workspaceId);
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Inicializa a detecção automática do banco customizado
|
|
793
|
+
* Deve ser chamado após a autenticação se autoDetectCustomDatabase estiver habilitado
|
|
794
|
+
*/
|
|
795
|
+
async initialize() {
|
|
796
|
+
try {
|
|
797
|
+
await this.customDatabaseManager.detectCustomDatabase();
|
|
798
|
+
}
|
|
799
|
+
catch (error) {
|
|
800
|
+
console.warn('Failed to initialize custom database detection:', error);
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
class StorageBucket {
|
|
806
|
+
constructor(httpClient, bucketId) {
|
|
807
|
+
this.httpClient = httpClient;
|
|
808
|
+
this.bucketId = bucketId;
|
|
809
|
+
}
|
|
810
|
+
async upload(path, file, options) {
|
|
811
|
+
try {
|
|
812
|
+
const formData = new FormData();
|
|
813
|
+
if (file instanceof File) {
|
|
814
|
+
formData.append('file', file);
|
|
815
|
+
}
|
|
816
|
+
else if (file instanceof Blob) {
|
|
817
|
+
formData.append('file', file, path);
|
|
818
|
+
}
|
|
819
|
+
else if (file instanceof ArrayBuffer) {
|
|
820
|
+
formData.append('file', new Blob([file]), path);
|
|
821
|
+
}
|
|
822
|
+
else if (typeof file === 'string') {
|
|
823
|
+
formData.append('file', new Blob([file], { type: 'text/plain' }), path);
|
|
824
|
+
}
|
|
825
|
+
formData.append('path', path);
|
|
826
|
+
if (options?.cacheControl) {
|
|
827
|
+
formData.append('cacheControl', options.cacheControl);
|
|
828
|
+
}
|
|
829
|
+
if (options?.contentType) {
|
|
830
|
+
formData.append('contentType', options.contentType);
|
|
831
|
+
}
|
|
832
|
+
if (options?.metadata) {
|
|
833
|
+
formData.append('metadata', JSON.stringify(options.metadata));
|
|
834
|
+
}
|
|
835
|
+
const url = `/storage/buckets/${this.bucketId}/files${options?.upsert ? '?upsert=true' : ''}`;
|
|
836
|
+
const response = await this.httpClient.post(url, formData, {
|
|
837
|
+
headers: {
|
|
838
|
+
'Content-Type': 'multipart/form-data'
|
|
839
|
+
}
|
|
840
|
+
});
|
|
841
|
+
return {
|
|
842
|
+
data: response.data,
|
|
843
|
+
error: null
|
|
844
|
+
};
|
|
845
|
+
}
|
|
846
|
+
catch (error) {
|
|
847
|
+
return {
|
|
848
|
+
data: null,
|
|
849
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to upload file', 0, error)
|
|
850
|
+
};
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
async download(path, options) {
|
|
854
|
+
try {
|
|
855
|
+
const params = new URLSearchParams();
|
|
856
|
+
if (options?.transform) {
|
|
857
|
+
Object.entries(options.transform).forEach(([key, value]) => {
|
|
858
|
+
if (value !== undefined) {
|
|
859
|
+
params.append(key, String(value));
|
|
860
|
+
}
|
|
861
|
+
});
|
|
862
|
+
}
|
|
863
|
+
const url = `/storage/buckets/${this.bucketId}/files/${path}${params.toString() ? `?${params.toString()}` : ''}`;
|
|
864
|
+
const response = await this.httpClient.get(url, {
|
|
865
|
+
responseType: 'blob'
|
|
866
|
+
});
|
|
867
|
+
return {
|
|
868
|
+
data: response.data,
|
|
869
|
+
error: null
|
|
870
|
+
};
|
|
871
|
+
}
|
|
872
|
+
catch (error) {
|
|
873
|
+
return {
|
|
874
|
+
data: null,
|
|
875
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to download file', 0, error)
|
|
876
|
+
};
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
async list(prefix, options) {
|
|
880
|
+
try {
|
|
881
|
+
const params = new URLSearchParams();
|
|
882
|
+
if (prefix) {
|
|
883
|
+
params.append('prefix', prefix);
|
|
884
|
+
}
|
|
885
|
+
if (options?.limit) {
|
|
886
|
+
params.append('limit', String(options.limit));
|
|
887
|
+
}
|
|
888
|
+
if (options?.offset) {
|
|
889
|
+
params.append('offset', String(options.offset));
|
|
890
|
+
}
|
|
891
|
+
if (options?.sortBy) {
|
|
892
|
+
params.append('sortBy', JSON.stringify(options.sortBy));
|
|
893
|
+
}
|
|
894
|
+
if (options?.search) {
|
|
895
|
+
params.append('search', options.search);
|
|
896
|
+
}
|
|
897
|
+
const url = `/storage/buckets/${this.bucketId}/files${params.toString() ? `?${params.toString()}` : ''}`;
|
|
898
|
+
const response = await this.httpClient.get(url);
|
|
899
|
+
return {
|
|
900
|
+
data: response.data,
|
|
901
|
+
error: null
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
catch (error) {
|
|
905
|
+
return {
|
|
906
|
+
data: null,
|
|
907
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to list files', 0, error)
|
|
908
|
+
};
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
async remove(paths) {
|
|
912
|
+
try {
|
|
913
|
+
const response = await this.httpClient.delete(`/storage/buckets/${this.bucketId}/files`, {
|
|
914
|
+
data: { paths }
|
|
915
|
+
});
|
|
916
|
+
return {
|
|
917
|
+
data: response.data,
|
|
918
|
+
error: null
|
|
919
|
+
};
|
|
920
|
+
}
|
|
921
|
+
catch (error) {
|
|
922
|
+
return {
|
|
923
|
+
data: null,
|
|
924
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to remove files', 0, error)
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
async move(fromPath, toPath) {
|
|
929
|
+
try {
|
|
930
|
+
const response = await this.httpClient.post(`/storage/buckets/${this.bucketId}/files/move`, {
|
|
931
|
+
sourceKey: fromPath,
|
|
932
|
+
destinationKey: toPath
|
|
933
|
+
});
|
|
934
|
+
return {
|
|
935
|
+
data: response.data,
|
|
936
|
+
error: null
|
|
937
|
+
};
|
|
938
|
+
}
|
|
939
|
+
catch (error) {
|
|
940
|
+
return {
|
|
941
|
+
data: null,
|
|
942
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to move file', 0, error)
|
|
943
|
+
};
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
async copy(fromPath, toPath) {
|
|
947
|
+
try {
|
|
948
|
+
const response = await this.httpClient.post(`/storage/buckets/${this.bucketId}/files/copy`, {
|
|
949
|
+
sourceKey: fromPath,
|
|
950
|
+
destinationKey: toPath
|
|
951
|
+
});
|
|
952
|
+
return {
|
|
953
|
+
data: response.data,
|
|
954
|
+
error: null
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
catch (error) {
|
|
958
|
+
return {
|
|
959
|
+
data: null,
|
|
960
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to copy file', 0, error)
|
|
961
|
+
};
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
async createSignedUrl(path, expiresIn, options) {
|
|
965
|
+
try {
|
|
966
|
+
const response = await this.httpClient.post(`/storage/buckets/${this.bucketId}/files/${path}/sign`, {
|
|
967
|
+
expiresIn,
|
|
968
|
+
...options
|
|
969
|
+
});
|
|
970
|
+
return {
|
|
971
|
+
data: response.data,
|
|
972
|
+
error: null
|
|
973
|
+
};
|
|
974
|
+
}
|
|
975
|
+
catch (error) {
|
|
976
|
+
return {
|
|
977
|
+
data: null,
|
|
978
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to create signed URL', 0, error)
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
getPublicUrl(path, options) {
|
|
983
|
+
const params = new URLSearchParams();
|
|
984
|
+
if (options?.transform) {
|
|
985
|
+
Object.entries(options.transform).forEach(([key, value]) => {
|
|
986
|
+
if (value !== undefined) {
|
|
987
|
+
params.append(key, String(value));
|
|
988
|
+
}
|
|
989
|
+
});
|
|
990
|
+
}
|
|
991
|
+
const baseUrl = this.httpClient['baseURL'] || '';
|
|
992
|
+
const publicUrl = `${baseUrl}/storage/buckets/${this.bucketId}/files/${path}${params.toString() ? `?${params.toString()}` : ''}`;
|
|
993
|
+
return {
|
|
994
|
+
data: {
|
|
995
|
+
publicUrl
|
|
996
|
+
}
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
async getFileInfo(path) {
|
|
1000
|
+
try {
|
|
1001
|
+
const response = await this.httpClient.get(`/storage/buckets/${this.bucketId}/files/${path}/info`);
|
|
1002
|
+
return {
|
|
1003
|
+
data: response.data,
|
|
1004
|
+
error: null
|
|
1005
|
+
};
|
|
1006
|
+
}
|
|
1007
|
+
catch (error) {
|
|
1008
|
+
return {
|
|
1009
|
+
data: null,
|
|
1010
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to get file info', 0, error)
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
async updateFileMetadata(path, metadata) {
|
|
1015
|
+
try {
|
|
1016
|
+
const response = await this.httpClient.put(`/storage/buckets/${this.bucketId}/files/${path}/metadata`, {
|
|
1017
|
+
metadata
|
|
1018
|
+
});
|
|
1019
|
+
return {
|
|
1020
|
+
data: response.data,
|
|
1021
|
+
error: null
|
|
1022
|
+
};
|
|
1023
|
+
}
|
|
1024
|
+
catch (error) {
|
|
1025
|
+
return {
|
|
1026
|
+
data: null,
|
|
1027
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to update file metadata', 0, error)
|
|
1028
|
+
};
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
class StorageClient {
|
|
1034
|
+
constructor(httpClient) {
|
|
1035
|
+
this.httpClient = httpClient;
|
|
1036
|
+
}
|
|
1037
|
+
from(bucketId) {
|
|
1038
|
+
return new StorageBucket(this.httpClient, bucketId);
|
|
1039
|
+
}
|
|
1040
|
+
async createBucket(id, options) {
|
|
1041
|
+
try {
|
|
1042
|
+
const response = await this.httpClient.post('/storage/buckets', {
|
|
1043
|
+
id,
|
|
1044
|
+
...options
|
|
1045
|
+
});
|
|
1046
|
+
return {
|
|
1047
|
+
data: response.data,
|
|
1048
|
+
error: null
|
|
1049
|
+
};
|
|
1050
|
+
}
|
|
1051
|
+
catch (error) {
|
|
1052
|
+
return {
|
|
1053
|
+
data: null,
|
|
1054
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to create bucket', 0, error)
|
|
1055
|
+
};
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
async getBucket(id) {
|
|
1059
|
+
try {
|
|
1060
|
+
const response = await this.httpClient.get(`/storage/buckets/${id}`);
|
|
1061
|
+
return {
|
|
1062
|
+
data: response.data,
|
|
1063
|
+
error: null
|
|
1064
|
+
};
|
|
1065
|
+
}
|
|
1066
|
+
catch (error) {
|
|
1067
|
+
return {
|
|
1068
|
+
data: null,
|
|
1069
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to get bucket', 0, error)
|
|
1070
|
+
};
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
async listBuckets() {
|
|
1074
|
+
try {
|
|
1075
|
+
const response = await this.httpClient.get('/storage/buckets');
|
|
1076
|
+
return {
|
|
1077
|
+
data: response.data,
|
|
1078
|
+
error: null
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1081
|
+
catch (error) {
|
|
1082
|
+
return {
|
|
1083
|
+
data: null,
|
|
1084
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to list buckets', 0, error)
|
|
1085
|
+
};
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
async updateBucket(id, options) {
|
|
1089
|
+
try {
|
|
1090
|
+
const response = await this.httpClient.put(`/storage/buckets/${id}`, options);
|
|
1091
|
+
return {
|
|
1092
|
+
data: response.data,
|
|
1093
|
+
error: null
|
|
1094
|
+
};
|
|
1095
|
+
}
|
|
1096
|
+
catch (error) {
|
|
1097
|
+
return {
|
|
1098
|
+
data: null,
|
|
1099
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to update bucket', 0, error)
|
|
1100
|
+
};
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
async deleteBucket(id) {
|
|
1104
|
+
try {
|
|
1105
|
+
const response = await this.httpClient.delete(`/storage/buckets/${id}`);
|
|
1106
|
+
return {
|
|
1107
|
+
data: response.data,
|
|
1108
|
+
error: null
|
|
1109
|
+
};
|
|
1110
|
+
}
|
|
1111
|
+
catch (error) {
|
|
1112
|
+
return {
|
|
1113
|
+
data: null,
|
|
1114
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to delete bucket', 0, error)
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
async getUsage() {
|
|
1119
|
+
try {
|
|
1120
|
+
const response = await this.httpClient.get('/storage/usage');
|
|
1121
|
+
return {
|
|
1122
|
+
data: response.data,
|
|
1123
|
+
error: null
|
|
1124
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
catch (error) {
|
|
1127
|
+
return {
|
|
1128
|
+
data: null,
|
|
1129
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to get storage usage', 0, error)
|
|
1130
|
+
};
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
class EventManager {
|
|
1136
|
+
constructor() {
|
|
1137
|
+
this.events = new Map();
|
|
1138
|
+
this.maxListeners = 10;
|
|
1139
|
+
}
|
|
1140
|
+
on(event, callback) {
|
|
1141
|
+
if (!this.events.has(event)) {
|
|
1142
|
+
this.events.set(event, new Set());
|
|
1143
|
+
}
|
|
1144
|
+
this.events.get(event).add(callback);
|
|
1145
|
+
}
|
|
1146
|
+
off(event, callback) {
|
|
1147
|
+
if (!this.events.has(event))
|
|
1148
|
+
return;
|
|
1149
|
+
const eventCallbacks = this.events.get(event);
|
|
1150
|
+
if (callback) {
|
|
1151
|
+
eventCallbacks.delete(callback);
|
|
1152
|
+
}
|
|
1153
|
+
else {
|
|
1154
|
+
eventCallbacks.clear();
|
|
1155
|
+
}
|
|
1156
|
+
if (eventCallbacks.size === 0) {
|
|
1157
|
+
this.events.delete(event);
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
emit(event, ...args) {
|
|
1161
|
+
if (!this.events.has(event))
|
|
1162
|
+
return false;
|
|
1163
|
+
const eventCallbacks = this.events.get(event);
|
|
1164
|
+
for (const callback of eventCallbacks) {
|
|
1165
|
+
try {
|
|
1166
|
+
callback(...args);
|
|
1167
|
+
}
|
|
1168
|
+
catch (error) {
|
|
1169
|
+
console.error(`Error in event listener for "${event}":`, error);
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
return eventCallbacks.size > 0;
|
|
1173
|
+
}
|
|
1174
|
+
removeAllListeners(event) {
|
|
1175
|
+
if (event) {
|
|
1176
|
+
this.events.delete(event);
|
|
1177
|
+
}
|
|
1178
|
+
else {
|
|
1179
|
+
this.events.clear();
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
listenerCount(event) {
|
|
1183
|
+
return this.events.get(event)?.size ?? 0;
|
|
1184
|
+
}
|
|
1185
|
+
eventNames() {
|
|
1186
|
+
return Array.from(this.events.keys());
|
|
1187
|
+
}
|
|
1188
|
+
listeners(event) {
|
|
1189
|
+
return Array.from(this.events.get(event) ?? []);
|
|
1190
|
+
}
|
|
1191
|
+
addListener(event, callback) {
|
|
1192
|
+
this.on(event, callback);
|
|
1193
|
+
}
|
|
1194
|
+
removeListener(event, callback) {
|
|
1195
|
+
this.off(event, callback);
|
|
1196
|
+
}
|
|
1197
|
+
once(event, callback) {
|
|
1198
|
+
const onceWrapper = (...args) => {
|
|
1199
|
+
this.off(event, onceWrapper);
|
|
1200
|
+
callback(...args);
|
|
1201
|
+
};
|
|
1202
|
+
this.on(event, onceWrapper);
|
|
1203
|
+
}
|
|
1204
|
+
prependListener(event, callback) {
|
|
1205
|
+
this.on(event, callback);
|
|
1206
|
+
}
|
|
1207
|
+
prependOnceListener(event, callback) {
|
|
1208
|
+
const onceWrapper = (...args) => {
|
|
1209
|
+
this.off(event, onceWrapper);
|
|
1210
|
+
callback(...args);
|
|
1211
|
+
};
|
|
1212
|
+
this.on(event, onceWrapper);
|
|
1213
|
+
}
|
|
1214
|
+
setMaxListeners(max) {
|
|
1215
|
+
this.maxListeners = max;
|
|
1216
|
+
return this;
|
|
1217
|
+
}
|
|
1218
|
+
getMaxListeners() {
|
|
1219
|
+
return this.maxListeners;
|
|
1220
|
+
}
|
|
1221
|
+
rawListeners(event) {
|
|
1222
|
+
return this.listeners(event);
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
class RealtimeChannel extends EventManager {
|
|
1227
|
+
constructor(topic, socket) {
|
|
1228
|
+
super();
|
|
1229
|
+
this.joinedOnce = false;
|
|
1230
|
+
this.state = 'closed';
|
|
1231
|
+
this.subscriptions = new Map();
|
|
1232
|
+
this.topic = topic;
|
|
1233
|
+
this.socket = socket;
|
|
1234
|
+
}
|
|
1235
|
+
subscribe(callback) {
|
|
1236
|
+
if (!this.joinedOnce) {
|
|
1237
|
+
this.joinedOnce = true;
|
|
1238
|
+
this._join();
|
|
1239
|
+
}
|
|
1240
|
+
if (callback) {
|
|
1241
|
+
this.on('status', callback);
|
|
1242
|
+
}
|
|
1243
|
+
return this;
|
|
1244
|
+
}
|
|
1245
|
+
onPostgresChanges(filter, callback) {
|
|
1246
|
+
const eventKey = `postgres_changes:${JSON.stringify(filter)}`;
|
|
1247
|
+
this.on(eventKey, callback);
|
|
1248
|
+
const subscription = {
|
|
1249
|
+
unsubscribe: () => {
|
|
1250
|
+
this.off(eventKey, callback);
|
|
1251
|
+
this.subscriptions.delete(eventKey);
|
|
1252
|
+
}
|
|
1253
|
+
};
|
|
1254
|
+
this.subscriptions.set(eventKey, subscription);
|
|
1255
|
+
if (this.socket?.connected && this.state === 'joined') {
|
|
1256
|
+
this.socket.emit('subscribe_postgres_changes', {
|
|
1257
|
+
topic: this.topic,
|
|
1258
|
+
filter,
|
|
1259
|
+
ref: this.makeRef()
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
return subscription;
|
|
1263
|
+
}
|
|
1264
|
+
onBroadcast(filter, callback) {
|
|
1265
|
+
const eventKey = `broadcast:${JSON.stringify(filter)}`;
|
|
1266
|
+
this.on(eventKey, callback);
|
|
1267
|
+
const subscription = {
|
|
1268
|
+
unsubscribe: () => {
|
|
1269
|
+
this.off(eventKey, callback);
|
|
1270
|
+
this.subscriptions.delete(eventKey);
|
|
1271
|
+
}
|
|
1272
|
+
};
|
|
1273
|
+
this.subscriptions.set(eventKey, subscription);
|
|
1274
|
+
return subscription;
|
|
1275
|
+
}
|
|
1276
|
+
onPresence(filter, callback) {
|
|
1277
|
+
const eventKey = `presence:${JSON.stringify(filter)}`;
|
|
1278
|
+
this.on(eventKey, callback);
|
|
1279
|
+
const subscription = {
|
|
1280
|
+
unsubscribe: () => {
|
|
1281
|
+
this.off(eventKey, callback);
|
|
1282
|
+
this.subscriptions.delete(eventKey);
|
|
1283
|
+
}
|
|
1284
|
+
};
|
|
1285
|
+
this.subscriptions.set(eventKey, subscription);
|
|
1286
|
+
return subscription;
|
|
1287
|
+
}
|
|
1288
|
+
send(payload) {
|
|
1289
|
+
return new Promise((resolve) => {
|
|
1290
|
+
if (this.socket?.connected && this.state === 'joined') {
|
|
1291
|
+
this.socket.emit('broadcast', {
|
|
1292
|
+
topic: this.topic,
|
|
1293
|
+
event: payload.event,
|
|
1294
|
+
payload: payload,
|
|
1295
|
+
ref: this.makeRef()
|
|
1296
|
+
});
|
|
1297
|
+
resolve('ok');
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1300
|
+
resolve('error');
|
|
1301
|
+
}
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
track(payload) {
|
|
1305
|
+
return new Promise((resolve) => {
|
|
1306
|
+
if (this.socket?.connected && this.state === 'joined') {
|
|
1307
|
+
this.socket.emit('presence', {
|
|
1308
|
+
topic: this.topic,
|
|
1309
|
+
event: 'track',
|
|
1310
|
+
payload: payload,
|
|
1311
|
+
ref: this.makeRef()
|
|
1312
|
+
});
|
|
1313
|
+
resolve('ok');
|
|
1314
|
+
}
|
|
1315
|
+
else {
|
|
1316
|
+
resolve('error');
|
|
1317
|
+
}
|
|
1318
|
+
});
|
|
1319
|
+
}
|
|
1320
|
+
untrack() {
|
|
1321
|
+
return new Promise((resolve) => {
|
|
1322
|
+
if (this.socket?.connected && this.state === 'joined') {
|
|
1323
|
+
this.socket.emit('presence', {
|
|
1324
|
+
topic: this.topic,
|
|
1325
|
+
event: 'untrack',
|
|
1326
|
+
ref: this.makeRef()
|
|
1327
|
+
});
|
|
1328
|
+
resolve('ok');
|
|
1329
|
+
}
|
|
1330
|
+
else {
|
|
1331
|
+
resolve('error');
|
|
1332
|
+
}
|
|
1333
|
+
});
|
|
1334
|
+
}
|
|
1335
|
+
unsubscribe() {
|
|
1336
|
+
return new Promise((resolve) => {
|
|
1337
|
+
this.state = 'leaving';
|
|
1338
|
+
this.subscriptions.forEach(subscription => {
|
|
1339
|
+
subscription.unsubscribe();
|
|
1340
|
+
});
|
|
1341
|
+
this.subscriptions.clear();
|
|
1342
|
+
if (this.socket?.connected) {
|
|
1343
|
+
this.socket.emit('leave', {
|
|
1344
|
+
topic: this.topic,
|
|
1345
|
+
ref: this.makeRef()
|
|
1346
|
+
});
|
|
1347
|
+
}
|
|
1348
|
+
this.state = 'closed';
|
|
1349
|
+
this.removeAllListeners();
|
|
1350
|
+
resolve('ok');
|
|
1351
|
+
});
|
|
1352
|
+
}
|
|
1353
|
+
_join() {
|
|
1354
|
+
if (this.state === 'leaving')
|
|
1355
|
+
return;
|
|
1356
|
+
this.state = 'joining';
|
|
1357
|
+
if (this.socket?.connected) {
|
|
1358
|
+
this.socket.emit('join', {
|
|
1359
|
+
topic: this.topic,
|
|
1360
|
+
ref: this.makeRef()
|
|
1361
|
+
});
|
|
1362
|
+
setTimeout(() => {
|
|
1363
|
+
if (this.state === 'joining') {
|
|
1364
|
+
this.state = 'joined';
|
|
1365
|
+
this.emit('status', 'SUBSCRIBED');
|
|
1366
|
+
}
|
|
1367
|
+
}, 100);
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
_rejoin() {
|
|
1371
|
+
if (this.joinedOnce) {
|
|
1372
|
+
this._join();
|
|
1373
|
+
this.subscriptions.forEach((_subscription, eventKey) => {
|
|
1374
|
+
if (eventKey.startsWith('postgres_changes:')) {
|
|
1375
|
+
const filter = JSON.parse(eventKey.replace('postgres_changes:', ''));
|
|
1376
|
+
this.socket?.emit('subscribe_postgres_changes', {
|
|
1377
|
+
topic: this.topic,
|
|
1378
|
+
filter,
|
|
1379
|
+
ref: this.makeRef()
|
|
1380
|
+
});
|
|
1381
|
+
}
|
|
1382
|
+
});
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
_trigger(event, payload) {
|
|
1386
|
+
if (event === 'postgres_changes') {
|
|
1387
|
+
const eventKey = `postgres_changes:${JSON.stringify(payload.filter || {})}`;
|
|
1388
|
+
this.emit(eventKey, payload);
|
|
1389
|
+
}
|
|
1390
|
+
else if (event === 'broadcast') {
|
|
1391
|
+
const eventKey = `broadcast:${JSON.stringify({ event: payload.event })}`;
|
|
1392
|
+
this.emit(eventKey, payload);
|
|
1393
|
+
}
|
|
1394
|
+
else if (event === 'presence') {
|
|
1395
|
+
const eventKey = `presence:${JSON.stringify({ event: payload.event })}`;
|
|
1396
|
+
this.emit(eventKey, payload);
|
|
1397
|
+
}
|
|
1398
|
+
this.emit(event, payload);
|
|
1399
|
+
}
|
|
1400
|
+
_setState(state) {
|
|
1401
|
+
this.state = state;
|
|
1402
|
+
let status;
|
|
1403
|
+
switch (state) {
|
|
1404
|
+
case 'joined':
|
|
1405
|
+
status = 'SUBSCRIBED';
|
|
1406
|
+
break;
|
|
1407
|
+
case 'errored':
|
|
1408
|
+
status = 'CHANNEL_ERROR';
|
|
1409
|
+
break;
|
|
1410
|
+
case 'closed':
|
|
1411
|
+
status = 'CLOSED';
|
|
1412
|
+
break;
|
|
1413
|
+
default:
|
|
1414
|
+
return;
|
|
1415
|
+
}
|
|
1416
|
+
this.emit('status', status);
|
|
1417
|
+
}
|
|
1418
|
+
makeRef() {
|
|
1419
|
+
return Math.random().toString(36).substring(2, 15);
|
|
1420
|
+
}
|
|
1421
|
+
getState() {
|
|
1422
|
+
return this.state;
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
function getEnvironment() {
|
|
1427
|
+
if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
|
|
1428
|
+
return 'react-native';
|
|
1429
|
+
}
|
|
1430
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
1431
|
+
return 'browser';
|
|
1432
|
+
}
|
|
1433
|
+
if (typeof global !== 'undefined' && typeof process !== 'undefined' && process.versions?.node) {
|
|
1434
|
+
return 'node';
|
|
1435
|
+
}
|
|
1436
|
+
return 'browser';
|
|
1437
|
+
}
|
|
1438
|
+
function isSocketIOAvailable() {
|
|
1439
|
+
try {
|
|
1440
|
+
const env = getEnvironment();
|
|
1441
|
+
switch (env) {
|
|
1442
|
+
case 'node':
|
|
1443
|
+
return typeof require !== 'undefined' && require.resolve && !!require.resolve('socket.io-client');
|
|
1444
|
+
case 'browser':
|
|
1445
|
+
if (typeof globalThis !== 'undefined' && 'io' in globalThis) {
|
|
1446
|
+
return true;
|
|
1447
|
+
}
|
|
1448
|
+
return typeof require !== 'undefined' && require.resolve && !!require.resolve('socket.io-client');
|
|
1449
|
+
case 'react-native':
|
|
1450
|
+
try {
|
|
1451
|
+
return typeof require !== 'undefined' && !!require('socket.io-client');
|
|
1452
|
+
}
|
|
1453
|
+
catch {
|
|
1454
|
+
return false;
|
|
1455
|
+
}
|
|
1456
|
+
default:
|
|
1457
|
+
return false;
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
catch {
|
|
1461
|
+
return false;
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
function getSocketIO() {
|
|
1465
|
+
try {
|
|
1466
|
+
if (typeof require !== 'undefined') {
|
|
1467
|
+
return require('socket.io-client');
|
|
1468
|
+
}
|
|
1469
|
+
if (typeof globalThis !== 'undefined' && 'io' in globalThis) {
|
|
1470
|
+
return { io: globalThis.io };
|
|
1471
|
+
}
|
|
1472
|
+
throw new Error('socket.io-client not available');
|
|
1473
|
+
}
|
|
1474
|
+
catch (error) {
|
|
1475
|
+
throw new Error(`Socket.io-client não está disponível neste ambiente. Para usar funcionalidades de realtime, instale: npm install socket.io-client`);
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
class WebSocketAdapter {
|
|
1479
|
+
constructor() {
|
|
1480
|
+
this.socket = null;
|
|
1481
|
+
}
|
|
1482
|
+
async connect(url, options) {
|
|
1483
|
+
if (!isSocketIOAvailable()) {
|
|
1484
|
+
throw new Error('Socket.io-client não está disponível. Para usar funcionalidades de realtime, instale: npm install socket.io-client');
|
|
1485
|
+
}
|
|
1486
|
+
const { io } = getSocketIO();
|
|
1487
|
+
return new Promise((resolve, reject) => {
|
|
1488
|
+
this.socket = io(url, options);
|
|
1489
|
+
this.socket.on('connect', () => resolve());
|
|
1490
|
+
this.socket.on('connect_error', (error) => reject(error));
|
|
1491
|
+
});
|
|
1492
|
+
}
|
|
1493
|
+
disconnect() {
|
|
1494
|
+
if (this.socket) {
|
|
1495
|
+
this.socket.disconnect();
|
|
1496
|
+
this.socket = null;
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
emit(event, data) {
|
|
1500
|
+
this.socket?.emit(event, data);
|
|
1501
|
+
}
|
|
1502
|
+
on(event, callback) {
|
|
1503
|
+
this.socket?.on(event, callback);
|
|
1504
|
+
}
|
|
1505
|
+
off(event, callback) {
|
|
1506
|
+
if (callback) {
|
|
1507
|
+
this.socket?.off(event, callback);
|
|
1508
|
+
}
|
|
1509
|
+
else {
|
|
1510
|
+
this.socket?.off(event);
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
get connected() {
|
|
1514
|
+
return this.socket?.connected ?? false;
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
class ReactNativeSocketAdapter {
|
|
1518
|
+
constructor() {
|
|
1519
|
+
this.socket = null;
|
|
1520
|
+
}
|
|
1521
|
+
async connect(url, options) {
|
|
1522
|
+
if (!isSocketIOAvailable()) {
|
|
1523
|
+
throw new Error('Socket.io-client não está disponível. Para React Native, instale: npm install socket.io-client');
|
|
1524
|
+
}
|
|
1525
|
+
const { io } = getSocketIO();
|
|
1526
|
+
return new Promise((resolve, reject) => {
|
|
1527
|
+
this.socket = io(url, {
|
|
1528
|
+
...options,
|
|
1529
|
+
transports: ['websocket'],
|
|
1530
|
+
upgrade: false,
|
|
1531
|
+
autoConnect: true,
|
|
1532
|
+
});
|
|
1533
|
+
this.socket.on('connect', () => resolve());
|
|
1534
|
+
this.socket.on('connect_error', (error) => reject(error));
|
|
1535
|
+
});
|
|
1536
|
+
}
|
|
1537
|
+
disconnect() {
|
|
1538
|
+
if (this.socket) {
|
|
1539
|
+
this.socket.disconnect();
|
|
1540
|
+
this.socket = null;
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
emit(event, data) {
|
|
1544
|
+
this.socket?.emit(event, data);
|
|
1545
|
+
}
|
|
1546
|
+
on(event, callback) {
|
|
1547
|
+
this.socket?.on(event, callback);
|
|
1548
|
+
}
|
|
1549
|
+
off(event, callback) {
|
|
1550
|
+
if (callback) {
|
|
1551
|
+
this.socket?.off(event, callback);
|
|
1552
|
+
}
|
|
1553
|
+
else {
|
|
1554
|
+
this.socket?.off(event);
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
get connected() {
|
|
1558
|
+
return this.socket?.connected ?? false;
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
function createSocketAdapter() {
|
|
1562
|
+
const env = getEnvironment();
|
|
1563
|
+
switch (env) {
|
|
1564
|
+
case 'react-native':
|
|
1565
|
+
return new ReactNativeSocketAdapter();
|
|
1566
|
+
case 'browser':
|
|
1567
|
+
case 'node':
|
|
1568
|
+
default:
|
|
1569
|
+
return new WebSocketAdapter();
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
class RealtimeClient {
|
|
1574
|
+
constructor(url, apiKey, options = {}) {
|
|
1575
|
+
this.socket = null;
|
|
1576
|
+
this.channels = new Map();
|
|
1577
|
+
this.connectionState = 'disconnected';
|
|
1578
|
+
this.reconnectAttempts = 0;
|
|
1579
|
+
this.maxReconnectAttempts = 5;
|
|
1580
|
+
this.url = url;
|
|
1581
|
+
this.apiKey = apiKey;
|
|
1582
|
+
this.options = {
|
|
1583
|
+
heartbeatInterval: 30000,
|
|
1584
|
+
reconnectInterval: 5000,
|
|
1585
|
+
maxReconnectAttempts: 5,
|
|
1586
|
+
...options
|
|
1587
|
+
};
|
|
1588
|
+
this.socketAdapter = createSocketAdapter();
|
|
1589
|
+
}
|
|
1590
|
+
connect() {
|
|
1591
|
+
return new Promise(async (resolve, reject) => {
|
|
1592
|
+
if (this.socketAdapter.connected) {
|
|
1593
|
+
resolve();
|
|
1594
|
+
return;
|
|
1595
|
+
}
|
|
1596
|
+
this.connectionState = 'connecting';
|
|
1597
|
+
try {
|
|
1598
|
+
await this.socketAdapter.connect(this.url, {
|
|
1599
|
+
auth: {
|
|
1600
|
+
apikey: this.apiKey
|
|
1601
|
+
},
|
|
1602
|
+
transports: ['websocket'],
|
|
1603
|
+
reconnection: true,
|
|
1604
|
+
reconnectionDelay: this.options.reconnectInterval,
|
|
1605
|
+
reconnectionAttempts: this.options.maxReconnectAttempts,
|
|
1606
|
+
...this.options.socketOptions
|
|
1607
|
+
});
|
|
1608
|
+
this.socket = this.socketAdapter.socket;
|
|
1609
|
+
this.socketAdapter.on('connect', () => {
|
|
1610
|
+
this.connectionState = 'connected';
|
|
1611
|
+
this.reconnectAttempts = 0;
|
|
1612
|
+
this.setupHeartbeat();
|
|
1613
|
+
resolve();
|
|
1614
|
+
});
|
|
1615
|
+
this.socketAdapter.on('disconnect', () => {
|
|
1616
|
+
this.connectionState = 'disconnected';
|
|
1617
|
+
this.channels.forEach(channel => {
|
|
1618
|
+
channel._setState('closed');
|
|
1619
|
+
});
|
|
1620
|
+
});
|
|
1621
|
+
this.socketAdapter.on('connect_error', (error) => {
|
|
1622
|
+
this.connectionState = 'error';
|
|
1623
|
+
this.reconnectAttempts++;
|
|
1624
|
+
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
1625
|
+
reject(new Error(`Failed to connect after ${this.maxReconnectAttempts} attempts: ${error.message}`));
|
|
1626
|
+
}
|
|
1627
|
+
});
|
|
1628
|
+
this.socketAdapter.on('reconnect', () => {
|
|
1629
|
+
this.connectionState = 'connected';
|
|
1630
|
+
this.reconnectAttempts = 0;
|
|
1631
|
+
this.channels.forEach(channel => {
|
|
1632
|
+
channel._rejoin();
|
|
1633
|
+
});
|
|
1634
|
+
});
|
|
1635
|
+
this.socketAdapter.on('postgres_changes', (payload) => {
|
|
1636
|
+
const channel = this.channels.get(payload.topic);
|
|
1637
|
+
if (channel) {
|
|
1638
|
+
channel._trigger('postgres_changes', payload);
|
|
1639
|
+
}
|
|
1640
|
+
});
|
|
1641
|
+
this.socketAdapter.on('broadcast', (payload) => {
|
|
1642
|
+
const channel = this.channels.get(payload.topic);
|
|
1643
|
+
if (channel) {
|
|
1644
|
+
channel._trigger('broadcast', payload);
|
|
1645
|
+
}
|
|
1646
|
+
});
|
|
1647
|
+
this.socketAdapter.on('presence', (payload) => {
|
|
1648
|
+
const channel = this.channels.get(payload.topic);
|
|
1649
|
+
if (channel) {
|
|
1650
|
+
channel._trigger('presence', payload);
|
|
1651
|
+
}
|
|
1652
|
+
});
|
|
1653
|
+
}
|
|
1654
|
+
catch (error) {
|
|
1655
|
+
this.connectionState = 'error';
|
|
1656
|
+
reject(error);
|
|
1657
|
+
}
|
|
1658
|
+
});
|
|
1659
|
+
}
|
|
1660
|
+
disconnect() {
|
|
1661
|
+
if (this.socketAdapter) {
|
|
1662
|
+
this.socketAdapter.disconnect();
|
|
1663
|
+
this.socket = null;
|
|
1664
|
+
}
|
|
1665
|
+
this.connectionState = 'disconnected';
|
|
1666
|
+
this.channels.clear();
|
|
1667
|
+
}
|
|
1668
|
+
channel(topic) {
|
|
1669
|
+
if (this.channels.has(topic)) {
|
|
1670
|
+
return this.channels.get(topic);
|
|
1671
|
+
}
|
|
1672
|
+
const channel = new RealtimeChannel(topic, this.socket);
|
|
1673
|
+
this.channels.set(topic, channel);
|
|
1674
|
+
if (this.connectionState === 'connected') {
|
|
1675
|
+
channel._join();
|
|
1676
|
+
}
|
|
1677
|
+
return channel;
|
|
1678
|
+
}
|
|
1679
|
+
removeChannel(channel) {
|
|
1680
|
+
const topic = channel.topic;
|
|
1681
|
+
if (this.channels.has(topic)) {
|
|
1682
|
+
this.channels.delete(topic);
|
|
1683
|
+
channel.unsubscribe();
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
removeAllChannels() {
|
|
1687
|
+
this.channels.forEach(channel => {
|
|
1688
|
+
channel.unsubscribe();
|
|
1689
|
+
});
|
|
1690
|
+
this.channels.clear();
|
|
1691
|
+
}
|
|
1692
|
+
getChannels() {
|
|
1693
|
+
return Array.from(this.channels.values());
|
|
1694
|
+
}
|
|
1695
|
+
isConnected() {
|
|
1696
|
+
return this.connectionState === 'connected' && this.socketAdapter.connected;
|
|
1697
|
+
}
|
|
1698
|
+
getConnectionState() {
|
|
1699
|
+
return this.connectionState;
|
|
1700
|
+
}
|
|
1701
|
+
onConnectionStateChange(callback) {
|
|
1702
|
+
const handler = () => callback(this.connectionState);
|
|
1703
|
+
if (this.socketAdapter) {
|
|
1704
|
+
this.socketAdapter.on('connect', () => {
|
|
1705
|
+
this.connectionState = 'connected';
|
|
1706
|
+
handler();
|
|
1707
|
+
});
|
|
1708
|
+
this.socketAdapter.on('disconnect', () => {
|
|
1709
|
+
this.connectionState = 'disconnected';
|
|
1710
|
+
handler();
|
|
1711
|
+
});
|
|
1712
|
+
this.socketAdapter.on('connect_error', () => {
|
|
1713
|
+
this.connectionState = 'error';
|
|
1714
|
+
handler();
|
|
1715
|
+
});
|
|
1716
|
+
}
|
|
1717
|
+
return () => {
|
|
1718
|
+
if (this.socketAdapter) {
|
|
1719
|
+
this.socketAdapter.off('connect', handler);
|
|
1720
|
+
this.socketAdapter.off('disconnect', handler);
|
|
1721
|
+
this.socketAdapter.off('connect_error', handler);
|
|
1722
|
+
}
|
|
1723
|
+
};
|
|
1724
|
+
}
|
|
1725
|
+
setupHeartbeat() {
|
|
1726
|
+
if (!this.options.heartbeatInterval || !this.socketAdapter)
|
|
1727
|
+
return;
|
|
1728
|
+
const interval = setInterval(() => {
|
|
1729
|
+
if (this.socketAdapter?.connected) {
|
|
1730
|
+
this.socketAdapter.emit('heartbeat', { timestamp: Date.now() });
|
|
1731
|
+
}
|
|
1732
|
+
else {
|
|
1733
|
+
clearInterval(interval);
|
|
1734
|
+
}
|
|
1735
|
+
}, this.options.heartbeatInterval);
|
|
1736
|
+
}
|
|
1737
|
+
_getSocket() {
|
|
1738
|
+
return this.socket;
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
class FunctionsClient {
|
|
1743
|
+
constructor(httpClient) {
|
|
1744
|
+
this.httpClient = httpClient;
|
|
1745
|
+
}
|
|
1746
|
+
async invoke(functionName, options) {
|
|
1747
|
+
try {
|
|
1748
|
+
const method = options?.method || 'POST';
|
|
1749
|
+
const headers = {
|
|
1750
|
+
'Content-Type': 'application/json',
|
|
1751
|
+
...options?.headers
|
|
1752
|
+
};
|
|
1753
|
+
let response;
|
|
1754
|
+
const url = `/functions/v1/${functionName}`;
|
|
1755
|
+
switch (method.toUpperCase()) {
|
|
1756
|
+
case 'GET':
|
|
1757
|
+
response = await this.httpClient.get(url, {
|
|
1758
|
+
headers,
|
|
1759
|
+
params: options?.body
|
|
1760
|
+
});
|
|
1761
|
+
break;
|
|
1762
|
+
case 'POST':
|
|
1763
|
+
response = await this.httpClient.post(url, options?.body, { headers });
|
|
1764
|
+
break;
|
|
1765
|
+
case 'PUT':
|
|
1766
|
+
response = await this.httpClient.put(url, options?.body, { headers });
|
|
1767
|
+
break;
|
|
1768
|
+
case 'PATCH':
|
|
1769
|
+
response = await this.httpClient.patch(url, options?.body, { headers });
|
|
1770
|
+
break;
|
|
1771
|
+
case 'DELETE':
|
|
1772
|
+
response = await this.httpClient.delete(url, {
|
|
1773
|
+
headers,
|
|
1774
|
+
data: options?.body
|
|
1775
|
+
});
|
|
1776
|
+
break;
|
|
1777
|
+
default:
|
|
1778
|
+
throw new EBaaSError(`Unsupported HTTP method: ${method}`, 400);
|
|
1779
|
+
}
|
|
1780
|
+
return {
|
|
1781
|
+
data: response.data,
|
|
1782
|
+
error: null
|
|
1783
|
+
};
|
|
1784
|
+
}
|
|
1785
|
+
catch (error) {
|
|
1786
|
+
return {
|
|
1787
|
+
data: null,
|
|
1788
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Function invocation failed', 0, error)
|
|
1789
|
+
};
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
async list() {
|
|
1793
|
+
try {
|
|
1794
|
+
const response = await this.httpClient.get('/functions/v1');
|
|
1795
|
+
return {
|
|
1796
|
+
data: response.data,
|
|
1797
|
+
error: null
|
|
1798
|
+
};
|
|
1799
|
+
}
|
|
1800
|
+
catch (error) {
|
|
1801
|
+
return {
|
|
1802
|
+
data: null,
|
|
1803
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to list functions', 0, error)
|
|
1804
|
+
};
|
|
1805
|
+
}
|
|
1806
|
+
}
|
|
1807
|
+
async get(functionName) {
|
|
1808
|
+
try {
|
|
1809
|
+
const response = await this.httpClient.get(`/functions/v1/${functionName}/info`);
|
|
1810
|
+
return {
|
|
1811
|
+
data: response.data,
|
|
1812
|
+
error: null
|
|
1813
|
+
};
|
|
1814
|
+
}
|
|
1815
|
+
catch (error) {
|
|
1816
|
+
return {
|
|
1817
|
+
data: null,
|
|
1818
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to get function', 0, error)
|
|
1819
|
+
};
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
async deploy(functionName, options) {
|
|
1823
|
+
try {
|
|
1824
|
+
const formData = new FormData();
|
|
1825
|
+
if (options.code instanceof File) {
|
|
1826
|
+
formData.append('code', options.code);
|
|
1827
|
+
}
|
|
1828
|
+
else if (typeof options.code === 'string') {
|
|
1829
|
+
formData.append('code', new Blob([options.code], { type: 'text/plain' }), 'index.ts');
|
|
1830
|
+
}
|
|
1831
|
+
if (options.entrypoint) {
|
|
1832
|
+
formData.append('entrypoint', options.entrypoint);
|
|
1833
|
+
}
|
|
1834
|
+
if (options.env) {
|
|
1835
|
+
formData.append('env', JSON.stringify(options.env));
|
|
1836
|
+
}
|
|
1837
|
+
if (options.importMap) {
|
|
1838
|
+
formData.append('importMap', JSON.stringify(options.importMap));
|
|
1839
|
+
}
|
|
1840
|
+
if (options.verify !== undefined) {
|
|
1841
|
+
formData.append('verify', String(options.verify));
|
|
1842
|
+
}
|
|
1843
|
+
const response = await this.httpClient.post(`/functions/v1/${functionName}/deploy`, formData, {
|
|
1844
|
+
headers: {
|
|
1845
|
+
'Content-Type': 'multipart/form-data'
|
|
1846
|
+
}
|
|
1847
|
+
});
|
|
1848
|
+
return {
|
|
1849
|
+
data: response.data,
|
|
1850
|
+
error: null
|
|
1851
|
+
};
|
|
1852
|
+
}
|
|
1853
|
+
catch (error) {
|
|
1854
|
+
return {
|
|
1855
|
+
data: null,
|
|
1856
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to deploy function', 0, error)
|
|
1857
|
+
};
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
async delete(functionName) {
|
|
1861
|
+
try {
|
|
1862
|
+
const response = await this.httpClient.delete(`/functions/v1/${functionName}`);
|
|
1863
|
+
return {
|
|
1864
|
+
data: response.data,
|
|
1865
|
+
error: null
|
|
1866
|
+
};
|
|
1867
|
+
}
|
|
1868
|
+
catch (error) {
|
|
1869
|
+
return {
|
|
1870
|
+
data: null,
|
|
1871
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to delete function', 0, error)
|
|
1872
|
+
};
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
async updateEnv(functionName, env) {
|
|
1876
|
+
try {
|
|
1877
|
+
const response = await this.httpClient.put(`/functions/v1/${functionName}/env`, { env });
|
|
1878
|
+
return {
|
|
1879
|
+
data: response.data,
|
|
1880
|
+
error: null
|
|
1881
|
+
};
|
|
1882
|
+
}
|
|
1883
|
+
catch (error) {
|
|
1884
|
+
return {
|
|
1885
|
+
data: null,
|
|
1886
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to update function environment', 0, error)
|
|
1887
|
+
};
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
async getLogs(functionName, options) {
|
|
1891
|
+
try {
|
|
1892
|
+
const params = new URLSearchParams();
|
|
1893
|
+
if (options?.limit) {
|
|
1894
|
+
params.append('limit', String(options.limit));
|
|
1895
|
+
}
|
|
1896
|
+
if (options?.offset) {
|
|
1897
|
+
params.append('offset', String(options.offset));
|
|
1898
|
+
}
|
|
1899
|
+
if (options?.level) {
|
|
1900
|
+
params.append('level', options.level);
|
|
1901
|
+
}
|
|
1902
|
+
const url = `/functions/v1/${functionName}/logs${params.toString() ? `?${params.toString()}` : ''}`;
|
|
1903
|
+
const response = await this.httpClient.get(url);
|
|
1904
|
+
return {
|
|
1905
|
+
data: response.data,
|
|
1906
|
+
error: null
|
|
1907
|
+
};
|
|
1908
|
+
}
|
|
1909
|
+
catch (error) {
|
|
1910
|
+
return {
|
|
1911
|
+
data: null,
|
|
1912
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to get function logs', 0, error)
|
|
1913
|
+
};
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
async getMetrics(functionName, options) {
|
|
1917
|
+
try {
|
|
1918
|
+
const params = new URLSearchParams();
|
|
1919
|
+
if (options?.period) {
|
|
1920
|
+
params.append('period', options.period);
|
|
1921
|
+
}
|
|
1922
|
+
const url = `/functions/v1/${functionName}/metrics${params.toString() ? `?${params.toString()}` : ''}`;
|
|
1923
|
+
const response = await this.httpClient.get(url);
|
|
1924
|
+
return {
|
|
1925
|
+
data: response.data,
|
|
1926
|
+
error: null
|
|
1927
|
+
};
|
|
1928
|
+
}
|
|
1929
|
+
catch (error) {
|
|
1930
|
+
return {
|
|
1931
|
+
data: null,
|
|
1932
|
+
error: error instanceof EBaaSError ? error : new EBaaSError(error instanceof Error ? error.message : 'Failed to get function metrics', 0, error)
|
|
1933
|
+
};
|
|
1934
|
+
}
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
class EBaaSClient {
|
|
1939
|
+
constructor(supabaseUrl, supabaseKey, options) {
|
|
1940
|
+
this.options = options;
|
|
1941
|
+
// Initialize HTTP client
|
|
1942
|
+
this.httpClient = new HttpClient({
|
|
1943
|
+
url: supabaseUrl,
|
|
1944
|
+
apiKey: supabaseKey,
|
|
1945
|
+
timeout: 30000,
|
|
1946
|
+
headers: options?.global?.headers
|
|
1947
|
+
});
|
|
1948
|
+
// Initialize all modules
|
|
1949
|
+
this.auth = new AuthClient(this.httpClient, options?.database?.workspaceId);
|
|
1950
|
+
this.database = new DatabaseClient(this.httpClient, options?.database?.workspaceId, options?.rest?.url);
|
|
1951
|
+
this.storage = new StorageClient(this.httpClient);
|
|
1952
|
+
this.realtime = new RealtimeClient(supabaseUrl, supabaseKey, options?.realtime);
|
|
1953
|
+
this.functions = new FunctionsClient(this.httpClient);
|
|
1954
|
+
// Initialize custom database detection if enabled
|
|
1955
|
+
this.initializeCustomDatabase();
|
|
1956
|
+
}
|
|
1957
|
+
// Convenience method for database access
|
|
1958
|
+
from(table) {
|
|
1959
|
+
return this.database.from(table);
|
|
1960
|
+
}
|
|
1961
|
+
// Convenience method for RPC calls
|
|
1962
|
+
rpc(fn, args) {
|
|
1963
|
+
return this.database.rpc(fn, args);
|
|
1964
|
+
}
|
|
1965
|
+
// Convenience method for storage bucket access
|
|
1966
|
+
bucket(id) {
|
|
1967
|
+
return this.storage.from(id);
|
|
1968
|
+
}
|
|
1969
|
+
// Convenience method for realtime channel access
|
|
1970
|
+
channel(name) {
|
|
1971
|
+
return this.realtime.channel(name);
|
|
1972
|
+
}
|
|
1973
|
+
// Convenience method for edge functions
|
|
1974
|
+
invoke(functionName, options) {
|
|
1975
|
+
return this.functions.invoke(functionName, options);
|
|
1976
|
+
}
|
|
1977
|
+
/**
|
|
1978
|
+
* Inicializa a detecção automática de banco customizado
|
|
1979
|
+
*/
|
|
1980
|
+
async initializeCustomDatabase() {
|
|
1981
|
+
if (this.options?.database?.autoDetectCustomDatabase) {
|
|
1982
|
+
try {
|
|
1983
|
+
await this.database.initialize();
|
|
1984
|
+
}
|
|
1985
|
+
catch (error) {
|
|
1986
|
+
console.warn('Failed to initialize custom database detection:', error);
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
/**
|
|
1991
|
+
* Atualiza o workspace ID para todos os módulos que precisam
|
|
1992
|
+
*/
|
|
1993
|
+
async setWorkspaceId(workspaceId) {
|
|
1994
|
+
this.auth.setWorkspaceId(workspaceId);
|
|
1995
|
+
this.database.setWorkspaceId(workspaceId);
|
|
1996
|
+
// Se auto-detecção estiver habilitada, re-detecta configuração para o novo workspace
|
|
1997
|
+
if (this.options?.database?.autoDetectCustomDatabase) {
|
|
1998
|
+
await this.database.initialize();
|
|
1999
|
+
}
|
|
2000
|
+
}
|
|
2001
|
+
/**
|
|
2002
|
+
* Configura credenciais customizadas diretamente
|
|
2003
|
+
*/
|
|
2004
|
+
async configureCustomDatabase(credentials) {
|
|
2005
|
+
await this.database.configureCustomDatabase(credentials);
|
|
2006
|
+
}
|
|
2007
|
+
/**
|
|
2008
|
+
* Retorna informações sobre o banco customizado
|
|
2009
|
+
*/
|
|
2010
|
+
getCustomDatabaseStatus() {
|
|
2011
|
+
return this.database.getCustomDatabaseStatus();
|
|
2012
|
+
}
|
|
2013
|
+
}
|
|
2014
|
+
// Factory function similar to Supabase's createClient
|
|
2015
|
+
function createClient(supabaseUrl, supabaseKey, options) {
|
|
2016
|
+
return new EBaaSClient(supabaseUrl, supabaseKey, options);
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
// Main client export
|
|
2020
|
+
// Version
|
|
2021
|
+
const version = "1.1.8";
|
|
2022
|
+
|
|
2023
|
+
exports.AuthClient = AuthClient;
|
|
2024
|
+
exports.CustomDatabaseManager = CustomDatabaseManager;
|
|
2025
|
+
exports.DatabaseClient = DatabaseClient;
|
|
2026
|
+
exports.EBaaSClient = EBaaSClient;
|
|
2027
|
+
exports.EBaaSError = EBaaSError;
|
|
2028
|
+
exports.FunctionsClient = FunctionsClient;
|
|
2029
|
+
exports.HttpClient = HttpClient;
|
|
2030
|
+
exports.QueryBuilder = QueryBuilder;
|
|
2031
|
+
exports.RealtimeChannel = RealtimeChannel;
|
|
2032
|
+
exports.RealtimeClient = RealtimeClient;
|
|
2033
|
+
exports.StorageBucket = StorageBucket;
|
|
2034
|
+
exports.StorageClient = StorageClient;
|
|
2035
|
+
exports.createClient = createClient;
|
|
2036
|
+
exports.version = version;
|
|
2037
|
+
//# sourceMappingURL=index.cjs.map
|