PWA рдХреА рд╢рдХреНрддрд┐: рдПрдХ рд╡реАрдбрд┐рдпреЛ рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рдЬрд┐рд╕рдореЗрдВ 300-рд▓рд╛рдЗрди рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ JS рдХреЛрдб рд╣реИ

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рд╡реЗрдм рд╕рдВрд╕реНрдХрд░рдг (PWA) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рджреЗрд╢реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрдо рдФрд░ рдХрдо рдХрд╛рд░рдг рд╣реИред рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо, рд╕рдореГрджреНрдз рдПрдкреАрдЖрдИ, рдЯреАрдПрд╕ / рдЬреЗрдПрд╕ рдкрд░ рдЙрдЪреНрдЪ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реА 8 рдЗрдВрдЬрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди - рдпрд╣ рд╕рдм рдПрдХ рдкреНрд▓рд╕ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдШрдЯрдХ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░ , рдореИрдВрдиреЗ рдбреЗрдореЛ рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕реНрддрд░ рдкрд░ рд▓рд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рд╡рд░реНрдХрд┐рдВрдЧ рдбреЗрдореЛ рдпрд╣рд╛рдБ рд╣реИ ред

рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

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

2) рдлрд╛рдпрд░рдлреЙрдХреНрд╕ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реЛрдо / рдХреНрд░реЛрдорд┐рдпрдо / рдПрдЬ рдХреЗ рддрд╣рдд рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдХрд╛рдлрд╝реА рдзреАрдореА рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, ImageCapture рдЕрднреА рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмреЗрд╢рдХ, рдЗрд╕реЗ <video> рд╕реЗ рдПрдХ рдлреНрд░реЗрдо рдХреИрдкреНрдЪрд░ рдХрд░рдХреЗ рдмрд╛рдИрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЛрдордбрд╝реА рдХреЗ рд▓рд┐рдП рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдирдХ рд╣реИ рдПрдкреАрдЖрдИ)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдИ рдкреВрд░реНрдг рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рднреА рдирд╣реАрдВ рдереАред

рддреЛ, рдХреНрд░рдо рдореЗрдВ рд╕рдм рдХреБрдЫред

рдПрдХ рдХреИрдорд░рд╛ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдлреЛрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


this.video = this.querySelector('video')
this.canvas = this.querySelectorAll('canvas')[0]

this.stream = await navigator.mediaDevices.getUserMedia(
   {video: {facingMode: {ideal: "environment"}}, audio: true}
)
this.video.srcObject = this.stream
await new Promise((resolve, reject) => {
   this.video.onloadedmetadata = (_) => resolve()
})
this.W = this.bbox.width = this.canvas.width = this.video.videoWidth
this.H = this.bbox.height = this.canvas.height = this.video.videoHeight

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

рд╡рд┐рдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб


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

this.capture = new ImageCapture(this.stream.getVideoTracks()[0])
this.recorder = new MediaRecorder(this.canvas.captureStream(), {mimeType : "video/webm"})

grab_video()

async function grab_video() {
	this.canvas.drawImage(await this.capture.grabFrame(), 0, 0)
	const img = this.canvas.getImageData(0, 0, this.W, this.H)
	... //    -   img
	... //   -    
        window.requestAnimationFrame(this.grab_video.bind(this))
}

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

...
async function grab_video() {
	this.canvas.drawImage(this.video, 0, 0)
	...
}

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

рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдорд╛рдирд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ


рдпрд╣ рд╕рдм рдЕрд╢реЛрднрдиреАрдп рд╣реИред рд╣рдо рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ , рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдмрд▓реНрдХрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ), рд╣рдо рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдСрдирдореИрд╕реЗрдЬ рдШрдЯрдирд╛ рдореЗрдВ рд╣рдо рд╕реНрдЯрд╛рд░реНрдЯ рдмрдЯрди рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛрдб:

(async () => {
  self.importScripts('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js')
  self.importScripts('https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd')

  let model = await cocoSsd.load()
  self.postMessage({})

  self.onmessage = async (ev) => {
    const result = await model.detect(ev.data)
    const person = result.find(v => v.class === 'person')
    if (person) 
      self.postMessage({ok: true, bbox: person.bbox})
    else
      self.postMessage({ok: false, bbox: null})
  }
})()

рдореБрдЦреНрдп рд╕реВрддреНрд░ рдореЗрдВ, рд╣рдо рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА Grab_video () рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ , рдЕрд░реНрдерд╛рдд, рдбрд┐рдЯреЗрдХреНрд╢рди рдЖрд╡реГрддреНрддрд┐ рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреАред

рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ


this.recorder.rec = new MediaRecorder(this.stream, {mimeType : "video/webm"})
this.recorder.rec.ondataavailable = (ev) => {
   this.chunk = ev.data
   if (this.detected) {
      this.send_chunk()
   } else if (this.recorder.num > 0) {
      this.send_chunk()
      this.recorder.num--
   }
}
...
this.recorder.rec.start()
this.recorder.num = 0
this.recorder.interval = setInterval(() => {
   this.recorder.rec.stop()
   this.recorder.rec.start()
}, CHUNK_DURATION)

рд░рд┐рдХреЙрд░реНрдбрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЙрдк рдкрд░ (рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ), рдСрдирдбреЗрдЯрд╛рд╡реИрдмрд▓ рдШрдЯрдирд╛ рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдмреНрд▓реЙрдм рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рд┐рдВрдХ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдВ, рдпрд╣ред Send_chunk () рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ (рдмреЗрд╕ 64 рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рдПрдХ рдИрдореЗрд▓ рднреЗрдЬрдирд╛ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдирд╛), рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ - рдХреЛрдИ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдирдП рд╡реАрдбрд┐рдпреЛ рдХреНрд▓рд┐рдк рдЕрдзрд┐рдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЗрдПрд╕ рдЗрдВрдЬрди рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╡рд╛рджреЛрдВ рдХреА рд░реЗрдЦрд╛ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рднреЗрдЬрд╛ / рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдд send_chunk () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реИ рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдмреНрд▓реЙрдм рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ () рд╡рд┐рдзрд┐ рд╕реЗ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕.рдЪрдВрдХ рд▓рд┐рдВрдХ рдХреЛ рд╣рд░ CHUNK_DURATION рд╕реЗрдХрдВрдб рдореЗрдВ рд░рдЧрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреАрдореЗрд▓ рдПрдкреАрдЖрдИ


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

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

await import('https://apis.google.com/js/api.js')
gapi.load('client:auth2', async () => {
   try {
      await gapi.client.init({
         apiKey: API_KEY,
         clientId: CLIENT_ID,
         discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'],
         scope: 'https://www.googleapis.com/auth/gmail.send'
      }) 
      if (!gapi.auth2.getAuthInstance().isSignedIn.je) {
         await gapi.auth2.getAuthInstance().signIn()
      }
      this.msg.innerHTML = ''
      this.querySelector('nav').style.display = ''
   } catch(e) {
      this.msg.innerHTML = 'Gmail authorization error: ' + JSON.stringify(e, null, 2)
   }
})

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

async send_mail(subject, mime_type, body) {
   const headers = {
      'From': '',
      'To': this.email,
      'Subject': 'Balajahe CCTV: ' + subject,
      'Content-Type': mime_type,
      'Content-transfer-encoding': 'base64'
   }
   let head = ''
   for (const [k, v] of Object.entries(headers)) head += k + ': ' + v + '\r\n'
   const request = gapi.client.gmail.users.messages.send({
      'userId': 'me',
      'resource': { 'raw': btoa(head + '\r\n' + body) }
   })
   return new Promise((resolve, reject) => {
      request.execute((res) => {
         if (!res.code) 
            resolve() 
         else 
            reject(res)
      })
   })
}

рдбрд┐рд╕реНрдХ рдкрд░ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХреНрд▓рд┐рдк рдХреЛ рд╕рд╣реЗрдЬрдирд╛ред рд╣рдо рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

const a = this.querySelector('a')
URL.revokeObjectURL(a.href)
a.href = URL.createObjectURL(chunk)
a.download = name
a.click()

рд╡реЗрдм рдШрдЯрдХреЛрдВ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди


рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП рдЗрд╕ рд▓реЗрдЦ , рдореИрдВ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛ рдХреА рдореВрд░реНрдЦрддрд╛ рддрд╛рд░реНрдХрд┐рдХ рдЕрдВрдд (lulz рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓) рдФрд░ рд░рд╛рдЬреНрдп рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдЙрд▓реНрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ред рдпрджрд┐ рдЖрдорддреМрд░ рдкрд░ JS рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдПрдХ рд░рд╛рдЬреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ DOM рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реИ, рддреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд DOM рд╣реА рд╣реИ (рдЪреВрдВрдХрд┐ рд╡реЗрдм рдШрдЯрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ DOM рдиреЛрдбреНрд╕ рд╣реИрдВ), рдФрд░ JS рдкрдХреНрд╖ рдкрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рдЧреЗрдЯрд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ / рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░реНрд╕ред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рдЕрд╕рд╣рдЬ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп, рд╕рд░рд▓ <рдмрдЯрди> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрдЯрди рдХрд╛ "рдореВрд▓реНрдп" (рд╕рдЪ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЧрд▓рдд рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдп рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

button.true {background-color: red}

рдФрд░ рдЗрд╕ рддрд░рд╣ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

get detecting() { return this.querySelector('#detecting').className === 'true' }

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

рдСрдлрд╝рд▓рд╛рдЗрди рдореЛрдб


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

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

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдРрд╕реА рдпреЛрдЬрдирд╛ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдХреЛрдб рдореЗрдВ рдЖрдкрдХреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЕрдк-рдЯреВ-рдбреЗрдЯ рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рд╕рднреА рд╕рдВрд▓рдЧреНрди рдЖрдпрд╛рдд (рдЧрддрд┐рд╢реАрд▓ рд╡рд╛рд▓реЗ рд╕рд╣рд┐рдд) рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ - рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ рдирдП рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛрдЧрд╛ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдж / рдЦреЛрд▓рд╛ рдЧрдпрд╛ рд╣реЛред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреГрд╖реНрда рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рдкреБрд░рд╛рдиреЗ рдХрд░реНрдордЪрд╛рд░реА рдкреБрд░рд╛рдиреЗ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдФрд░ рдХрд╣рд╛рдБ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЧреНрд░рд╛рд╣рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд░рдЦреЗрдВрдЧреЗ? рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдо рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдЕрдиреБрдорддрд┐ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ cache.put (ev.request, resp.clone ()), рдФрд░ рдпрджрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХреИрд╢ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рджрд┐рди рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИрдлрд┐рд░ 5 рдорд┐рдирдЯ рдореЗрдВ рдЙрдбрд╝рд╛рди рднрд░реЗрдВред

рдЕрдирд╕реБрд▓рдЭреА рд╕рдорд╕реНрдпрд╛


  1. рдХреБрдЫ рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдкрд░, рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реАрдУрд╕реАрдУ-рдПрд╕рдПрд╕рдбреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдордПрд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рдФрд░ рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╕реБрдирд╛ рдерд╛ред
  2. рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рдХреИрд╕реЗ GAPI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдмреЗрд╕ 64 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдореВрд▓ рдмрд╛рдЗрдирд░реА рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдПред рдпрд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛рддрд╛рдпрд╛рдд рджреЛрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред
  3. рдореБрдЭреЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдИред рд╕реНрдерд╛рдиреАрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Google рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдбреЛрдореЗрди рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рд╕реНрдкреИрдо рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ - рддреЛ рдХреНрдпрд╛ Google рд╕реНрд╡рдпрдВ рдпрд╛ рдкреНрд░реЗрд╖рдХ рдХреЗ рдЦрд╛рддреЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрдЧрд╛?

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред

рдЧреАрдереВрдм рдкрд░ рд╕реВрддреНрд░ред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рджред

All Articles