From cebe687d78b73da51a51946dff4c5c3b8253621a Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 5 May 2023 18:14:21 -0500 Subject: [PATCH 1/4] Switch back to use original SDK worker filename Motivation: * allows us to more easily differentiate between serviceworke files (ours vs theirs) * easier migration path (e.g: simply update the contents of the file to point to our cdn script) * remove `envPrefix` from front of workerPath (doesn't make sense for this) --- src/shared/helpers/ConfigHelper.ts | 2 +- src/shared/helpers/ContextHelper.ts | 4 +--- src/shared/helpers/ServiceWorkerHelper.ts | 6 +++--- src/shared/managers/SdkEnvironment.ts | 2 +- src/shared/managers/ServiceWorkerManager.ts | 10 +++++----- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/shared/helpers/ConfigHelper.ts b/src/shared/helpers/ConfigHelper.ts index 13b1cefc3..4de948233 100644 --- a/src/shared/helpers/ConfigHelper.ts +++ b/src/shared/helpers/ConfigHelper.ts @@ -480,7 +480,7 @@ export class ConfigHelper { Except injecting some default values for prompts. */ const defaultServiceWorkerParam = { scope: '/' }; - const defaultServiceWorkerPath = 'OneSignalSDK.sw.js'; + const defaultServiceWorkerPath = 'OneSignalSDKWorker.js'; const config = { ...userConfig, diff --git a/src/shared/helpers/ContextHelper.ts b/src/shared/helpers/ContextHelper.ts index 72f2ff85a..6a0a0a8e4 100644 --- a/src/shared/helpers/ContextHelper.ts +++ b/src/shared/helpers/ContextHelper.ts @@ -1,6 +1,5 @@ import { ServiceWorkerManager } from '../managers/ServiceWorkerManager'; import { SubscriptionManager, SubscriptionManagerConfig } from '../managers/SubscriptionManager'; -import SdkEnvironment from '../managers/SdkEnvironment'; import { ContextSWInterface } from "../models/ContextSW"; import { AppConfig } from '../models/AppConfig'; import Path from '../models/Path'; @@ -9,9 +8,8 @@ export class ContextHelper { public static getServiceWorkerManager(context: ContextSWInterface): ServiceWorkerManager { const config: AppConfig = context.appConfig; - const envPrefix = SdkEnvironment.getBuildEnvPrefix(); const serviceWorkerManagerConfig = { - workerPath: new Path(`/${envPrefix}OneSignalSDK.sw.js`), + workerPath: new Path(`OneSignalSDKWorker.js`), registrationOptions: { scope: '/' } }; diff --git a/src/shared/helpers/ServiceWorkerHelper.ts b/src/shared/helpers/ServiceWorkerHelper.ts index fa08d683a..ca898e9ac 100755 --- a/src/shared/helpers/ServiceWorkerHelper.ts +++ b/src/shared/helpers/ServiceWorkerHelper.ts @@ -248,11 +248,11 @@ export default class ServiceWorkerHelper { export enum ServiceWorkerActiveState { /** - * OneSignalSDK.sw.js, or the equivalent custom file name, is active. + * OneSignalSDKWorker.js, or the equivalent custom file name, is active. */ OneSignalWorker = 'OneSignal Worker', /** - * A service worker is active, but it is not OneSignalSDK.sw.js + * A service worker is active, but it is not OneSignalSDKWorker.js * (or the equivalent custom file names as provided by user config). */ ThirdParty = '3rd Party', @@ -270,7 +270,7 @@ export enum ServiceWorkerActiveState { export interface ServiceWorkerManagerConfig { /** - * The path and filename of the "main" worker (e.g. '/OneSignalSDK.sw.js'); + * The path and filename of the "main" worker (e.g. '/OneSignalSDKWorker.js'); */ workerPath: Path; /** diff --git a/src/shared/managers/SdkEnvironment.ts b/src/shared/managers/SdkEnvironment.ts index 16e4384f4..5361769b5 100644 --- a/src/shared/managers/SdkEnvironment.ts +++ b/src/shared/managers/SdkEnvironment.ts @@ -243,7 +243,7 @@ export default class SdkEnvironment { * service worker. * * For example, in staging the registered service worker filename is - * Staging-OneSignalSDK.sw.js. + * Staging-OneSignalSDKWorker.js. */ public static getBuildEnvPrefix(buildEnv: EnvironmentKind = SdkEnvironment.getBuildEnv()) : string { switch (buildEnv) { diff --git a/src/shared/managers/ServiceWorkerManager.ts b/src/shared/managers/ServiceWorkerManager.ts index 7df886c65..4b109d80b 100644 --- a/src/shared/managers/ServiceWorkerManager.ts +++ b/src/shared/managers/ServiceWorkerManager.ts @@ -353,7 +353,7 @@ export class ServiceWorkerManager { * We have a couple different models of installing service workers: * * a) Originally, we provided users with two worker files: - * OneSignalSDK.sw.js and OneSignalSDKUpdaterWorker.js. Two workers were + * OneSignalSDKWorker.js and OneSignalSDKUpdaterWorker.js. Two workers were * provided so each could be swapped with the other when the worker needed to * update. The contents of both workers were identical; only the filenames * were different, which is enough to update the worker. @@ -363,22 +363,22 @@ export class ServiceWorkerManager { * version as a query parameter. This is enough for the browser to detect a * change and re-install the worker. * - * b) With AMP web push, users specify the worker file OneSignalSDK.sw.js + * b) With AMP web push, users specify the worker file OneSignalSDKWorker.js * with an app ID parameter ?appId=12345. AMP web push * is vendor agnostic and doesn't know about OneSignal, so all relevant * information has to be passed to the service worker, which is the only * vendor-specific file. * * If AMP web push sees another worker like OneSignalSDKUpdaterWorker.js (deprecated), or - * even the same OneSignalSDK.sw.js without the app ID query parameter, the + * even the same OneSignalSDKWorker.js without the app ID query parameter, the * user is considered unsubscribed. * * c) Due to b's restriction, we must always install - * OneSignalSDK.sw.js?appId=xxx. We also have to appropriately handle the + * OneSignalSDKWorker.js?appId=xxx. We also have to appropriately handle the * legacy case: * * c-1) Where developers running progressive web apps force-register - * OneSignalSDK.sw.js + * OneSignalSDKWorker.js * * Actually, users can customize the file names of the Service Worker but * it's up to them to be consistent with their naming. For AMP web push, users From a53888c22703a6aa8decd1597bac5c22494f464e Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 5 May 2023 18:28:53 -0500 Subject: [PATCH 2/4] Fallback logic to support users who may have used OneSignalSDK.sw.js Motivation: in order to not break integrations who made use of the new filename, we should still continue to support it via a fallback mechanism --- src/shared/managers/ServiceWorkerManager.ts | 57 ++++++++++++++++++--- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/src/shared/managers/ServiceWorkerManager.ts b/src/shared/managers/ServiceWorkerManager.ts index 4b109d80b..2055be112 100644 --- a/src/shared/managers/ServiceWorkerManager.ts +++ b/src/shared/managers/ServiceWorkerManager.ts @@ -105,10 +105,16 @@ export class ServiceWorkerManager { // Check if the ServiceWorker file name is ours or a third party's private swActiveStateByFileName(fileName?: string | null): ServiceWorkerActiveState { - if (!fileName) + if (!fileName) { return ServiceWorkerActiveState.None; - if (fileName == this.config.workerPath.getFileName()) + } + const isValidOSWorker = + fileName == this.config.workerPath.getFileName() || + fileName == 'OneSignalSDK.sw.js'; // For backwards compatibility with temporary v16 user model beta filename (remove after 5/5/24 deprecation) + + if (isValidOSWorker) { return ServiceWorkerActiveState.OneSignalWorker; + } return ServiceWorkerActiveState.ThirdParty; } @@ -415,17 +421,54 @@ export class ServiceWorkerManager { // If we are inside the popup and service worker fails to register, it's not developer's fault. // No need to report it to the api then. const env = SdkEnvironment.getWindowEnv(); - if (env === WindowEnvironmentKind.OneSignalSubscriptionPopup) + if (env === WindowEnvironmentKind.OneSignalSubscriptionPopup) { throw error; + } + await this.fallbackToUserModelBetaWorker(); + } + Log.debug(`[Service Worker Installation] Service worker installed.`); + + await this.establishServiceWorkerChannel(); + } + + async fallbackToUserModelBetaWorker() { + const BETA_WORKER_NAME = 'OneSignalSDK.sw.js'; + + const configWithBetaWorkerName: ServiceWorkerManagerConfig = { + workerPath: new Path(`/${BETA_WORKER_NAME}`), + registrationOptions: this.config.registrationOptions, + }; + + const workerHref = ServiceWorkerHelper.getServiceWorkerHref( + configWithBetaWorkerName, + this.context.appConfig.appId, + Environment.version() + ); + + const scope = `${OneSignalUtils.getBaseUrl()}${this.config.registrationOptions.scope}`; + + Log.info(`[Service Worker Installation] Attempting to install v16 Beta Worker ${workerHref} ${scope}.`); + + try { + await navigator.serviceWorker.register(workerHref, { scope }); + + const DEPRECATION_ERROR = ` + [Service Worker Installation] Successfully installed v16 Beta Worker. + Deprecation warning: support for the v16 beta worker name of ${BETA_WORKER_NAME} + will be removed May 5 2024. We have decided to keep the v15 name. + To avoid breaking changes for your users, please host both worker files: + OneSignalSDK.sw.js & OneSignalSDKWorker.js. + `; + + Log.error(DEPRECATION_ERROR); + } catch (error) { const response = await fetch(workerHref); - if (response.status === 403 || response.status === 404) + if (response.status === 403 || response.status === 404) { throw new ServiceWorkerRegistrationError(response.status, response.statusText); + } throw error; } - Log.debug(`[Service Worker Installation] Service worker installed.`); - - await this.establishServiceWorkerChannel(); } } From 70cc33629d92d9db190e5d39780c09d61271becd Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 5 May 2023 18:29:04 -0500 Subject: [PATCH 3/4] Nit --- src/shared/libraries/WorkerMessenger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/libraries/WorkerMessenger.ts b/src/shared/libraries/WorkerMessenger.ts index fa60befb9..d73522488 100644 --- a/src/shared/libraries/WorkerMessenger.ts +++ b/src/shared/libraries/WorkerMessenger.ts @@ -147,7 +147,7 @@ export class WorkerMessenger { public async directPostMessageToSW(command: WorkerMessengerCommand, payload?: WorkerMessengerPayload): Promise { Log.debug(`[Worker Messenger] [Page -> SW] Direct command '${command.toString()}' to service worker.`); - const workerRegistration = await this.context.serviceWorkerManager.getRegistration(); + const workerRegistration = await this.context?.serviceWorkerManager.getRegistration(); if (!workerRegistration) { Log.error("`[Worker Messenger] [Page -> SW] Could not get ServiceWorkerRegistration to postMessage!"); return; From e97a5aa274a10e2246c6b75dcec8253e0392690d Mon Sep 17 00:00:00 2001 From: Rodrigo Gomez Palacio Date: Fri, 5 May 2023 18:29:40 -0500 Subject: [PATCH 4/4] Remove SW config from init options --- express_webpack/index.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/express_webpack/index.html b/express_webpack/index.html index 6c8836df7..0deaa662c 100644 --- a/express_webpack/index.html +++ b/express_webpack/index.html @@ -26,8 +26,6 @@ OneSignalDeferred.push(async function(onesignal) { await onesignal.init({ appId, - serviceWorkerParam: { scope: "/" + SERVICE_WORKER_PATH }, - serviceWorkerPath: SERVICE_WORKER_PATH + "OneSignalSDK.sw.js", notifyButton: { enable: true },