@rpcbase/client 0.471.0 → 0.473.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,7 @@
1
1
  export type BrowserNotificationInput = {
2
2
  title: string;
3
3
  options?: NotificationOptions;
4
- onClick?: () => void;
5
4
  };
6
5
  export declare const canShowBrowserNotification: () => boolean;
7
- export declare const showBrowserNotification: ({ title, options, onClick, }: BrowserNotificationInput) => Promise<boolean>;
6
+ export declare const showBrowserNotification: ({ title, options, }: BrowserNotificationInput) => Promise<boolean>;
8
7
  //# sourceMappingURL=browserNotifications.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browserNotifications.d.ts","sourceRoot":"","sources":["../src/browserNotifications.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,mBAAmB,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAiBD,eAAO,MAAM,0BAA0B,QAAO,OAI7C,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAU,8BAI3C,wBAAwB,KAAG,OAAO,CAAC,OAAO,CAoB5C,CAAA"}
1
+ {"version":3,"file":"browserNotifications.d.ts","sourceRoot":"","sources":["../src/browserNotifications.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,0BAA0B,QAAO,OAI7C,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAU,qBAG3C,wBAAwB,KAAG,OAAO,CAAC,OAAO,CAY5C,CAAA"}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export * from './components/SsrErrorFallback';
10
10
  export * from './components/RouteErrorBoundary';
11
11
  export * from './notifications';
12
12
  export * from './notificationsRealtime';
13
+ export * from './serviceWorker';
13
14
  export * from './errorReporting';
14
15
  export { STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, RtsSsrRuntimeProvider, clearHydratedRtsQueryData, consumeHydratedRtsCount, hydrateRtsFromWindow, peekHydratedRtsCount, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, type RtsSsrCountRegistration, type RtsSsrHydrationCountData, type RtsSsrHydrationQueryData, type RtsSsrQueryRegistration, type RtsSsrRuntime, type StaticRpcbaseRtsHydrationData, } from './rts/ssrHydration';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,OAAO,EACL,qCAAqC,EACrC,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EACL,qCAAqC,EACrC,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -589,6 +589,88 @@ var installGlobalNavigationGuard = (router) => {
589
589
  }
590
590
  };
591
591
  //#endregion
592
+ //#region src/serviceWorker.ts
593
+ var RPCBASE_SERVICE_WORKER_PATH = "/rpcbase-service-worker.js";
594
+ var RPCBASE_SERVICE_WORKER_SCOPE = "/";
595
+ var RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE = "@rpcbase/service-worker";
596
+ var SERVICE_WORKER_ACTIVATION_TIMEOUT_MS = 5e3;
597
+ var registrationPromise;
598
+ var registrationScheduled = false;
599
+ var waitForActiveRegistration = (registration) => {
600
+ const worker = registration.installing ?? registration.waiting;
601
+ if (!worker) return Promise.resolve(registration.active ? registration : null);
602
+ if (worker.state === "activated") return Promise.resolve(registration);
603
+ return new Promise((resolve) => {
604
+ let settled = false;
605
+ let timeoutId = 0;
606
+ const finish = (result) => {
607
+ if (settled) return;
608
+ settled = true;
609
+ window.clearTimeout(timeoutId);
610
+ worker.removeEventListener("statechange", handleStateChange);
611
+ resolve(result);
612
+ };
613
+ const handleStateChange = () => {
614
+ if (worker.state === "activated" || registration.active === worker) {
615
+ finish(registration);
616
+ return;
617
+ }
618
+ if (worker.state === "redundant") finish(null);
619
+ };
620
+ timeoutId = window.setTimeout(() => finish(null), SERVICE_WORKER_ACTIVATION_TIMEOUT_MS);
621
+ worker.addEventListener("statechange", handleStateChange);
622
+ handleStateChange();
623
+ });
624
+ };
625
+ var hasServiceWorkerSupport = () => typeof window !== "undefined" && typeof navigator !== "undefined" && typeof navigator.serviceWorker?.register === "function";
626
+ var registerRpcbaseServiceWorker = () => {
627
+ if (!hasServiceWorkerSupport()) return Promise.resolve(null);
628
+ if (registrationPromise) return registrationPromise;
629
+ registrationPromise = navigator.serviceWorker.register(RPCBASE_SERVICE_WORKER_PATH, { scope: "/" }).then(waitForActiveRegistration).catch(() => null).then((registration) => {
630
+ if (!registration) registrationPromise = void 0;
631
+ return registration;
632
+ });
633
+ return registrationPromise;
634
+ };
635
+ var scheduleRpcbaseServiceWorkerRegistration = () => {
636
+ if (!hasServiceWorkerSupport() || registrationScheduled) return;
637
+ registrationScheduled = true;
638
+ const register = () => {
639
+ registerRpcbaseServiceWorker();
640
+ };
641
+ if (document.readyState === "complete") {
642
+ window.setTimeout(register, 0);
643
+ return;
644
+ }
645
+ window.addEventListener("load", register, { once: true });
646
+ };
647
+ var sendRpcbaseServiceWorkerMessage = async (type, payload) => {
648
+ const normalizedType = type.trim();
649
+ if (!normalizedType) return false;
650
+ const registration = await registerRpcbaseServiceWorker();
651
+ const worker = registration?.active ?? registration?.waiting ?? registration?.installing;
652
+ if (!worker) return false;
653
+ const message = {
654
+ source: RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE,
655
+ type: normalizedType,
656
+ ...payload === void 0 ? {} : { payload }
657
+ };
658
+ worker.postMessage(message);
659
+ return true;
660
+ };
661
+ var subscribeRpcbaseServiceWorkerMessages = (type, listener) => {
662
+ const serviceWorker = typeof navigator === "undefined" ? void 0 : navigator.serviceWorker;
663
+ if (!serviceWorker || typeof serviceWorker.addEventListener !== "function") return () => void 0;
664
+ const handleMessage = (event) => {
665
+ if (!event.data || typeof event.data !== "object") return;
666
+ const message = event.data;
667
+ if (message.source !== "@rpcbase/service-worker" || message.type !== type) return;
668
+ listener(message.payload, message);
669
+ };
670
+ serviceWorker.addEventListener("message", handleMessage);
671
+ return () => serviceWorker.removeEventListener("message", handleMessage);
672
+ };
673
+ //#endregion
592
674
  //#region src/ssrErrorState.ts
593
675
  var SSR_ERROR_STATE_GLOBAL_KEY = "__RPCBASE_SSR_ERROR__";
594
676
  var ESCAPED_LT = /</g;
@@ -839,6 +921,7 @@ var ClientOnly = (t0) => {
839
921
  };
840
922
  var initWithRoutes = async (routesElement, opts) => {
841
923
  const rootElement = getRootElement();
924
+ scheduleRpcbaseServiceWorkerRegistration();
842
925
  if (hydrateSsrFallbackIfPresent(rootElement, opts?.renderErrorExtra)) return;
843
926
  await initApiClient();
844
927
  cleanupURL();
@@ -2231,38 +2314,20 @@ var runNotificationDigest = async ({ force = false } = {}) => {
2231
2314
  };
2232
2315
  //#endregion
2233
2316
  //#region src/browserNotifications.ts
2234
- var getActiveServiceWorkerRegistration = async () => {
2235
- if (typeof navigator === "undefined") return null;
2236
- const serviceWorker = navigator.serviceWorker;
2237
- if (!serviceWorker || typeof serviceWorker.getRegistration !== "function") return null;
2238
- try {
2239
- const registration = await serviceWorker.getRegistration();
2240
- if (!registration?.active) return null;
2241
- return typeof registration.showNotification === "function" ? registration : null;
2242
- } catch {
2243
- return null;
2244
- }
2245
- };
2246
2317
  var canShowBrowserNotification = () => {
2247
2318
  if (typeof window === "undefined") return false;
2248
2319
  if (!("Notification" in window)) return false;
2249
2320
  return window.Notification.permission === "granted";
2250
2321
  };
2251
- var showBrowserNotification = async ({ title, options, onClick }) => {
2322
+ var showBrowserNotification = async ({ title, options }) => {
2252
2323
  if (!canShowBrowserNotification()) return false;
2324
+ const registration = await registerRpcbaseServiceWorker();
2325
+ if (typeof registration?.showNotification !== "function") return false;
2253
2326
  try {
2254
- const browserNotification = new window.Notification(title, options);
2255
- if (onClick) browserNotification.onclick = onClick;
2327
+ await registration.showNotification(title, options);
2256
2328
  return true;
2257
2329
  } catch {
2258
- const registration = await getActiveServiceWorkerRegistration();
2259
- if (!registration) return false;
2260
- try {
2261
- await registration.showNotification(title, options);
2262
- return true;
2263
- } catch {
2264
- return false;
2265
- }
2330
+ return false;
2266
2331
  }
2267
2332
  };
2268
2333
  //#endregion
@@ -2784,10 +2849,6 @@ var sortNotificationsByCreatedAt = (items) => [...items].sort((a, b) => {
2784
2849
  const bMs = Date.parse(b.createdAt);
2785
2850
  return (Number.isFinite(aMs) ? aMs : 0) - (Number.isFinite(bMs) ? bMs : 0);
2786
2851
  });
2787
- var focusNotificationAction = (action) => {
2788
- window.focus();
2789
- if (action) applyNotificationAction(action);
2790
- };
2791
2852
  var getNativeNotificationOptions = (item) => {
2792
2853
  const action = getNotificationAction(item);
2793
2854
  return {
@@ -2803,11 +2864,9 @@ var getNativeNotificationOptions = (item) => {
2803
2864
  };
2804
2865
  };
2805
2866
  var showNativeNotification = async (item) => {
2806
- const action = getNotificationAction(item);
2807
2867
  return showBrowserNotification({
2808
2868
  title: item.title,
2809
- options: getNativeNotificationOptions(item),
2810
- onClick: () => focusNotificationAction(action)
2869
+ options: getNativeNotificationOptions(item)
2811
2870
  });
2812
2871
  };
2813
2872
  var showNativeNotifications = async (items) => {
@@ -2817,8 +2876,7 @@ var showNativeNotifications = async (items) => {
2817
2876
  options: {
2818
2877
  body: "Open the notifications drawer to view them.",
2819
2878
  tag: `${NATIVE_NOTIFICATION_TAG_PREFIX}:summary`
2820
- },
2821
- onClick: () => focusNotificationAction(null)
2879
+ }
2822
2880
  }) ? items : [];
2823
2881
  const shownItems = [];
2824
2882
  for (const item of items) if (await showNativeNotification(item)) shownItems.push(item);
@@ -3285,6 +3343,6 @@ var useNotificationsRealtime = () => {
3285
3343
  return useContext(NotificationsRealtimeContext);
3286
3344
  };
3287
3345
  //#endregion
3288
- export { NotificationsRealtimeContext, NotificationsRealtimeProvider, RootProvider, RouteErrorBoundary, RtsSsrRuntimeProvider, SSR_ERROR_STATE_GLOBAL_KEY, STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, SsrErrorFallback, apiClient, archiveNotification, clearHydratedRtsQueryData, consumeClientSsrErrorState, consumeHydratedRtsCount, getFeatureFlag, getNotificationSettings, hydrateRtsFromWindow, initApiClient, initWithRoutes, listNotifications, markAllNotificationsRead, markNotificationRead, markNotificationsReadByUrl, peekClientSsrErrorState, peekHydratedRtsCount, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, reportClientException, runNotificationDigest, serializeSsrErrorState, setClientExceptionReporter, toast, updateNotificationSettings, useMediaQuery, useNotificationsRealtime, useThrottledMeasure };
3346
+ export { NotificationsRealtimeContext, NotificationsRealtimeProvider, RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE, RPCBASE_SERVICE_WORKER_PATH, RPCBASE_SERVICE_WORKER_SCOPE, RootProvider, RouteErrorBoundary, RtsSsrRuntimeProvider, SSR_ERROR_STATE_GLOBAL_KEY, STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY, SsrErrorFallback, apiClient, archiveNotification, clearHydratedRtsQueryData, consumeClientSsrErrorState, consumeHydratedRtsCount, getFeatureFlag, getNotificationSettings, hydrateRtsFromWindow, initApiClient, initWithRoutes, listNotifications, markAllNotificationsRead, markNotificationRead, markNotificationsReadByUrl, peekClientSsrErrorState, peekHydratedRtsCount, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, registerRpcbaseServiceWorker, reportClientException, runNotificationDigest, scheduleRpcbaseServiceWorkerRegistration, sendRpcbaseServiceWorkerMessage, serializeSsrErrorState, setClientExceptionReporter, subscribeRpcbaseServiceWorkerMessages, toast, updateNotificationSettings, useMediaQuery, useNotificationsRealtime, useThrottledMeasure };
3289
3347
 
3290
3348
  //# sourceMappingURL=index.js.map