Service Workerを用いたPush通知のクリックイベント挙動差分が起こってしまって困ってしまっています

現在下記の困った事象に苛まれています。

やりたいこと
Mac/WinのChromeを用いてServiceWorkerのPush通知を受け取った際に、
クリックイベントで特定のページに遷移させたい
(下記のソースコードはtanomu/tondeに変更しています。)
Web画面を開いていない状態でも画面を開かせたい為、ngsw-worker.jsのJSをラップしています。
※表現が正しくないかもしれません。

事象
MacのChrome:想定通りにやりたいことが達成される
WinのChrome:想定通りに達成されない
達成できていない箇所の詳細:通知が出てクリックしても想定通りに特定のページに飛ばせない。

環境やその他詳細
Angular: 11.2(ServiceWorkerやUniversal含む
NestJS: 7.6.11
Mac OS BigSur
Windows19 1909
Chrome 87
Push通知はNestJSからVAPIDを用いて行っています。
自己証明書を用いて、nginx経由でアクセスしています。
証明書エラーは出ていません。

該当ソースコード
importScripts(’./ngsw-worker.js’);
self.addEventListener(‘notificationclick’, function(event) {
event.waitUntil(
self.clients.matchAll().then(function(clientList) {
if (clientList.length > 0) {
return clientList[0].focus();
}
return self.clients.openWindow(’…/…/tanomu/tonde’);
})
);
});

Service WorkerのOSごとの挙動の違いには詳しくないのですが、
Windowsで通知をクリックしたときに

  • notificationclickイベントハンドラーはそもそも呼び出されているか
  • notificationclickイベントハンドラーが呼び出されていたら、ハンドラーの中でエラーは発生していないか

この2つを確認する必要があると思います。

私も詳しくないので勘ですが、ServiceWorkerそのものより Clients.openWindow()周りが気になりました。

MDNで確認すると 既存の閲覧コンテキストで URL を開く場合があります とあり、konohaさんの掲載コードにも既存タブと新しいタブを開く場合のコンテキストの判断分岐がありますが、そこの引数や対応方法がいろいろ異なります。(新しいタブを開くパターンでもfocusをやっていますね)

https://developer.mozilla.org/ja/docs/Web/API/Clients/openWindow

@lacolaco さん
ありがとうございます。
Windowsの場合、デバッグしようとしましたが、ハンドラーが呼ばれていない状態でした。

ServiceWorkerでイベントハンドラーを登録するタイミングの問題なのかもしれないと思い、調べてたところ現在は解決しました。
解決していても、理解ができていないので困っております。
Promiseで包む理由が理解できていないJS初心者です。

解決したコード
const promise = new Promise(function(resolve) {
setTimeout(resolve, 3000);
}).then(function() {
self.clients.matchAll().then(function(clientList) {
if (clientList.length > 0) {
return clientList[0].focus();
}
return self.clients.openWindow(’…/…/tanomu/tonde’);
})
});
event.waitUntil(promise);

@studioTeaTwo さん
ありがとうございます。
引数とか含めて確認してみます!
一応マイクロソフトも同じようなクリックイベントの記載方法を載せていて、それと同じように書いたのですが、動かないといったところです。