[ã¢ããã€ã¹ãèªã]ãµã€ã¯ã«ã®ä»ã®19ã®éšå æ¬æ¥ãWebãã¯ãããžãŒãšJavaScriptã®äœ¿çšã«é¢ããäžé£ã®èšäºã®ç¬¬9éšã®ç¿»èš³ãå
¬éããŸãã ãã®èšäºã§ã¯ãWebããã·ã¥éç¥ã«ã€ããŠèª¬æããŸãã ã€ãŸãããããã®åºç€ãšãªãã¡ã«ããºã ãããã³éç¥ã®ãµãã¹ã¯ãªãã·ã§ã³ãå®è¡ãããæ¹æ³ãéç¥ã®éåä¿¡ããã»ã¹ãã©ã®ããã«é
眮ããããã«ã€ããŠèª¬æããŸãã

å€ãã®éçºè
ã䜿çšãããæ©èœã®1ã€ã§ãããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®äžçã§ã¯éåžžã«äžè¬çãªããã·ã¥éç¥ãããªãé
ããŠWebã«å±ããŸããã
埩ç¿
ããã§èª¬æããŠãããã¯ãããžãŒã䜿çšãããšããŠãŒã¶ãŒã¯ãæ°ãã玠æã®åºçŸããŸãã¯èå³ã®ããã€ãã³ãã®çºçã«ã€ããŠãµãã¹ã¯ã©ã€ããŒã«éç¥ããããšãç®çãšããWebã¢ããªã±ãŒã·ã§ã³ã®å®æçãªéç¥ããµãã¹ã¯ã©ã€ãã§ããŸãã WebãªãœãŒã¹èªäœã®èгç¹ãããããã¯ãããã·ã¥éç¥ã«ãµãã¹ã¯ã©ã€ããããŠãŒã¶ãŒããã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããæåŸ
ããçç±ãšæ©äŒãããããšãæå³ããŸãã
ããã·ã¥éç¥ãæäŸããã¡ã«ããºã ã®1ã€ã¯ã 
ãµãŒãã¹ã¯ãŒã«ãŒã§ãã ããã·ã¥éç¥ãåŠçãããµãŒãã¹ã¯ãŒã«ãŒã¯ãç¹å®ã®ãµãŒãã¹ã¯ãŒã«ãŒãæ
åœããæ°ããéç¥ããã©ãŠã¶ã«å°çãããšãã«ã®ã¿ã³ãŒããå®è¡ããããããã·ã¹ãã ãªãœãŒã¹ãçµæžçã«æ¶è²»ããŸãã
ããã·ã¥APIãšéç¥API
ããã§ãWebããã·ã¥éç¥ããšåŒã¶ãã®ã¯ãå®éã«ã¯2ã€ã®ãã¯ãããžãŒã§è¡šãããŸãã ããã¯ããµãŒããŒãService Workerã«ã¡ãã»ãŒãžãéä¿¡ãããšãã«äœ¿çšããã
Push APIãšãService WorkerãŸãã¯Webã¢ããªã±ãŒã·ã§ã³èªäœã®ã¹ã¯ãªããããŠãŒã¶ãŒã«éç¥ã衚瀺ãããšãã«äœ¿çšããã
Notifications APIã§ãã
ããã·ã¥API
ããã·ã¥éç¥ã¡ã«ããºã ãå®è£
ããã«ã¯ã次ã®3ã€ã®æé ãå®è¡ããå¿
èŠããããŸãã
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®æºåã ãã®ã¹ãããã§ã¯ããŠãŒã¶ãŒãéç¥ããµãã¹ã¯ã©ã€ãã§ããã¡ã«ããºã ãæºåããŸãã
 - ããã·ã¥ã¡ãã»ãŒãžãéä¿¡ããŸãã ãã®ã¹ãããã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³éçºè
ã®ãµãŒããŒã§ã察å¿ããAPIã«ã¢ã¯ã»ã¹ããŸããããã«ããããŠãŒã¶ãŒã®ããã€ã¹ã«éç¥ãéä¿¡ãããŸãã
 - ããã·ã¥ã¡ãã»ãŒãžãåä¿¡ããŸãã ãã®ã¹ãããã§ã¯ãããã·ã¥ã¡ãã»ãŒãžã¯ãã©ãŠã¶ã«é
ä¿¡ãããåŸã«åŠçãããŸãã
 
ããããã¹ãŠè©³çŽ°ã«æ€èšããŠãã ããã
ãã©ãŠã¶ã®æ©èœã確èªãã
ãŸããçŸåšã®ãã©ãŠã¶ãããã·ã¥éç¥ããµããŒãããŠãããã©ããã確èªããå¿
èŠããããŸãã ããã¯ã次ã®ãã§ãã¯ãå®è¡ããããšã§å®è¡ã§ããŸãã
navigatorãªããžã§ã¯ãã§serviceWorkerã確èªããŸããwindowãªããžã§ã¯ãå
ã®PushManagerã®ååšã確èªããŸãã
ããã¯æ¬¡ã®ãããªãã®ã§ãã
 if (!('serviceWorker' in navigator)) { //    -. return; } if (!('PushManager' in window)) { //    push-. return; } 
ãŠãŒã¶ãŒã®ãã©ãŠã¶ãŒãWebããã·ã¥éç¥ã®æäœã«å¿
èŠãªãã¯ãããžãŒããµããŒãããŠããªãå ŽåããŠãŒã¶ãŒã«ãããã®ãµãã¹ã¯ã©ã€ããç³ãåºãŠãæå³ããããŸããã
ãµãŒãã¹ã¯ãŒã«ãŒç»é²
ãã©ãŠã¶ã確èªããåŸãå¿
èŠãªãã®ããµããŒãããŠããããšã倿ããå Žåã¯ãService Workerã®ç»é²ã«é²ãããšãã§ããŸãã ãããè¡ãæ¹æ³
ã«ã€ããŠã¯ãã§ã«èª¬æããŸããã
ãŠãŒã¶ãŒèš±å¯ã®ååŸ
Service Workerã®ç»é²åŸããŠãŒã¶ãŒãéç¥ã«ãµãã¹ã¯ã©ã€ãããããã»ã¹ãéå§ã§ããŸãã ãããè¡ãã«ã¯ããŠãŒã¶ãŒããããã·ã¥ã¡ãã»ãŒãžãéä¿¡ããèš±å¯ãååŸããå¿
èŠããããŸãã
èš±å¯APIã¯æ¯èŒçåçŽã§ãã æ³šæããå¿
èŠãããã®ã¯ã 
ãã®APIã® 2ã€ã®ããŒãžã§ã³
ã䜿çšãããããšã ãã§ãã
以åã®ããŒãžã§ã³ã§ã¯ãã³ãŒã«ããã¯é¢æ°ãåãå
¥ããŠããŸããããçŸåšã§ã¯ãããã¹ãè¿ããŸãã çŸåšã®ãã©ãŠã¶ã«å®è£
ãããŠããAPIã®ããŒãžã§ã³ãäºåã«ç¥ãããšã¯ã§ããªãããããããåé¡ã®åå ã§ãã ãããã£ãŠããããã®ã¢ãããŒãã®äž¡æ¹ããµããŒãããå¿
èŠããããŸãã
次ã®ããã«ãªããŸãã
 function requestPermission() { return new Promise(function(resolve, reject) {   const permissionResult = Notification.requestPermission(function(result) {     //       .     resolve(result);   });   if (permissionResult) {     permissionResult.then(resolve, reject);   } }) .then(function(permissionResult) {   if (permissionResult !== 'granted') {     throw new Error('Permission not granted.');   } }); } 
Notification.requestPermission()ãåŒã³åºããšã次ã®ãŠã£ã³ããŠã衚瀺ãããŸãã
éç¥ã衚瀺ããèš±å¯ããªã¯ãšã¹ããããŠãŒã¶ãŒã
Allowãã¿ã³ãã¯ãªãã¯ããŠ
BlockãããããŠã£ã³ããŠãéããããšã§èš±å¯ãªã¯ãšã¹ãã«å¿çãããšãçµæãè¡ãšããŠååŸãããŸãããŠãŒã¶ãŒã®éžæã«å¿ããŠã 
'granted' ã 
'denied' ããŸãã¯
'default' ã
ãŠãŒã¶ãŒã[ 
Block ]ãã¿ã³ãã¯ãªãã¯ãããšãã¢ããªã±ãŒã·ã§ã³ã¯ãéç¥ã衚瀺ããèš±å¯ãåå¥ã«ãããã¯è§£é€ããããŸã§ãŠãŒã¶ãŒã«èŠæ±ã§ããªããªããŸãã ãããè¡ãã«ã¯ããŠãŒã¶ãŒã¯ãã©ãŠã¶ã®èšå®ã詳ãã調ã¹ãå¿
èŠããããŸãã
PushManagerã䜿çšãããŠãŒã¶ãŒãµãã¹ã¯ãªãã·ã§ã³
ãµãŒãã¹ã¯ãŒã«ãŒãç»é²ããéç¥ã衚瀺ãããŠãŒã¶ãŒèš±å¯ãåãåãå¯èœæ§ã確信ããåŸããµãŒãã¹ã¯ãŒã«ãŒã®
registration.pushManager.subscribe()ã¡ãœãããåŒã³åºãããšã§ãµãã¹ã¯ã©ã€ãã§ããŸãã
ãµãŒãã¹ã¯ãŒã«ãŒã®ç»é²ãå«ãããã¹ãŠã®å€èŠ³ã¯æ¬¡ã®ãšããã§ãã
 function subscribeUserToPush() { return navigator.serviceWorker.register('service-worker.js') .then(function(registration) {   var subscribeOptions = {     userVisibleOnly: true,     applicationServerKey: btoa(       'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U'     )   };   return registration.pushManager.subscribe(subscribeOptions); }) .then(function(pushSubscription) {   console.log('PushSubscription: ', JSON.stringify(pushSubscription));   return pushSubscription; }); } 
registration.pushManager.subscribe(options)ã¡ãœããã¯ãããã€ãã®ãã©ã¡ãŒã¿ãŒãå«ã
optionsãªããžã§ã¯ããåãå
¥ããŸãããã®ããã€ãã¯ãªãã·ã§ã³ã§ãã
userVisibleOnly ã ãã®è«çå€ã¯ãçæããããµãã¹ã¯ãªãã·ã§ã³ãã¡ãã»ãŒãžã®è¡šç€ºã®ã¿ã«äœ¿çšãããããšã瀺ããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯trueã«èšå®ããå¿
èŠããããŸããèšå®ããªããšãšã©ãŒãçºçããŸãïŒããã«ã¯æŽå²çãªçç±ããããŸãïŒãapplicationServerKey ã ããã¯ãBase64ã§ãšã³ã³ãŒããããDOMString ããŸãã¯ããã·ã¥ãµãŒããŒãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã®èªèšŒã«äœ¿çšããå
¬éããŒãå«ãArrayBufferãªããžã§ã¯ãã§ãã
Webã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã¯ããµãŒããŒã«åºæã®ã¢ããªã±ãŒã·ã§ã³ããŒã®ãã¢ãçæããå¿
èŠããããŸãïŒVAPIDããŒãšãåŒã°ããŸãïŒã ãã®ãã¢ã«ã¯å
¬ééµãšç§å¯éµãå«ãŸããŸãã ãµãŒããŒã¯ç§å¯éµãç§å¯ã«ä¿ã¡ãå
¬ééµãã¯ã©ã€ã¢ã³ãã«è»¢éããŸãã ããŒã«ãããããã·ã¥éç¥ãµãŒãã¹ã¯ãã©ã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããŠãŒã¶ãŒã«ãµã€ã³ã¢ããããããèªèããç¹å®ã®ãŠãŒã¶ãŒã«éç¥ãéä¿¡ãããµãŒããŒãšåããµãŒããŒã§ããããšã確èªã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ããŒãã¢ã¯ãäžåºŠã ãäœæããå¿
èŠããããŸãã ããŒãçæããã«ã¯ã 
ãã¡ããã芧ãã ãã ã
ãã©ãŠã¶ãŒã¯ããµãã¹ã¯ãªãã·ã§ã³ããã»ã¹äžã«
applicationServerKey ïŒå
¬éããŒïŒãããã·ã¥ãµãŒãã¹ã«æž¡ããŸãã ããã¯ãããã·ã¥ãµãŒãã¹ãã¢ããªã±ãŒã·ã§ã³ã®å
¬éããŒããµãã¹ã¯ãªãã·ã§ã³
PushSubscriptionã«é¢é£ä»ããããšãã§ããããšãæå³ããŸãã
ããã§äœãèµ·ãããã§ãïŒ
- Webã¢ããªã±ãŒã·ã§ã³ã¯ããµãŒããŒããŒãæž¡ããŠ
subscribe()ããŒãããŠåŒã³åºããŸãã
 - ãã©ãŠã¶ãŒã¯ãããã·ã¥ãµãŒãã¹ã«å¯ŸããŠãããã¯ãŒã¯èŠæ±ãè¡ããŸããããã·ã¥ãµãŒãã¹ã¯ãç¬èªã®APIãžã®ãšã³ããªãã€ã³ãã®ã¢ãã¬ã¹ãçæãããã®ã¢ãã¬ã¹ãããŒã«é¢é£ä»ããŠããã©ãŠã¶ãŒã«é¢ããæ
å ±ãè¿ããŸãã
 - ãã©ãŠã¶ã¯ããã®æ
å ±ã
PushSubscriptionãªããžã§ã¯ãã«è¿œå ããŸãããã®ãªããžã§ã¯ãã¯ã subscribe() promiseãéããŠè¿ãããŸãã
 
åŸã§ãããã·ã¥éç¥ãéä¿¡ããå Žåãã¢ããªã±ãŒã·ã§ã³ã®ãã©ã€ããŒããµãŒããŒããŒã§çœ²åãããæ
å ±ãå«ã
AuthorizationããããŒãäœæããå¿
èŠããããŸãã ããã·ã¥ãµãŒãã¹ãéç¥ãéä¿¡ããèŠæ±ãåä¿¡ãããšãäžèšã®ããã»ã¹ã®2çªç®ã®ã¹ãããã§APIãšã³ããªãã€ã³ãã«æ¢ã«é¢é£ä»ããããŠããå
¬éããŒã䜿çšããŠããããŒã確èªããŸãã
PushSubscriptionãªããžã§ã¯ã
PushSubscriptionãªããžã§ã¯ãã«ã¯ããŠãŒã¶ãŒã®ããã€ã¹ã«ããã·ã¥éç¥ãéä¿¡ããããã«å¿
èŠãªãã¹ãŠã®æ
å ±ãå«ãŸããŠããŸãã ããã¯æ¬¡ã®ãããªãã®ã§ãã
 { "endpoint": "https://domain.pushservice.com/some-id", "keys": {   "p256dh": "BIPUL12DLfytvTajnryr3PJdAgXS3HGMlLqndGcJGabyhHheJYlNGCeXl1dn18gSJ1WArAPIxr4gK0_dQds4yiI=",   "auth":"FPssMOQPmLmXWmdSTdbKVw==" } } 
endpointããããã£ã¯ãããã·ã¥éç¥ãµãŒãã¹URLãAPIãžã®ãšã³ããªãã€ã³ãã§ãã éç¥ãéä¿¡ããã«ã¯ããã®URLã§POSTãªã¯ãšã¹ããå®è¡ããå¿
èŠããããŸãã
keysãªããžã§ã¯ãã«ã¯ãããã·ã¥éç¥ã§éä¿¡ãããã¡ãã»ãŒãžããŒã¿ã®æå·åã«äœ¿çšãããæ
å ±ãå«ãŸããŠããŸãã
ãŠãŒã¶ãŒãéç¥ããµãã¹ã¯ã©ã€ããã 
PushSubscriptionãªããžã§ã¯ããããå ŽåãããããµãŒããŒã«éä¿¡ããå¿
èŠããããŸãã ãµãŒããŒã§ã¯ããã®ãªããžã§ã¯ãã®å
容ã¯ãããšãã°ããŒã¿ããŒã¹ã«ä¿åããå¿
èŠããããä»åŸã¯ãã®æ
å ±ã䜿çšããŠãããã·ã¥éç¥ã察å¿ãããŠãŒã¶ãŒã«éä¿¡ã§ããŸãã
èš±å¯ãååŸããPushSubscriptionãªããžã§ã¯ããäœæããŠãµãŒããŒã«éä¿¡ããããã·ã¥ã¡ãã»ãŒãžãéä¿¡ãã
ãŠãŒã¶ãŒã«ããã·ã¥ã¡ãã»ãŒãžãéä¿¡ããå Žåãéä¿¡ããããŒã¿ãéä¿¡å
ãã¡ãã»ãŒãžã«é¢ããè¿œå æ
å ±ã«ã€ããŠãããã·ã¥ãµãŒãã¹ã«ïŒé©åãªAPIã¡ãœãããåŒã³åºããŠïŒéç¥ããå¿
èŠããããŸãã ãã®åŒã³åºãã¯éåžžãWebã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããè¡ãããŸãã
ããã·ã¥ãµãŒãã¹
ããã·ã¥ãµãŒãã¹ã¯ãããã·ã¥éç¥ãéä¿¡ããèŠæ±ãåä¿¡ãããããããã§ãã¯ããŠãé©åãªãã©ãŠã¶ãŒã«éç¥ãé
ä¿¡ããã·ã¹ãã ã§ãã
ããã·ã¥ãµãŒãã¹ã¯ãWebã¢ããªã±ãŒã·ã§ã³éçºè
ã管çããŠããªããµãŒãããŒãã£ã®ãµãŒãã¹ã§ããããšã«æ³šæããŠãã ããã ãµãŒããŒã¯ãAPIãä»ããŠããã·ã¥ãµãŒãã¹ãšããåããããµãŒããŒã§ãã ããã·ã¥ãµãŒãã¹ã®äŸã¯
Google FCMã§ãã
ããã·ã¥ãµãŒãã¹ã¯ãå€ãã®è€éãªã¿ã¹ã¯ãåŠçããŸãã ããšãã°ããã©ãŠã¶ããªãã©ã€ã³ã®å Žåãããã·ã¥ãµãŒãã¹ã¯ã¡ãã»ãŒãžããã¥ãŒã«å
¥ããã¡ãã»ãŒãžãéä¿¡ããããŸã§ã¡ãã»ãŒãžãéä¿¡ããããŸã§åŸ
æ©ããŸãã
åãã©ãŠã¶ãŒã¯ä»»æã®ããã·ã¥ãµãŒãã¹ã䜿çšã§ããŸãããWebã¢ããªã±ãŒã·ã§ã³éçºè
ã¯ããã·ã¥ãµãŒãã¹ã®éžæã«åœ±é¿ããŸããã ãã ãããã¹ãŠã®ããã·ã¥ãµãŒãã¹ã¯åãAPIã䜿çšããŠããããããããã®ãµãŒãã¹ã®å€æ§æ§ã«ãã£ãŠããã·ã¥éç¥ã¡ã«ããºã ã®å®è£
ã«åé¡ãçããããšã¯ãããŸããã ããã·ã¥ã¡ãã»ãŒãžãéä¿¡ããèŠæ±ãåŠçããURLãååŸããã«ã¯ã 
PushSubscriptionãªããžã§ã¯ãã®
endpointãã©ã¡ãŒã¿ãŒã®ä»¥åã«ä¿åãããå€ãåç
§ããå¿
èŠããããŸãã
ããã·ã¥ãµãŒãã¹API
ããã·ã¥ãµãŒãã¹APIã¯ããŠãŒã¶ãŒã«ã¡ãã»ãŒãžãéä¿¡ããããã®ããŒã«ãæäŸããŸãã ããã¯ã 
Web Push Protocolã§è¡šãããŸããããã¯ãããã·ã¥ãµãŒãã¹ãæäœããæé ãå®çŸ©ããIETFæšæºã§ãã
ããã·ã¥ã¡ãã»ãŒãžã§éä¿¡ãããããŒã¿ã¯æå·åããå¿
èŠããããŸãã ãã®ãããéçºè
ã¯ããã·ã¥ãµãŒãã¹ããŠãŒã¶ãŒã«éä¿¡ãããããŒã¿ã衚瀺ããããšãèš±å¯ããŸããã 䜿çšããããã·ã¥ãµãŒãã¹ã決å®ããã®ã¯ãã©ãŠã¶ãŒã§ãããããããã¯éèŠã§ãïŒããã·ã¥ãµãŒãã¹ãååã«å®å
šã§ãªãå¯èœæ§ããããŸãïŒã
次ã®ããããã£ã¯ãããã·ã¥ã¡ãã»ãŒãžããšã«èšå®ãããŸãã
TTLæªé
ä¿¡ã®ããã·ã¥éç¥ãåé€ãããåã«ãã¥ãŒã§è²»ããããšãã§ããæéãæ±ºå®ããŸãã
Priority -ã¡ãã»ãŒãžã®åªå
床ãèšå®ããŸããããã«ããããŠãŒã¶ãŒã®ããã€ã¹ã®ããããªãŒé»åãç¯çŽããå¿
èŠãããå Žåã«ãããã·ã¥ãµãŒãã¹ã¯åªå
床ã®é«ãã¡ãã»ãŒãžã®ã¿ãéä¿¡ã§ããŸãã
Topic -ããã·ã¥éç¥ã«ãããã¯åãå²ãåœãŠãŸããããã«ãããåããããã¯ã§é
ä¿¡ãåŸ
æ©ããŠããã¡ãã»ãŒãžã眮ãæããããŸãã ãã®çµæããŠãŒã¶ãŒã®ããã€ã¹ãã¢ã¯ãã£ãã«ãªããšããã«ããŠãŒã¶ãŒã¯ææ°ã®ã¡ãã»ãŒãžãåãåããŸãã
Webã¢ããªã±ãŒã·ã§ã³éçºè
ãµãŒããŒãããã·ã¥ãµãŒããŒãããã³ã¡ãã»ãŒãžã®å°çå
ã®ãã©ãŠã¶ãŒãã©ãŠã¶ããã·ã¥ã€ãã³ã
ã¡ãã»ãŒãžãããã·ã¥ãµãŒãã¹ã«éä¿¡ããããšããã«ã次ã®ããããã®ã€ãã³ããçºçãããŸã§åŸ
æ©ç¶æ
ã«ãªããŸãã
- ããã€ã¹ã¯ãªã³ã©ã€ã³ã§ãã
 - TTLãã©ã¡ãŒã¿ãŒã§æå®ãããã¡ãã»ãŒãžä¿ææéãåããŸããã
 
ããã·ã¥ãµãŒãã¹ãã¡ãã»ãŒãžãé
ä¿¡ãããšããã©ãŠã¶ãŒã¯ãããåä¿¡ããè§£èªãã以åã«ç»é²ããããµãŒãã¹ã¯ãŒã«ãŒã§ããã·ã¥ã€ãã³ããããªã¬ãŒããŸãã
æãè峿·±ãã®ã¯ã察å¿ããWebããŒãžãéããŠããªããŠãããã©ãŠã¶ãŒããµãŒãã¹ã¯ãŒã«ãŒãåŒã³åºãããšãã§ããããšã§ãã ããã§æ¬¡ã®ããšãèµ·ãããŸãã
- ããã·ã¥éç¥ããã©ãŠã¶ã«å±ãããã©ãŠã¶ã¯ãããè§£èªããŸãã
 - ãã©ãŠã¶ã¯Service Workerãã¢ã¯ãã£ãã«ããŸãã
 - ããã·ã¥ã€ãã³ãã¯ãµãŒãã¹ã¯ãŒã«ãŒã«ãã£ã¹ããããããŸãã
 
ããã·ã¥ã€ãã³ããã³ãã©ãŒã®æ§æã«äœ¿çšãããã³ãŒãã¯ãä»ã®JavaScriptã€ãã³ããã³ãã©ãŒã®ã³ãŒãã®ããã«èŠããŸãã
 self.addEventListener('push', function(event) { if (event.data) {   console.log('This push event has data: ', event.data.text()); } else {   console.log('This push event has no data.'); } }); 
ãµãŒãã¹ã¯ãŒã«ãŒã®æ©èœã«ã€ããŠèª¬æããå ŽåããµãŒãã¹ã¯ãŒã«ãŒãã¢ã¯ãã£ãã«ããã¿ã€ãã³ã°ãšåæ¢ããã¿ã€ãã³ã°ã決å®ããã®ã¯ãã©ãŠã¶ãŒã§ãããããéçºè
ã¯ãµãŒãã¹ã¯ãŒã«ãŒã®å®è¡æéãæå°éã®ã¬ãã«ã§å¶åŸ¡ã§ããããšã«æ³šæããŠãã ããã
ãµãŒãã¹ã¯ãŒã«ãŒ
event.waitUntil(promise)ã®æ§ç¯ã¯ã 
event.waitUntil(promise)解決ããåã«ããµãŒãã¹ã¯ãŒã«ãŒãéç¥ã®åŠçã§ããžãŒã§ããããã©ãŠã¶ãŒããã®äœæ¥ãå®äºããåã«ãµãŒãã¹ã¯ãŒã«ãŒãã·ã£ããããŠã³ããŠã¯ãªããªãããšããã©ãŠã¶ã«äŒããŸãã
ããã·ã¥ã€ãã³ããåŠçããããã®ãµã³ãã«ã³ãŒããæ¬¡ã«ç€ºããŸãã
 self.addEventListener('push', function(event) { var promise = self.registration.showNotification('Push notification!'); event.waitUntil(promise); }); 
self.registration.showNotification()åŒã³åºãã¯ããŠãŒã¶ãŒãèŠãããšãã§ããéç¥ãå°ããŸãããã®åŒã³åºãã¯ãéç¥ã衚瀺ããããšããã«è§£æ±ºãããçŽæãè¿ããŸãã
showNotification(title, options)ã¡ãœããã䜿çšãããšãéçºè
ã®ããŒãºã«å¿ããŠéç¥ã®å€èгãã«ã¹ã¿ãã€ãºã§ããŸãã ãããã£ãŠã 
titleãã©ã¡ãŒã¿ãŒã¯æååã§ããã 
optionsãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®å
容ã®ãªããžã§ã¯ãã§ãã
 { "//": "Visual Options", "body": "<String>", "icon": "<URL String>", "image": "<URL String>", "badge": "<URL String>", "vibrate": "<Array of Integers>", "sound": "<URL String>", "dir": "<String of 'auto' | 'ltr' | 'rtl'>", "//": "Behavioural Options", "tag": "<String>", "data": "<Anything>", "requireInteraction": "<boolean>", "renotify": "<Boolean>", "silent": "<Boolean>", "//": "Both Visual & Behavioural Options", "actions": "<Array of Strings>", "//": "Information Option. No visual affect.", "timestamp": "<Long>" } 
ããã§ã¯ãéç¥ã®å€èгã®ã«ã¹ã¿ãã€ãºã«ã€ããŠè©³ããèªãããšãã§ããŸãã
ãŸãšã
ããã·ã¥éç¥ã¯ã䜿çšããããªãœãŒã¹ãšãããã®ãªãœãŒã¹ã®ãŠãŒã¶ãŒã®äž¡æ¹ã«å©çãããããããšãã§ããŸãã ãããããWebãªãœãŒã¹ã®ææè
ãèŠããŠããã¹ãäž»ãªããšã¯ãããã·ã¥éç¥ã«ã¯ãŠãŒã¶ãŒã«ãšã£ãŠæ¬åœã«è峿·±ãå¿
èŠãªãã®ãå«ãŸããŠããããšã§ãã
ãã®èšäºã®èè
ã¯ã圌ã®äŒç€Ÿã§ãã
SessionStack㯠ãããã·ã¥éç¥ã䜿çšããŠããããžã§ã¯ãã®ã¯ã©ãã·ã¥ãåé¡ããŸãã¯ç°åžžããŠãŒã¶ãŒã«éç¥ããããšãèšç»ããŠãããšè¿°ã¹ãŠããŸãã ããã«ãããç·æ¥äºæ
ã«ã€ããŠå³åº§ã«åŠç¿ããé©åãªå¯Ÿçãè¬ããããšãã§ããŸãã
äžé£ã®èšäºã®åã®éšåïŒ
ããŒã1ïŒ 
JSã®ä»çµã¿ïŒãšã³ãžã³ãã©ã³ã¿ã€ã ã¡ã«ããºã ãã³ãŒã«ã¹ã¿ãã¯ã®æŠèŠããŒã2ïŒ 
JSã®ä»çµã¿ïŒV8å
éšãšã³ãŒãã®æé©åã«ã€ããŠããŒã3ïŒ 
JSã®ä»çµã¿ïŒã¡ã¢ãªç®¡çã4çš®é¡ã®ã¡ã¢ãªãªãŒã¯ãããã³ããããšã®æŠãããŒã4ïŒ 
JSã®ä»çµã¿ïŒã€ãã³ãã«ãŒããéåæãããã³async / awaitã䜿çšããŠã³ãŒããæ¹åãã5ã€ã®æ¹æ³ããŒã5ïŒ 
JSã®ä»çµã¿ïŒWebSocketãšHTTP / 2 + SSEã äœãéžã¶ïŒããŒã6ïŒ 
JSã®ä»çµã¿ïŒWebAssemblyã®æ©èœãšç¯å²ããŒã7ïŒ 
JSã®ä»çµã¿ïŒWeb Workersãš5ã€ã®äœ¿çšã·ããªãªããŒã8ïŒ 
JSã®ä»çµã¿ïŒãµãŒãã¹ã¯ãŒã«ãŒèŠªæãªãèªè
ïŒ ãããžã§ã¯ãã§ããã·ã¥éç¥ã䜿çšããŠããŸããïŒ