@northflank/cli
Version:
Provides a command-line interface to the Northflank platform.
1 lines • 10.3 kB
JavaScript
const a15g=a15j;(function(X,j){const M=a15j,V=X();while(!![]){try{const H=parseInt(M(0x207))/0x1+parseInt(M(0x20c))/0x2*(-parseInt(M(0x21a))/0x3)+parseInt(M(0x204))/0x4*(-parseInt(M(0x1f8))/0x5)+-parseInt(M(0x1b3))/0x6+parseInt(M(0x1fb))/0x7*(-parseInt(M(0x1b5))/0x8)+parseInt(M(0x1b4))/0x9+parseInt(M(0x211))/0xa;if(H===j)break;else V['push'](V['shift']());}catch(O){V['push'](V['shift']());}}}(a15X,0x8d78c));import{ApiClient}from'@northflank/js-client';import a15V from'chalk';import{assertContextExisting,customUserAgent,error,getCommand,success,warning}from'../utils.js';function a15j(X,j){const V=a15X();return a15j=function(H,O){H=H-0x1b2;let F=V[H];return F;},a15j(X,j);}import{InquirerHelper}from'../inquirer-helper.js';import*as a15H from'os';import{uniqBy,uniq,repeat,groupBy,capitalize}from'lodash-es';function a15X(){const D=['\x20to\x20','\x20service\x20ports','--noDefaults','flat','Port-forwarding\x20for\x20Northflank\x20services\x20and\x20addons.','addCommand','\x20\x20If\x20you\x20have\x20added\x20entries\x20to\x20your\x20hosts\x20file,\x20it\x20is\x20recommended\x20to\x20remove\x20them\x20again\x20now.','platform','Forwarding\x20','getCurrentProjectName','Stop\x20forwarding\x20traffic\x20from\x20','map','/etc/hosts','name','--project\x20--projectId\x20[NAME]','forwardAddon','Port-forwarding\x20for\x20all\x20services\x20and\x20addons\x20in\x20the\x20given\x20project','connection-error','\x27:\x20\x22','Instance\x20to\x20forward','join','\x20with\x20these\x20hostnames:','\x20is\x20exposed\x20with\x20multiple\x20','Don\x27t\x20use\x20context\x20default\x20values,\x20explicitly\x20use\x20options\x20or\x20ask.','skipHostnames','\x20is\x20running\x20and\x20reachable\x20and\x20that\x20a\x20port\x20is\x20defined\x20on\x20the\x20networking\x20section.','type','win32','portName','fwd','protocol','askForService','bold','Failed:\x20','reset','message','description','tunnel-close','\x20in\x20project\x20','filter','\x20\x20\x20\x20\x20\x20\x20\x20\x20','Addons:','alias','service','greenBright','hostnames','option','printForwardingInfo','data.id','\x20flag\x20or\x20manually\x20append\x20following\x20entry\x20to\x20your\x20hosts\x20file\x20(','--instance\x20--instanceId\x20[NAME]','Cleaning\x20up\x20open\x20connections\x20failed:\x20','green','http://','all','5hZpMXm','error','--addon\x20--addonId\x20[NAME]','6153rIbcAm','port','\x20\x20-\x20Address:\x20','\x20\x20-\x20port\x20','length','log','ports','getProxyForwarder','portFwdCmd','3345524bnMxvS','\x20\x20\x20No\x20running\x20container\x20found\x20for\x20','forwardProject','57322KuaEvJ','darwin','getCurrentServiceName','>\x20Instance\x20\x27','Project\x20for\x20forwarding','162170MRBEby','action','forwardService','Services:','project\x20for\x20forwarding','30243860pDqYsV','noDefaultsText','Running\x20on\x20macOS\x20in\x20','Error\x20occured\x20while\x20trying\x20to\x20forward\x20','askForAddon','--skipHostnames','HTTP','skipHostnamesText','\x20mode.\x20If\x20hostname\x20forwarding\x20is\x20required,\x20remove\x20','33MxQzRl','address','Only\x20expose\x20on\x20IP\x20address,\x20not\x20on\x20hostnames.\x20With\x20this\x20option,\x20no\x20root\x20permissions\x20are\x20required.','\x20and\x20','Addon\x20to\x20forward','data','canExecuteWithHostnames','3638202VaXgzQ','4290750oYnZRd','5864gDSxXZ','apiClient','Running\x20in\x20','askForProject','\x20is\x20exposed\x20on\x20','\x27\x20of\x20','printHostsFileHint','forEach',',\x20hostname:\x20','Port-forwarding\x20for\x20the\x20specified\x20addon','addon','flatMap'];a15X=function(){return D;};return a15X();}import{EOL}from'os';export class CliPortForward{[a15g(0x203)];[a15g(0x1b6)];[a15g(0x212)]=a15g(0x1d8);['skipHostnamesText']=a15g(0x21c);constructor(X,j){const J=a15g;this[J(0x1b6)]=new ApiClient(X,{'throwErrorOnHttpErrorCode':!![],'customUserAgent':customUserAgent,'agent':j});const V=new InquirerHelper(this['apiClient']);this[J(0x203)]=getCommand()[J(0x1ce)]('forward')[J(0x1eb)](J(0x1de))[J(0x1e5)](J(0x1c5));const H=getCommand(!![])[J(0x1ce)](J(0x1f7))[J(0x1e5)](J(0x1d1))[J(0x1ef)]('--project\x20--projectId\x20[NAME]',J(0x210))['option'](J(0x1c3),this[J(0x212)],![])[J(0x1ef)](J(0x216),this[J(0x218)],![])[J(0x20d)](async({noDefaults:h,projectId:P,skipHostnames:o})=>{const b=J;assertContextExisting(this[b(0x1b6)]);const C=this[b(0x202)](o),B=h?undefined:X['getCurrentProjectName'](),s=P||B||await V[b(0x1b8)]();try{const {services:S,addons:y}=await C[b(0x206)]({'projectId':s},o);if(S[b(0x1ff)]+y['length']<=0x0)warning('No\x20services\x20and\x20addons\x20to\x20forward\x20found\x20in\x20project\x20'+a15V[b(0x1e1)](s));else{const A=S[b(0x1e8)](W=>W[b(0x1ff)]>0x0)[b(0x1ff)],l=y[b(0x1e8)](W=>W['length']>0x0)[b(0x1ff)],T=b(0x1e7)+a15V[b(0x1e1)](s);console[b(0x200)](b(0x1c9)+a15V['green'][b(0x1e1)](A+b(0x1c2))+b(0x21d)+a15V[b(0x1f5)][b(0x1e1)](l+'\x20addon\x20ports')+T),console['log'](),console[b(0x200)](a15V['bold'](b(0x20f))),S[b(0x1bc)](W=>{const E=b;if(W[E(0x1ff)]>=0x1&&!W[0x0][E(0x1f9)])this['printForwardingInfo'](W,{'type':E(0x1ec),'name':W[0x0]['data']['id']},o);}),console[b(0x200)](a15V[b(0x1e1)](b(0x1ea))),y[b(0x1bc)](W=>{const t=b;if(W['length']>=0x1&&!W[0x0][t(0x1f9)])this['printForwardingInfo'](W,{'type':t(0x1bf),'name':W[0x0][t(0x21f)]['id']},o);}),this[b(0x1bb)]([...S[b(0x1c4)](),...y[b(0x1c4)]()],o);}}catch(W){error('Failed:\x20'+W[b(0x1e4)]);}}),O=getCommand(!![])[J(0x1ce)](J(0x1ec))['description']('Port-forwarding\x20for\x20the\x20specified\x20service')[J(0x1ef)](J(0x1cf),'Project\x20for\x20forwarding')[J(0x1ef)]('--service\x20--serviceId\x20[NAME]','Service\x20to\x20forward')[J(0x1ef)](J(0x1f3),J(0x1d4))['option'](J(0x1c3),this[J(0x212)],![])[J(0x1ef)](J(0x216),this['skipHostnamesText'],![])['action'](async({noDefaults:h,projectId:P,serviceId:o,instanceId:C,skipHostnames:B})=>{const Z=J;assertContextExisting(this[Z(0x1b6)]);const s=this[Z(0x202)](B),S=h?undefined:X[Z(0x1ca)](),y=P||S||await V[Z(0x1b8)](),A=h?undefined:X[Z(0x209)](),l=o||A||await V[Z(0x1e0)](y)();console[Z(0x200)]('Forwarding\x20service\x20'+a15V[Z(0x1e1)](l)+Z(0x1e7)+a15V[Z(0x1e1)](y));try{const T=await s[Z(0x20e)]({'projectId':y,'serviceId':l,'instanceId':C},B);this[Z(0x1f0)](T,{'name':l,'type':Z(0x1ec),'instanceId':C},B),this[Z(0x1bb)](T,B);}catch(W){error(Z(0x1e2)+W[Z(0x1e4)]);}}),F=getCommand(!![])[J(0x1ce)](J(0x1bf))[J(0x1e5)](J(0x1be))[J(0x1ef)](J(0x1cf),J(0x20b))[J(0x1ef)](J(0x1fa),J(0x21e))[J(0x1ef)](J(0x216),this['skipHostnamesText'],![])['action'](async({noDefaults:h,projectId:P,addonId:o,skipHostnames:C})=>{const w=J;assertContextExisting(this[w(0x1b6)]);const B=this['getProxyForwarder'](C),s=h?undefined:X[w(0x1ca)](),S=P||s||await V[w(0x1b8)](),y=o||await V[w(0x215)](S)();console[w(0x200)]('Forwarding\x20addon\x20'+a15V['bold'](y)+w(0x1e7)+a15V[w(0x1e1)](S));try{const A={'projectId':S,'addonId':y},l=await B[w(0x1d0)](A,C);this[w(0x1f0)](l,{'name':y,'type':w(0x1bf)},C),this[w(0x1bb)](l,C);}catch(T){error(w(0x1e2)+T[w(0x1e4)]);}});this[J(0x203)]['addCommand'](H),this[J(0x203)][J(0x1c6)](O),this['portFwdCmd'][J(0x1c6)](F);}['getProxyForwarder'](X=![]){const N=a15g,j=this[N(0x1b6)]['forwarding'];if(!X){const V=j[N(0x1b2)]();if(V[N(0x1f9)])throw new Error(V['message']);}return j['on'](N(0x1e6),(H,O)=>{const p=N,F=a15V[p(0x1e1)](O[p(0x1db)]+'\x20\x27'+O['id']+'\x27'),h=O['hostnames'][p(0x1ff)]>0x0;warning(p(0x1cb)+O[p(0x21b)]+':'+O[p(0x1fc)]+p(0x1c1)+F),X&&h&&warning(p(0x1c7));}),j['on'](N(0x1d2),(H,O,F)=>{const m=N;warning('Connection\x20error\x20occurred\x20when\x20forwarding\x20\x27'+O[m(0x21b)]+':'+O['port']+m(0x1d3)+F?.['message']+'\x22');}),process['on']('SIGINT',async()=>{const k=N;try{await j['stop']();}catch(H){error(k(0x1f4)+H[k(0x1e4)]);}finally{process['exit']();}}),j;}[a15g(0x1f0)](X,j,V=![]){const I=a15g,{type:H,name:O,instanceId:F}=j;if(X[I(0x1ff)]<=0x0){const C='Please\x20ensure\x20the\x20'+j['type']+I(0x1da);warning(I(0x205)+H+'\x20'+a15V[I(0x1e1)](O)+'.\x20'+C);return;}const h=groupBy(X,I(0x1f1)),P=B=>'\x20('+(B['portName']?B[I(0x1dd)]+'\x20-\x20':'')+B[I(0x1df)]+')';function o(B,s=0x2){const K=I;if(!V){const S=B['protocol']===K(0x217)?K(0x1f6):'';B[K(0x1ee)][K(0x1bc)](y=>{const L=K;console[L(0x200)](repeat('\x20',s)+'-\x20'+S+y+':'+B[L(0x1fc)]);});}}Object['entries'](h)[I(0x1bc)](([B,s])=>{const a=I,S=F?a(0x20a)+a15V['greenBright'][a(0x1e1)](F)+a(0x1ba)+H+'\x20\x27'+a15V[a(0x1ed)][a(0x1e1)](B)+'\x27':'>\x20'+capitalize(H)+'\x20\x27'+a15V[a(0x1ed)]['bold'](B)+'\x27';if(H===a(0x1bf)){if(s[a(0x1ff)]===0x1){const y=s[0x0];if(y['error']){error(a(0x214)+B+':\x20'+y[a(0x1f9)][a(0x1e4)]);return;}const e=y[a(0x21f)],A=!V?'\x20'+a15V[a(0x1e3)]('with\x20hostname:\x20'+e['hostnames'][a(0x1d5)](',')):'';success(S+a(0x1b9)+e['address']+':'+e[a(0x1fc)]+P(e)+A);}else{const l=uniqBy(s,T=>T?.[a(0x21f)]?.['hostnames']?.[a(0x1d5)](','))[a(0x1ff)]>0x1;success(S+a(0x1d7)+(l?'hosts':a(0x201))+':'),s[a(0x1bc)](T=>{const r=a;if(T[r(0x1f9)]){error(r(0x214)+B+':\x20'+T[r(0x1f9)][r(0x1e4)]);return;}const W=T[r(0x21f)],v=!V?r(0x1bd)+W[r(0x1ee)][r(0x1d5)](','):'';console['log'](r(0x1fd)+W['address']+':'+W[r(0x1fc)]+P(W)+v);});}}if(H===a(0x1ec)){if(s[a(0x1ff)]===0x1){const T=s[0x0];if(T[a(0x1f9)]){error('Error\x20occured\x20while\x20trying\x20to\x20forward\x20'+B+':\x20'+T[a(0x1f9)]['message']);return;}const W=T['data'],v=!V?a(0x1d6):':',G=W[a(0x21b)]+':'+W[a(0x1fc)]+P(W);success(S+a(0x1b9)+G+v),o(W);}else success(S+a(0x1b9)+s[0x0]?.[a(0x21f)]?.[a(0x21b)]+'\x20with\x20multiple\x20ports:'),s[a(0x1bc)](d=>{const R=a;if(d[R(0x1f9)]){error(R(0x214)+B+':\x20'+d[R(0x1f9)][R(0x1e4)]);return;}const x=d[R(0x21f)];success(R(0x1fe)+x[R(0x1fc)]+P(x)),o(x,0x4);});}});}['printHostsFileHint'](X,j=![]){const n=a15g;if(j){const V=X[n(0x1c0)](B=>B[n(0x21f)])['filter'](B=>B!==undefined),H=process?.[n(0x1c8)]===n(0x1dc),O=a15H[n(0x1c8)]()===n(0x208),F=H?'C:/Windows/System32/drivers/etc/hosts':n(0x1cd),h=a15V['bold'](n(0x1d9)),P=O?EOL+n(0x213)+h+'\x20mode:\x20the\x20locally\x20forwarded\x20port\x20differs\x20from\x20the\x20actual\x20port\x20on\x20the\x20forwarded\x20service/addon.':undefined;let o=n(0x1b7)+h+n(0x219)+n(0x216)+n(0x1f2)+F+'):';P!==undefined&&warning(P??'');warning(o);const C=V[n(0x1cc)](B=>B['address']+n(0x1e9)+B[n(0x1ee)][n(0x1d5)]('\x20'));console[n(0x200)](uniq(C)[n(0x1d5)](EOL)),console[n(0x200)]();}}}