Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Chat NodeJS em Produção

Chat NodeJS em Produção

Minha apresentação no RuPy BR 2013 sobre o case de entregar um chat com nodeJS em produção.
O chat é autenticado através do sistema legado, em um ambiente SSL

Willian Carvalho

November 29, 2013
Tweet

Other Decks in Programming

Transcript

  1. Qual é o objetivo da apresentação? Apresentar os requisitos do

    projeto Falar dos problemas enfrentados Falar das soluções escolhidas Experiência com o Node na vida real Compartilhar com outros devs
  2. Requisitos da aplicação Conexão segura SSL Múltiplas empresas Somente para

    usuários autenticados Possibilitar outro serviços plugáveis
  3. Ferramentas Socket.IO - Abstração de websocket e fallbacks Express -

    Web server de comunicação com sistema legado Módulo http - HTTP Client Módulo https - Oferecer https:// Módulo fs - Leitura de arquivos do certificado SSL
  4. Estrutura do projeto Websocket Server (ws_server.js) Namespace por empresa (tenant.js)

    Chat service (chatService.js) Configurações (package.json)
  5. package.json " a p p C o n f "

    : { " c h a t P o r t " : 9 0 9 0 , " k e y " : " / r o o t / s s l - f i l e s / q a b y y o u . k e y " , " c e r t " : " / r o o t / s s l - f i l e s / q a b y y o u . c r t " , " c a " : " / r o o t / s s l - f i l e s / g d _ i n t e r m e d i a t e . c r t " } v a r a p p C o n f = r e q u i r e ( ' . / p a c k a g e . j s o n ' ) . a p p C o n f ;
  6. ws_server.js s e r v e r = g e

    t H t t p s S e r v e r ( ) ; i o = r e q u i r e ( ' s o c k e t . i o ' ) . l i s t e n ( s e r v e r ) ; i o . s o c k e t s . o n ( ' c o n n e c t i o n ' , o n C o n n e c t i o n ) ; i o . c o n f i g u r e ( ' p r o d u c t i o n ' , f u n c t i o n ( ) { i o . s e t ( ' a u t h o r i z a t i o n ' , d o A u t h ) ; / / T h i s f i x e s i s s u e s w i t h t e r m i n a t i n g t h e S S L i n f r o n t o f / / N o d e a n d f o r c i n g l o c a t i o n t o t h i n k i t ' s w s s i n s t e a d o f w s . i o . s e t ( ' m a t c h o r i g i n p r o t o c o l ' , t r u e ) ; i o . s e t ( ' l o g l e v e l ' , 0 ) ; } ) ; s e r v e r . l i s t e n ( s e r v e r P o r t ) ;
  7. ws_server.js:getHttpsServer f u n c t i o n g

    e t H t t p s S e r v e r ( ) { v a r o p t i o n s = { k e y : f s . r e a d F i l e S y n c ( c o n f i g . k e y ) , c e r t : f s . r e a d F i l e S y n c ( c o n f i g . c e r t ) , c a : f s . r e a d F i l e S y n c ( c o n f i g . c a ) , r e q u e s t C e r t : f a l s e } , e x p r e s s = r e q u i r e ( ' e x p r e s s ' ) , a p p = e x p r e s s ( ) ; r e t u r n r e q u i r e ( ' h t t p s ' ) . c r e a t e S e r v e r ( o p t i o n s , a p p ) ; }
  8. ws_server.js:doAuth f u n c t i o n d

    o A u t h ( h a n d s h a k e D a t a , c a l l b a c k ) { v a r h e a d e r s = h a n d s h a k e D a t a . h e a d e r s , c o o k i e = h e a d e r s . c o o k i e , h o s t = g e t U r l ( h e a d e r s . h o s t ) , b u f f e r = ' ' , o p t i o n s = { h o s t n a m e : h o s t , p o r t : 4 4 3 , p a t h : r e s t _ s e r v i c e _ u r l , h e a d e r s : { c o o k i e : c o o k i e } } ; r e q u e s t U s e r D a t a ( o p t i o n s ) ; c a l l b a c k ( n u l l , t r u e ) ; }
  9. ws_server.js:onConnection f u n c t i o n o

    n C o n n e c t i o n ( s o c k e t ) { v a r u s e r D a t a = g e t U s e r D a t a ( s o c k e t . h a n d s h a k e ) , t e n a n t N S = ' / t e n a n t ' + u s e r D a t a . t e n a n t I d ; i f ( u s e r D a t a . t e n a n t I d & & t e n a n t N S i n n a m e s p a c e s = = = f a l s e ) { v a r t = t e n a n t . g e t I n s t a n c e ( i o , t e n a n t N S ) ; t . i n i t ( ) ; n a m e s p a c e s [ t e n a n t N S ] = t r u e ; } } No client v a r t m p S o c k e t = i o . c o n n e c t ( s o c k e t U R L ) ; t m p S o c k e t . e m i t ( ' h a s T e n a n t ' , ' / t e n a n t ' + t e n a n t I d ) ; t m p S o c k e t . o n ( ' h a s T e n a n t ' , f u n c t i o n ( ) { s o c k e t = i o . c o n n e c t ( s o c k e t U R L + ' / t e n a n t ' + t e n a n t I d ) ; } ) ;
  10. tenant.js e x p o r t s . g

    e t I n s t a n c e = f u n c t i o n ( i o , n s ) { f u n c t i o n i n i t ( ) { c h a t S e r v i c e . g e t I n s t a n c e ( ) ; c o n s o l e . l o g ( ' S t a r t i n g t e n a n t " ' + n s + ' " ' ) ; n s S o c k e t s = i o . o f ( n s ) ; n s S o c k e t s . o n ( ' c o n n e c t i o n ' , o n C o n n e c t i o n ) ; } . . . r e t u r n { i n i t : i n i t } ; } ;
  11. chatService.js e x p o r t s . g

    e t I n s t a n c e = f u n c t i o n ( ) { r e t u r n { i n i t : f u n c t i o n ( ) { v a r s e l f = t h i s ; t h i s . n s S o c k e t s . o n ( ' c o n n e c t i o n ' , f u n c t i o n ( s o c k e t ) { s e l f . b i n d E v e n t s ( s o c k e t ) ; } ) ; } , b i n d E v e n t s : f u n c t i o n ( s o c k e t ) { } , . . . } ; } ;
  12. Para fechar Se você gosta de codar, procure ficar bom,

    e não só ser um usuário (refém) de APIs