рдХреЛрдгреАрдп рдореЗрдВ рд╡реЗрдмрд╕реЙрдХреЗрдЯред рднрд╛рдЧ 2. рдЙрддреНрдкрд╛рдж рд╕рдорд╛рдзрд╛рди

рдЫрд╡рд┐

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдХреЛрдгреАрдп рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рдЬрд╣рд╛рдВ рд╣рдордиреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреБрди: рдХрдиреЗрдХреНрдЯ рдФрд░ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде WebSocketSubject рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдмрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреИрдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рднреЗрдЬрдирд╛, рдЖрджрд┐, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЙрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдиреЗ рдЦреБрдж рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ, рдЖрдкрдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред

рдЕрдХреНрд╕рд░, рдЙрдЪреНрдЪ рдЙрдкрд╕реНрдерд┐рддрд┐ рд╡рд╛рд▓реА рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдлреНрд░рдВрдЯ-рдПрдВрдб рдЪреЗрд╣рд░реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдмреИрдХ-рдПрдВрдб рдкрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рддрдкрд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдореВрд▓рднреВрдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреА рдЬрд╛рдПрдЧреА:

  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд "рд╕реНрдорд╛рд░реНрдЯ" рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ;
  • рдбрд┐рдмрдЧ рдореЛрдб;
  • рдЖрд░рдПрдХреНрд╕рдЬреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдИрд╡реЗрдВрдЯ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рдгрд╛рд▓реА;
  • рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХрд╛ рд░рд┐рд╕реЗрдкреНрд╢рди рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ;
  • рдореЙрдбрд▓ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкреНрд░реЛрдЬреЗрдХреНрд╢рди (рдорд╛рдирдЪрд┐рддреНрд░рдг);
  • рдирдИ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЖрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдореЙрдбрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг;
  • рдордирдорд╛рдиреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдЙрдкреЗрдХреНрд╖рд╛ рдХреЛ рд░рджреНрдж рдХрд░реЗрдВред

рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд░реАрдХрдиреЗрдХреНрдЯ / рдбреАрдмреИрдЧ


рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл рдкрд╛рда рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЙрджреНрдзреГрдд рдХрд░реВрдВрдЧрд╛:

рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдпрд╛ рд╕рд░реНрд╡рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдВрдЧрдарди, рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕рд░реНрд╡реЛрдкрд░рд┐ рдХрд╛рд░рдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд░реЗрдХ, рд╕рд░реНрд╡рд░ рдХреНрд░реИрд╢, рдпрд╛ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдмреНрд░реЗрдХ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рдкреНрд░рдпрд╛рд╕ рдмрд╣реБрдд рдмрд╛рд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдЦреБрдж рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╕рд░реНрд╡рд░ рд░рд┐рдмреВрдЯ рд╣реЛ рдЧрдпрд╛ рдпрд╛ рд╕рд░реНрд╡рд░ рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛, рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝ рджрд┐рдпрд╛, рддреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░реАрдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рд╡реЗрдмрд╕реНрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдкреБрди: рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмреАрдЪ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдмрджрд▓рдирд╛, рдПрдХ рдордирдорд╛рдирд╛ рд╡реЗрдмрд╕рд░реНрд╡рд░ рд▓реЙрдХрд░ рдЪреБрдирдирд╛, рдЖрджрд┐ред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ WebSocketSubject рдХреЗ рддрд╣рдд рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

RxJs рдШрдЯрдирд╛ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рдгрд╛рд▓реА


рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдЙрдирд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЛрдХрдкреНрд░рд┐рдп рдкрдм / рдЙрдк рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
"рдкреНрд░рдХрд╛рд╢рдХ-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ (engред рдкреНрд░рдХрд╛рд╢рдХ-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдпрд╛ engред рдкрдм / рдЙрдк) - рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдбрд┐рдЬрд╛рдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рдХ (eng рдкреНрд░рдХрд╛рд╢рдХ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реАрдзреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рд╕реЗ рдмрдВрдзреЗ рдирд╣реАрдВ рд╣реИрдВ (engред рд╕рджрд╕реНрдп) )ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рдЧреНрд░рд╛рд╣рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рд╕реЗ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред "

рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдХрд╛рд╢рдХ рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдордзреНрдпрд╡рд░реНрддреА рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ - рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗрд╡рд╛ред рдПрдХ рд╣реА рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрдИ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдпрддрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╡рд┐рд╖рдп рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм RxJs рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЙрдк-рд╡рд┐рд╢реЗрд╖рдг рд╣рдЯрд╛ рджреЗрдЧрд╛ рдЬрдм рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХрд╛ рд░рд┐рд╕реЗрдкреНрд╢рди рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ


WebSocket рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдбреЗрдЯрд╛, рдлрд╝рд╛рдЗрд▓реЛрдВ рдпрд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
0x80, <рд▓рдВрдмрд╛рдИ - рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕>, <рд╕рдВрджреЗрд╢ рд╢рд░реАрд░>

рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрджреЗрд╢ рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддрд░реНрдХрд╣реАрди рд░реВрдк рд╕реЗ рдЦрд░реНрдЪ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓рдВрдмрд╛рдИ рд╕рдВрдХреЗрдд рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрдЪреНрдЪрддрдо рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ (0) рд╣реИ рдпрд╛ рдЕрдиреНрдп (1) рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рдЪрд▓реЗ 7 рдмрд┐рдЯреНрд╕ рдореЗрдВ рд╕рдВрдЪрд░рд┐рдд рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдбреЗрдЯрд╛ рдлреНрд░реЗрдо 0x80 рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рдмрд╛рдЗрдЯ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрд▓рдЧ "рдкрд┐рдЧреА рдмреИрдВрдХ" рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЕрдЧрд▓реА рдмрд╛рдЗрдЯ, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЗрд╕реЗ "рдЧреБрд▓реНрд▓рдХ" рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЬрдм рддрдХ рдХрд┐ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ рд╕реВрдЪрдХ рдореЗрдВ рдЕрдВрддрд┐рдо рд╣реИ рдФрд░ рдЗрд╕реЗ "рдЧреБрд▓реНрд▓рдХ" рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм, рдЧреБрд▓реНрд▓рдХ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢реЗрд╖ рд╕рдВрдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджреЗрд╢ рдирд┐рдХрд╛рдп рдХреА рд▓рдВрдмрд╛рдИ рд╣реЛрдЧреА - рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХреЗ рдмрд┐рдирд╛ 7-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ред

рдлреНрд░рдВрдЯ-рдПрдВрдб рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░реАрдо рддрдВрддреНрд░ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдореЙрдбрд▓ рдкрд░ рдбреЗрдЯрд╛ рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд╕рдорд░реНрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдПрдХ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдЕрдЧрд░ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд╣реИред

рдореЙрдбрд▓ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди (рдореИрдкрд┐рдВрдЧ)


рдкреНрд░рд╛рдкреНрдд рд╕рдВрдЪрд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдкрд░ рдХреЛрдИ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдУрдУрдкреА рд╢реИрд▓реА рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдорд╛рдирддрд╛ рд╣реВрдВред
тАЬрдбреЗрдЯрд╛ рдореЙрдбрд▓ рдПрдХ рдЕрдореВрд░реНрдд, рдЖрддреНрдордирд┐рд░реНрднрд░, рд╡рд╕реНрддреБрдУрдВ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреА рддрд╛рд░реНрдХрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рд╛рде рдПрдХ рдЕрдореВрд░реНрдд рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдорд╢реАрди рдХрд╛ рдЧрдарди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИред "рдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛, рдФрд░ рдСрдкрд░реЗрдЯрд░ - рдбреЗрдЯрд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯрд╛рдпрд░ рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░, рд╕рдВрд░рдЪрдирд╛ рдЖрджрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рднреНрд░рдо рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХрдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рдХреБрдЫ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреБрддреНрддреЗ рд╡рд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдХреБрддреНрддреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреБрддреНрддреЗ рдХреЛ рдЦреЗрддреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреВрдВрдЫ, рд░рдВрдЧ, рдЪреЗрд╣рд░рд╛, рдЖрджрд┐, рддреЛ рдХреБрддреНрддрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдЬрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдФрд░ рдХреБрддреНрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЫрд╡рд┐

рдирдИ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЖрдиреЗ рдкрд░ рдореЙрдбрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг


рдЗрд╕ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдореИрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдореЛрдмрд╛рдЗрд▓ рд╕рдЯреНрдЯреЗрдмрд╛рдЬреА рдХреЗ рдЦреЗрд▓ рдХреЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЖрдИ рдереАред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдкреАрдЖрдИ рдиреЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ: рдСрдбреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рдВрд╡ рдЬреЛрдбрд╝рдирд╛, рдирд┐рдХрд╛рд▓рдирд╛ рдФрд░ рдореИрдЪ рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдЖрджрд┐ред - рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреА рдХреБрд▓ рддреАрди рд╕реМ рдШрдЯрдирд╛рдПрдБред рдореИрдЪ рдХреЗ рджреМрд░рд╛рди, рджрд╛рдВрд╡ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 2-3 рдмрд╛рд░, рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдЙрдирдХреЗ рдмрд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдордзреНрдпрд╡рд░реНрддреА рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдмреЛрд▓реА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА, рдФрд░ рдЙрд╕реА рд╕рдордп рдЙрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рдмреЛрд▓реА рджреГрд╢реНрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЯреНрд░реИрдХ рдХреА рдЧрдИ рдмреЛрд▓реА рдХреА рдЦреЛрдЬ рдХрд░рдиреА рдереАред рдпрд╣ рдЕрджреНрдпрддрди рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЫрд╡рд┐

рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рдЯреНрдЯреЗрдмрд╛рдЬреА рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛, рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмреЛрд▓рд┐рдпрд╛рдВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдирдП рдХреЛ рддрдм рддрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░реАрди рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗред рдмреИрдХрдПрдВрдб рдкрд░ рдЖрдЙрдЯ-рдСрдл-рдбреЗрдЯ рд╡рд┐рдХрд▓реНрдк рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдРрд╕реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ "рд╣рдЯрд╛рдП рдЧрдП" рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдпрд╛рдж рд░рдЦрдирд╛ рдФрд░ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ред

рдирдИ рд╕реЗрд╡рд╛ рдореЗрдВ, рд╣рдо рдПрдХ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдкрд░рдд рднреА рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕ рдмрд╛рд░ рд╣рдо Dexie.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - IndexedDB API рдкрд░ рдПрдХ рдЖрд╡рд░рдг, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЕрдиреНрдп рд╡рд░реНрдЪреБрдЕрд▓ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд░реЗрдЧрд╛ред Redux рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

рдордирдорд╛рдиреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдЙрдкреЗрдХреНрд╖рд╛ рдХреЛ рд░рджреНрдж рдХрд░реЗрдВ


рдПрдХ рд╣реА рдХрдВрдкрдиреА рдореЗрдВ рдЕрдХреНрд╕рд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ: рдореЛрдмрд╛рдЗрд▓ рдФрд░ рд╡реЗрдм рд╕рдВрд╕реНрдХрд░рдг, рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг, рдПрдХ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЙрдиреНрдирдд рдФрд░ рдЫрдВрдЯреЗ рд╣реБрдП рд╕рдВрд╕реНрдХрд░рдгред

рдЕрдХреНрд╕рд░ рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рдХреЛрдб рдЖрдзрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдпрд╛ рдбреАрдЖрдИ рдХреЗ рджреМрд░рд╛рди рдЕрдирд╛рд╡рд╢реНрдпрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рди рдХрд░реЗрдВред рдпрд╣ рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬреЛ рдкрдм / рд╕рдм рдмрд╕ рдореЗрдВ рд▓рдЪреАрд▓рд╛рдкрди рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдЪрд▓реЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

export interface IWebsocketService { //    addEventListener<T>(topics: string[], id?: number): Observable<T>; runtimeIgnore(topics: string[]): void; runtimeRemoveIgnore(topics: string[]): void; sendMessage(event: string, data: any): void; } export interface WebSocketConfig { //   DI url: string; ignore?: string[]; garbageCollectInterval?: number; options?: Options; } export interface ITopic<T> { //   Pub/Sub [hash: string]: MessageSubject<T>; } export interface IListeners { //    [topic: string]: ITopic<any>; } export interface IBuffer { //    ws.message type: string; data: number[]; } export interface IWsMessage { // ws.message event: string; buffer: IBuffer; } export interface IMessage { //   id: number; text: string; } export type ITopicDataType = IMessage[] | number | string[]; //  callMessage   

рд╣рдо рдПрдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВрдЧреЗ:

 export class MessageSubject<T> extends Subject<T> { constructor( private listeners: IListeners, //    private topic: string, //   private id: string // id  ) { super(); } /* *   next, *       , *   garbageCollect */ public next(value?: T): void { if (this.closed) { throw new ObjectUnsubscribedError(); } if (!this.isStopped) { const {observers} = this; const len = observers.length; const copy = observers.slice(); for (let i = 0; i < len; i++) { copy[i].next(value); } if (!len) { this.garbageCollect(); //   } } } /* * garbage collector * */ private garbageCollect(): void { delete this.listeners[this.topic][this.id]; //  Subject if (!Object.keys(this.listeners[this.topic]).length) { //    delete this.listeners[this.topic]; } } } 

рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдкрд░реАрдд, websocket.events.ts рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛

 export const WS_API = { EVENTS: { MESSAGES: 'messages', COUNTER: 'counter', UPDATE_TEXTS: 'update-texts' }, COMMANDS: { SEND_TEXT: 'set-text', REMOVE_TEXT: 'remove-text' } }; 

рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, websocket.config рдмрдирд╛рдПрдВ:

 import { InjectionToken } from '@angular/core'; export const config: InjectionToken<string> = new InjectionToken('websocket'); 

рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдПрдБ:

 import Dexie from 'dexie'; import { IMessage, IWsMessage } from './websocket.interfaces'; import { WS_API } from './websocket.events'; class MessagesDatabase extends Dexie { //    Dexie  typescript public messages!: Dexie.Table<IMessage, number>; // id is number in this case constructor() { super('MessagesDatabase'); //   this.version(1).stores({ //   messages: '++id,text' }); } } 

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбрд▓ рдкрд╛рд░реНрд╕рд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕реЗ рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ:

 export const modelParser = (message: IWsMessage) => { if (message && message.buffer) { /*  */ const encodeUint8Array = String.fromCharCode .apply(String, new Uint8Array(message.buffer.data)); const parseData = JSON.parse(encodeUint8Array); let MessagesDB: MessagesDatabase; // IndexedDB if (message.event === WS_API.EVENTS.MESSAGES) { // IMessage[] if (!MessagesDB) { MessagesDB = new MessagesDatabase(); } parseData.forEach((messageData: IMessage) => { /*   */ MessagesDB.transaction('rw', MessagesDB.messages, async () => { /* ,    */ if ((await MessagesDB.messages .where({id: messageData.id}).count()) === 0) { const id = await MessagesDB.messages .add({id: messageData.id, text: messageData.text}); console.log(`Addded message with id ${id}`); } }).catch(e => { console.error(e.stack || e); }); }); return MessagesDB.messages.toArray(); //   IMessage[] } if (message.event === WS_API.EVENTS.COUNTER) { // counter return new Promise(r => r(parseData)); //    } if (message.event === WS_API.EVENTS.UPDATE_TEXTS) { // text const texts = []; parseData.forEach((textData: string) => { texts.push(textData); }); return new Promise(r => r(texts)); //     } } else { console.log(`[${Date()}] Buffer is "undefined"`); } }; 

WebsocketModule:

 @NgModule({ imports: [ CommonModule ] }) export class WebsocketModule { public static config(wsConfig: WebSocketConfig): ModuleWithProviders { return { ngModule: WebsocketModule, providers: [{provide: config, useValue: wsConfig}] }; } } 

рдЖрдЗрдП рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░реЗрдВ:

 private listeners: IListeners; //   private uniqueId: number; //   id  private websocket: ReconnectingWebSocket; //   constructor(@Inject(config) private wsConfig: WebSocketConfig) { this.uniqueId = -1; this.listeners = {}; this.wsConfig.ignore = wsConfig.ignore ? wsConfig.ignore : []; //  this.connect(); } ngOnDestroy() { this.websocket.close(); //     } 

рдХрдиреЗрдХреНрдЯ рд╡рд┐рдзрд┐:

 private connect(): void { // ReconnectingWebSocket config const options = { connectionTimeout: 1000, //  ,    maxRetries: 10, //  ,    ...this.wsConfig.options }; //  this.websocket = new ReconnectingWebSocket(this.wsConfig.url, [], options); this.websocket.addEventListener('open', (event: Event) => { //   console.log(`[${Date()}] WebSocket connected!`); }); this.websocket.addEventListener('close', (event: CloseEvent) => { //   console.log(`[${Date()}] WebSocket close!`); }); this.websocket.addEventListener('error', (event: ErrorEvent) => { //   console.error(`[${Date()}] WebSocket error!`); }); this.websocket.addEventListener('message', (event: MessageEvent) => { //     this.onMessage(event); }); setInterval(() => { //    this.garbageCollect(); }, (this.wsConfig.garbageCollectInterval || 10000)); } 

рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ, рд╕рдордп-рд╕рдордп рдкрд░ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛:

 private garbageCollect(): void { for (const event in this.listeners) { if (this.listeners.hasOwnProperty(event)) { const topic = this.listeners[event]; for (const key in topic) { if (topic.hasOwnProperty(key)) { const subject = topic[key]; //  Subject    if (!subject.observers.length) { delete topic[key]; } } }  ,   if (!Object.keys(topic).length) { delete this.listeners[event]; } } } } 

рд╣рдо рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

 private onMessage(event: MessageEvent): void { const message = JSON.parse(event.data); for (const name in this.listeners) { if (this.listeners.hasOwnProperty(name) && !this.wsConfig.ignore.includes(name)) { const topic = this.listeners[name]; const keys = name.split('/'); //      const isMessage = keys.includes(message.event); const model = modelParser(message); //     if (isMessage && typeof model !== 'undefined') { model.then((data: ITopicDataType) => { //   Subject this.callMessage<ITopicDataType>(topic, data); }); } } } } 

рд╡рд┐рд╖рдп рдореЗрдВ рд╣реЗрд▓рдореЗрдЯ рдШрдЯрдирд╛:

 private callMessage<T>(topic: ITopic<T>, data: T): void { for (const key in topic) { if (topic.hasOwnProperty(key)) { const subject = topic[key]; if (subject) { //   subject.next(data); } else { console.log(`[${Date()}] Topic Subject is "undefined"`); } } } } 

рдкрдм / рдЙрдк рд╡рд┐рд╖рдп рдмрдирд╛рдПрдВ:

 private addTopic<T>(topic: string, id?: number): MessageSubject<T> { const token = (++this.uniqueId).toString(); const key = id ? token + id : token; //  id   const hash = sha256.hex(key); // SHA256-   id  if (!this.listeners[topic]) { this.listeners[topic] = <any>{}; } return this.listeners[topic][hash] = new MessageSubject<T>(this.listeners, topic, hash); } 

рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛:

 public addEventListener<T>(topics: string | string[], id?: number): Observable<T> { if (topics) { //       const topicsKey = typeof topics === 'string' ? topics : topics.join('/'); return this.addTopic<T>(topicsKey, id).asObservable(); } else { console.log(`[${Date()}] Can't add EventListener. Type of event is "undefined".`); } } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдЗрдирд░реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред рд╕рд░реНрд╡рд░ рдкрд░ рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛:

 public sendMessage(event: string, data: any = {}): void { //   ,      if (event && this.websocket.readyState === 1) { this.websocket.send(JSON.stringify({event, data})); } else { console.log('Send error!'); } } 

рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЗрдЧреНрдиреЛрд░рд▓рд┐рд╕реНрдЯ рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдЬреЛрдбрд╝реЗрдВ:

 public runtimeIgnore(topics: string[]): void { if (topics && topics.length) { //    this.wsConfig.ignore.push(...topics); } } 

рдЕрдЬреНрдЮрд╛рдиреА рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдПрдВ:

 public runtimeRemoveIgnore(topics: string[]): void { if (topics && topics.length) { topics.forEach((topic: string) => { //      const topicIndex = this.wsConfig.ignore.findIndex(t => t === topic); if (topicIndex > -1) { //    this.wsConfig.ignore.splice(topicIndex, 1); } }); } } 

рд╣рдо рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, ReactiveFormsModule, WebsocketModule.config({ url: environment.ws, //  "ws://mywebsocketurl" //    ignore: [WS_API.EVENTS.ANY_1, WS_API.EVENTS.ANY_2], garbageCollectInterval: 60 * 1000, //    options: { connectionTimeout: 1000, //   maxRetries: 10 //   } }) ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } 

рд╣рдо рдШрдЯрдХреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit, OnDestroy { private messages$: Observable<IMessage[]>; private messagesMulti$: Observable<IMessage[]>; private counter$: Observable<number>; private texts$: Observable<string[]>; public form: FormGroup; constructor( private fb: FormBuilder, private wsService: WebsocketService) { } ngOnInit() { this.form = this.fb.group({ text: [null, [ Validators.required ]] }); // get messages this.messages$ = this.wsService .addEventListener<IMessage[]>(WS_API.EVENTS.MESSAGES); // get messages multi this.messagesMulti$ = this.wsService .addEventListener<IMessage[]>([ WS_API.EVENTS.MESSAGES, WS_API.EVENTS.MESSAGES_1 ]); // get counter this.counter$ = this.wsService .addEventListener<number>(WS_API.EVENTS.COUNTER); // get texts this.texts$ = this.wsService .addEventListener<string[]>(WS_API.EVENTS.UPDATE_TEXTS); } ngOnDestroy() { } public sendText(): void { if (this.form.valid) { this.wsService .sendMessage(WS_API.COMMANDS.SEND_TEXT, this.form.value.text); this.form.reset(); } } public removeText(index: number): void { this.wsService.sendMessage(WS_API.COMMANDS.REMOVE_TEXT, index); } } 

рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред



рдпрджреНрдпрдкрд┐ рд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрдбрд╝реЗ рдФрд░ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реЗрд╡рд╛ рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдкрд░ рдпрд╛ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рдХреЛрдгреАрдп рдЪреИрдирд▓ рдкрд░ред

Source: https://habr.com/ru/post/hi419099/


All Articles