OneSignal is a push notification service for web and mobile apps. This SDK makes it easy to integrate your website with OneSignal Push Notifications. https://onesignal.com
Other
388
stars
115
forks
source link
[Fix] Service Worker race condition, when a 2nd sw is in play, causing User not to register #1136
Fix Service Worker race condition, when a 2nd sw is in play, causing User not to register.
Details
If you attempt to get the service worker registration immediately after registering it the browser can give you a different registration than expected. This is due to the fact the new registration may not be ready yet and there might be sw in scope at a higher level.
The problem noted above cause the OneSignal SDK to register for a push token on the wrong service worker. This in turn causes the SDK to attempt to create a user with a push subscription but without a push token, which results in a 400 error on POST /users.
To fix, instead of calling navigator.serviceWorker.getRegistration we are now simply using the ServiceWorkerRegistration give to us by navigator.serviceWorker.register to avoid this race condition completely
Validation
Tests
Test on Chrome 119 on Windows 11
Ensured after accepting push notifications I received a welcome notification. Clear the browser data and push permission, opened a new tab, and tested again 3 more times.
Refreshed page after accepting notifications to ensure existing service worker is found without an error.
Info
Checklist
[X] All the automated tests pass or I explained why that is not possible
[X] I have personally tested this on my machine or explained why that is not possible
[X] I have included test coverage for these changes or explained why they are not needed
Programming Checklist
Interfaces:
[X] Don't use default export
[X] New interfaces are in model files
Functions:
[X] Don't use default export
[X] All function signatures have return types
[X] Helpers should not access any data but rather be given the data to operate on.
Typescript:
[X] No Typescript warnings
[X] Avoid silencing null/undefined warnings with the exclamation point
Other:
[X] Iteration: refrain from using elem of array syntax. Prefer forEach or use map
[X] Avoid using global OneSignal accessor for context if possible. Instead, we can pass it to function/constructor so that we don't call OneSignal.context
Screenshots
Info
Checklist
[X] I have included screenshots/recordings of the intended results or explained why they are not needed
Description
1 Line Summary
Fix Service Worker race condition, when a 2nd sw is in play, causing User not to register.
Details
If you attempt to get the service worker registration immediately after registering it the browser can give you a different registration than expected. This is due to the fact the new registration may not be ready yet and there might be sw in scope at a higher level.
The problem noted above cause the OneSignal SDK to register for a push token on the wrong service worker. This in turn causes the SDK to attempt to create a user with a push subscription but without a push token, which results in a
400
error onPOST /users
.To fix, instead of calling
navigator.serviceWorker.getRegistration
we are now simply using theServiceWorkerRegistration
give to us bynavigator.serviceWorker.register
to avoid this race condition completelyValidation
Tests
Test on Chrome 119 on Windows 11
Info
Checklist
Programming Checklist Interfaces:
Functions:
Typescript:
Other:
elem of array
syntax. PreferforEach
or usemap
context
if possible. Instead, we can pass it to function/constructor so that we don't callOneSignal.context
Screenshots
Info
Checklist
Related Tickets
This change is