SSEGWSW: рд╕рд░реНрд╡рд┐рд╕-рд╡рд░реНрдХрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рд░реНрд╡рд░-рд╕реЗрдВрдЯреЗрдб рдЗрд╡реЗрдВрдЯ рдЧреЗрдЯрд╡реЗ

рдирдорд╕реНрддреЗ!

рдореЗрд░рд╛ рдирд╛рдо рд╕рд╛рд╢рд╛ рд╣реИ рдФрд░ рдореИрдВ рдЯрд┐рдВрдХреЙрдл рдмрд┐рдЬрдиреЗрд╕ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддреБрдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕реА рдбреЛрдореЗрди рдХреЗ рднреАрддрд░ рдЦреБрд▓реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ HTTP рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ, рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЗрдВ, рдФрд░ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред

SSEGWSW

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдПрдХ рдмрд╛рд░ рдЯрд┐рдВрдХреЙрдл рдмрд┐рдЬрдиреЗрд╕ рдореЗрдВ рд╡реЗрдмрд╕реИрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдЪреИрдЯ рдереАред

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

рд╣рдордиреЗ рдирдП рд╕рдорд╛рдзрд╛рди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рд╣рдо рдирд┐рдпрдорд┐рдд HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рднреЗрдЬреЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, POST: / api / send-message рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ , GET рд╕рдВрд╡рд╛рджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ : / api / рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк-рд╕реВрдЪреА, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдШрдЯрдирд╛рдУрдВ рдЬреИрд╕реЗ "рд╡рд╛рд░реНрддрд╛рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢" рдПрд╕рдПрд╕рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдХреЛ рдмрдврд╝рд╛рдПрдВрдЧреЗ: рдпрджрд┐ рдПрд╕рдПрд╕рдИ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЪреИрдЯ рдЕрднреА рднреА рдХрд╛рдо рдХрд░реЗрдЧреА, рдХреЗрд╡рд▓ рдпрд╣ рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░реЗрдЧреАред

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

рд╕рдорд╕реНрдпрд╛


рдЬрдм рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдПрд╕рдПрд╕рдИ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдПрдХ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рд╕реВрдХреНрд╖реНрдо рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЕрдЪреНрдЫрд╛, рдЙрдиреНрд╣реЗрдВ рдмрдирдиреЗ рджреЛред рд╕реЙрд░реА рдпрд╛ рдХреНрдпрд╛? рд╣рдореЗрдВ рдЦреЗрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЗрдж рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ! рд╡реЗ рдПрдХ рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП рд╕рдорд╡рд░реНрддреА рд▓рдЧрд╛рддрд╛рд░ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рд╣реИ ред рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рдореЗрдВ рдХрд┐рддрдирд╛ рд╣реИ? рдареАрдХ рд╣реИ, рдЫрд╣! рдореИрдВрдиреЗ рддреАрди рдЯреИрдм рдЦреЛрд▓реЗ - рдореИрдВрдиреЗ рдкреВрд░реЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХреЛ рд░рди рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рдЖрдк HTTP рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ HTTP / 1.x рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред HTTP / 2 рдореЗрдВ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВ:

  1. рдбреЛрдореЗрди рдХреА рд╕рд╛рдЭреЗрджрд╛рд░реАред
  2. HTTP / 2ред

рдпреЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЗ рдорд╣рдВрдЧреЗ рд▓рдЧ рд░рд╣реЗ рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

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

рдирд┐рд░реНрдгрдп


рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рд╕реЛрдЪрд╛: рдХреНрдпрд╛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рд╕реЗрд╡рд╛ рдХрд░реНрдордЪрд╛рд░реА рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рд╡реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

self.addEventListener('fetch', event => { const response = self.caches.open('example') .then(caches => caches.match(event.request)) .then(response => response || fetch(event.request)); event.respondWith(response); }); 

рд╣рдо HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирддреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреИрд╢ рд╕реЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдЪрд▓рд┐рдП SSE рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ:

 self.addEventListener('fetch', event => { const {headers} = event.request; const isSSERequest = headers.get('Accept') === 'text/event-stream'; if (!isSSERequest) { return; } event.respondWith(new Response('Hello!')); }); 

рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдпрд╣:

рдЫрд╡рд┐

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрд╕рдПрд╕рдИ рдкрд╛рда / рд╕рд╛рджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рда / рдШрдЯрдирд╛-рдзрд╛рд░рд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ ред рдЕрдм рд╕реНрдЯреНрд░реАрдо рдХреИрд╕реЗ рдмрдирд╛рдПрдВ? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдореИрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рднреА рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ? рдЕрдЪреНрдЫрд╛ рдЪрд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдХреНрд▓рд╛рд╕ рдПрдХ рдмреЙрдбреА рд░реАрдбреЗрдмрд▓рд╕реНрдЯреНрд░реАрдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдпрд╣ рдкрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реАрдбреЗрдмрд▓рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдиреНрдХреНрдпреВ () рд╡рд┐рдзрд┐ рд╣реИ - рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдЖрдк рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрдпреБрдХреНрдд, рд▓реЗ рд▓реЛ!

 self.addEventListener('fetch', event => { const {headers} = event.request; const isSSERequest = headers.get('Accept') === 'text/event-stream'; if (!isSSERequest) { return; } const responseText = 'Hello!'; const responseData = Uint8Array.from(responseText, x => x.charCodeAt(0)); const stream = new ReadableStream({start: controller => controller.enqueue(responseData)}); const response = new Response(stream); event.respondWith(response); }); 

рдЫрд╡рд┐

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

 const sseHeaders = { 'content-type': 'text/event-stream', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', }; 

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

Javascript.info рдкрд░, рдбреЗрдЯрд╛ рд╕реНрд╡рд░реВрдк рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 const sseChunkData = (data: string, event?: string, retry?: number, id?: number): string => Object.entries({event, id, data, retry}) .filter(([, value]) => ![undefined, null].includes(value)) .map(([key, value]) => `${key}: ${value}`) .join('\n') + '\n\n'; 

SSE рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдбрдмрд▓ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ \ n \ n рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрджреЗрд╢ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдбреЗрдЯрд╛ - рд╕рдВрджреЗрд╢ рд╢рд░реАрд░, рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рдбреЗрдЯрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ \ n рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рдЖрдИрдбреА - рд▓рд╛рд╕реНрдЯ-рдЗрд╡реЗрдВрдЯ-рдЖрдИрдбреА рд╣реЗрдбрд░ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП lastEventId рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп;
  • рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ - рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рд▓рдВрдм, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  • рдШрдЯрдирд╛ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдШрдЯрдирд╛ рдХрд╛ рдирд╛рдо, рдбреЗрдЯрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред

рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рдЬреЛрдбрд╝реЗрдВ, рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЙрддреНрддрд░ рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

 self.addEventListener('fetch', event => { const {headers} = event.request; const isSSERequest = headers.get('Accept') === 'text/event-stream'; if (!isSSERequest) { return; } const sseChunkData = (data, event, retry, id) => Object.entries({event, id, data, retry}) .filter(([, value]) => ![undefined, null].includes(value)) .map(([key, value]) => `${key}: ${value}`) .join('\n') + '\n\n'; const sseHeaders = { 'content-type': 'text/event-stream', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', }; const responseText = sseChunkData('Hello!'); const responseData = Uint8Array.from(responseText, x => x.charCodeAt(0)); const stream = new ReadableStream({start: controller => controller.enqueue(responseData)}); const response = new Response(stream, {headers: sseHeaders}); event.respondWith(response); }); 

рдЫрд╡рд┐

рдУрд╣ рдореЗрд░реЗ рдЧреНрд▓реЛрдм! рд╣рд╛рдВ, рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рдХреЗ рдмрд┐рдирд╛ SSE рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рд╣реИ!

рдкрд░рд┐рдгрд╛рдо


рдЕрдм рд╣рдо рдПрд╕рдПрд╕рдИ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реЗ рдЬрд╛рдП рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╡рд┐рдЪрд╛рд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ - рдФрд░ рдЗрд╕рд╕реЗ рдЯреИрдм рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдЪрд▓реЛ рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ!

 self.addEventListener('fetch', event => { const {headers, url} = event.request; const isSSERequest = headers.get('Accept') === 'text/event-stream'; //   SSE- if (!isSSERequest) { return; } //    SSE const sseHeaders = { 'content-type': 'text/event-stream', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', }; // ,    SSE const sseChunkData = (data, event, retry, id) => Object.entries({event, id, data, retry}) .filter(([, value]) => ![undefined, null].includes(value)) .map(([key, value]) => `${key}: ${value}`) .join('\n') + '\n\n'; //    ,   тАФ url,  тАФ EventSource const serverConnections = {}; //   url             const getServerConnection = url => { if (!serverConnections[url]) serverConnections[url] = new EventSource(url); return serverConnections[url]; }; //          const onServerMessage = (controller, {data, type, retry, lastEventId}) => { const responseText = sseChunkData(data, type, retry, lastEventId); const responseData = Uint8Array.from(responseText, x => x.charCodeAt(0)); controller.enqueue(responseData); }; const stream = new ReadableStream({ start: controller => getServerConnection(url).onmessage = onServerMessage.bind(null, controller) }); const response = new Response(stream, {headers: sseHeaders}); event.respondWith(response); }); 

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

рд╣рдордиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдпрд╣ рд╕рдм рддрдп рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ - рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛!

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


All Articles