react-broadcast-sync 1.6.0 → 1.9.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.
Files changed (53) hide show
  1. package/README.md +83 -13
  2. package/dist/BroadcastProvider.d.ts +2 -1
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.esm.js +1 -1
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/types/types.d.ts +17 -0
  8. package/package.json +6 -1
  9. package/.eslintignore +0 -5
  10. package/.github/workflows/ci.yml +0 -61
  11. package/.github/workflows/release.yml +0 -39
  12. package/.husky/pre-commit +0 -5
  13. package/.nvmrc +0 -1
  14. package/.prettierignore +0 -4
  15. package/.prettierrc +0 -9
  16. package/.releaserc.json +0 -22
  17. package/CHANGELOG.md +0 -97
  18. package/assets/react-broadcast-sync-logo.png +0 -0
  19. package/commitlint.config.js +0 -3
  20. package/demo/react-broadcast-sync-demo/README.md +0 -130
  21. package/demo/react-broadcast-sync-demo/index.html +0 -14
  22. package/demo/react-broadcast-sync-demo/package-lock.json +0 -6379
  23. package/demo/react-broadcast-sync-demo/package.json +0 -42
  24. package/demo/react-broadcast-sync-demo/public/assets/react-broadcast-sync-demo-video.gif +0 -0
  25. package/demo/react-broadcast-sync-demo/public/assets/react-broadcast-sync-logo.png +0 -0
  26. package/demo/react-broadcast-sync-demo/src/App.tsx +0 -277
  27. package/demo/react-broadcast-sync-demo/src/components/Counter.tsx +0 -63
  28. package/demo/react-broadcast-sync-demo/src/components/TextSync.tsx +0 -61
  29. package/demo/react-broadcast-sync-demo/src/components/TodoList.tsx +0 -186
  30. package/demo/react-broadcast-sync-demo/src/hooks/useCounterBroadcast.ts +0 -96
  31. package/demo/react-broadcast-sync-demo/src/hooks/useTextBroadcast.ts +0 -37
  32. package/demo/react-broadcast-sync-demo/src/hooks/useTodoBroadcast.ts +0 -249
  33. package/demo/react-broadcast-sync-demo/src/main.tsx +0 -11
  34. package/demo/react-broadcast-sync-demo/src/theme.ts +0 -62
  35. package/demo/react-broadcast-sync-demo/tsconfig.json +0 -26
  36. package/demo/react-broadcast-sync-demo/tsconfig.node.json +0 -10
  37. package/demo/react-broadcast-sync-demo/vite.config.ts +0 -12
  38. package/eslint.config.js +0 -38
  39. package/jest.config.cjs +0 -9
  40. package/jest.setup.ts +0 -1
  41. package/rollup.config.mjs +0 -98
  42. package/src/BroadcastProvider.tsx +0 -28
  43. package/src/hooks/useBroadcastChannel.ts +0 -513
  44. package/src/index.ts +0 -9
  45. package/src/tests/BroadcastProvider.test.tsx +0 -157
  46. package/src/tests/debug.test.ts +0 -273
  47. package/src/tests/messageUtils.test.ts +0 -252
  48. package/src/tests/useBroadcastChannel.same-tab.test.tsx +0 -992
  49. package/src/tests/useBroadcastChannel.test.tsx +0 -1243
  50. package/src/types/types.ts +0 -124
  51. package/src/utils/debug.ts +0 -80
  52. package/src/utils/messageUtils.ts +0 -122
  53. package/tsconfig.json +0 -36
package/README.md CHANGED
@@ -69,8 +69,9 @@ Easily sync UI state or user events across browser tabs in React apps — notifi
69
69
  - Namespace and source scoping support
70
70
  - Clear individual or all messages
71
71
  - Only accept allowed message types (optional)
72
- - `BroadcastProvider` for context-based usage
72
+ - `BroadcastProvider` for context-based usage with full options support
73
73
  - **Ping and active source detection** (discover other tabs and their source names)
74
+ - **Per-type `onMessage` callbacks** (react to incoming messages without polling state)
74
75
 
75
76
  ## Demo App
76
77
 
@@ -199,6 +200,31 @@ function NotificationBar() {
199
200
  }
200
201
  ```
201
202
 
203
+ #### `BroadcastProvider` Props
204
+
205
+ | Prop | Type | Required | Description |
206
+ |------|------|----------|-------------|
207
+ | `channelName` | `string` | ✅ | The name of the broadcast channel |
208
+ | `options` | `BroadcastOptions` | ❌ | Any option accepted by `useBroadcastChannel` |
209
+ | `children` | `React.ReactNode` | ✅ | Component subtree |
210
+
211
+ All fields in `BroadcastOptions` (see the table in the [API Reference](#broadcastoptions)) can be forwarded via the `options` prop. This includes `namespace`, `registeredTypes`, `onMessage`, `keepLatestMessage`, `sourceName`, and more.
212
+
213
+ ```tsx
214
+ <BroadcastProvider
215
+ channelName="notifications"
216
+ options={{
217
+ namespace: 'v2',
218
+ registeredTypes: ['alert', 'info'],
219
+ onMessage: {
220
+ alert: (msg) => showToast(msg.message.text),
221
+ },
222
+ }}
223
+ >
224
+ <App />
225
+ </BroadcastProvider>
226
+ ```
227
+
202
228
  ---
203
229
 
204
230
  ## API Reference
@@ -230,6 +256,7 @@ interface BroadcastOptions {
230
256
  cleanupDebounceMs?: number; // Debounce time in ms for cleanup operations (default: 0)
231
257
  batchingDelayMs?: number; // Delay in ms to batch outgoing messages (default: 20). If > 0, messages are batched and sent together.
232
258
  excludedBatchMessageTypes?: string[]; // Message types to always send immediately, never batched (default: []).
259
+ onMessage?: MessageCallback | OnMessageMap; // Callback(s) fired when a received message passes all filters (default: undefined).
233
260
  }
234
261
  ```
235
262
 
@@ -242,10 +269,11 @@ interface BroadcastOptions {
242
269
  | `keepLatestMessage` | `false` | Keep all messages by default |
243
270
  | `registeredTypes` | `[]` | Accept all message types by default |
244
271
  | `namespace` | `''` | No namespace by default |
245
- | `deduplicationTTL` | `300000` | 5 minutes (5 _ 60 _ 1000 ms) |
272
+ | `deduplicationTTL` | `300000` | 5 minutes (5 × 60 × 1000 ms) |
246
273
  | `cleanupDebounceMs` | `0` | No debounce by default |
247
274
  | `batchingDelayMs` | `20` | Batch delay in ms (0 = off) |
248
275
  | `excludedBatchMessageTypes` | `[]` | Types never batched |
276
+ | `onMessage` | `undefined` | Callback(s) for received messages |
249
277
 
250
278
  #### Return Value
251
279
 
@@ -408,6 +436,53 @@ closeChannel();
408
436
 
409
437
  ---
410
438
 
439
+ #### `onMessage` Callbacks
440
+
441
+ `onMessage` lets you react to incoming messages imperatively — without polling `messages` state or using `useEffect`. The callback fires after the message is added to state and only for messages that pass all active filters (`registeredTypes`, expiry, deduplication, self-filter). Internal protocol messages (PING, PONG, CLEAR_SENT_MESSAGES) never trigger it.
442
+
443
+ **Two supported shapes:**
444
+
445
+ ```ts
446
+ // 1. A single catch-all function — fires for every accepted message type
447
+ type MessageCallback = (msg: BroadcastMessage) => void;
448
+
449
+ // 2. A map from message type → one handler function
450
+ type OnMessageMap = { [type: string]: (msg: BroadcastMessage) => void };
451
+ ```
452
+
453
+ **Catch-all example:**
454
+
455
+ ```tsx
456
+ const { postMessage } = useBroadcastChannel('my-channel', {
457
+ onMessage: msg => {
458
+ console.log('received', msg.type, msg.message);
459
+ },
460
+ });
461
+ ```
462
+
463
+ **Per-type map example:**
464
+
465
+ ```tsx
466
+ useBroadcastChannel('my-channel', {
467
+ onMessage: {
468
+ error: msg => showToast(`Error: ${msg.message.text}`),
469
+ success: msg => celebrate(),
470
+ log: msg => console.log('[log]', msg.message),
471
+ },
472
+ });
473
+ ```
474
+
475
+ **Behavior:**
476
+
477
+ - Fires for messages from **other** tabs only — self-messages are always ignored before this point.
478
+ - Fires **after** `messages` state is updated — both the callback argument and `messages[messages.length - 1]` will be the same object.
479
+ - A type not listed in the map causes no error — it is silently skipped.
480
+ - If the callback throws, the error is caught and debug-logged. Message state is **not** affected.
481
+ - Changing `onMessage` between renders is safe — the latest callback is always used with no stale closure risk.
482
+ - Works with batched messages: each message in a batch triggers its own callback call.
483
+
484
+ ---
485
+
411
486
  ## Best Practices
412
487
 
413
488
  - **Use `namespace`** to isolate functionality between different app modules.
@@ -416,6 +491,7 @@ closeChannel();
416
491
  - **Use `keepLatestMessage: true`** if you only care about the most recent message (e.g. status updates).
417
492
  - **Set appropriate `deduplicationTTL`** based on your message frequency and importance.
418
493
  - **Use `cleanupDebounceMs`** when dealing with rapid message updates to prevent performance issues.
494
+ - **Use `onMessage`** for imperative side-effects (toasts, analytics, logging) rather than `useEffect` on `messages` — it fires exactly once per accepted message, with no extra renders required.
419
495
 
420
496
  ## Common Use Cases
421
497
 
@@ -657,20 +733,14 @@ Relies on [BroadcastChannel API](https://developer.mozilla.org/en-US/docs/Web/AP
657
733
 
658
734
  We're actively improving `react-broadcast-sync`! Here are some features and enhancements planned for upcoming versions:
659
735
 
660
- - **Integration Tests**
661
- Ensure robust behavior and edge-case coverage.
662
-
663
736
  - **Automatic Channel Recovery**
664
- Reconnect automatically if the `BroadcastChannel` gets disconnected or closed by the browser.
737
+ Reconnect automatically if the `BroadcastChannel` gets disconnected or closed by the browser, with configurable retry delay and attempt cap.
665
738
 
666
- - **`clearMessagesByType()`**
667
- Clear all messages of a specific type with a single call.
739
+ - **Cross-tab History (`withHistory`)**
740
+ On connect, a new tab can request recent message history from already-open tabs. Includes chunked transfer, expiry filtering, and deduplication to prevent replaying stale or duplicate messages.
668
741
 
669
- - **Per-Type Callbacks**
670
- Define message handlers for specific types with `onMessage({ type, callback })`.
671
-
672
- - **`clearAllSentMessages()` / `clearAllReceivedMessages()`**
673
- Fine-grained control for clearing messages based on source.
742
+ - **Integration Tests**
743
+ Real browser cross-tab tests using Playwright that go beyond what jsdom mocks can cover.
674
744
 
675
745
  We're committed to keeping this package lightweight, flexible, and production-ready.
676
746
  Your feedback and contributions are welcome — feel free to [open an issue](https://github.com/IdanShalem/react-broadcast-sync/issues)!
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
- import { BroadcastActions } from './types/types';
2
+ import { BroadcastActions, BroadcastOptions } from './types/types';
3
3
  interface BroadcastProviderProps {
4
4
  channelName: string;
5
+ options?: BroadcastOptions;
5
6
  children: React.ReactNode;
6
7
  }
7
8
  export declare const BroadcastProvider: React.FC<BroadcastProviderProps>;
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),r=require("react/jsx-runtime");const t="__INTERNAL__",n=()=>Math.random().toString(36).substr(2,9),s=(e,r)=>{const t=`${n()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},a=e=>!!e.expirationDate&&e.expirationDate<Date.now(),o=(e,r,t,n={})=>{var a;const o=Date.now();return{id:s(t,o),type:e,message:r,timestamp:o,source:t,expirationDate:null!==(a=n.expirationDate)&&void 0!==a?a:n.expirationDuration?o+n.expirationDuration:void 0}},c=(e,r,n="")=>{const s=btoa(`react-broadcast-sync:${e}:${`${r}-${n}`}`);return`${t}:${e}:${s}`},l=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${t}:`)&&"string"==typeof e.source,i=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const n=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(n,r,t||"");break;case"warn":console.warn(n,r,t||"");break;case"error":console.error(n,r,t||"")}},u={created:e=>i("info","Channel created:",e),closed:e=>i("info","Channel closed:",e)},d={sent:e=>i("info","Message sent:",e),received:e=>i("info","Message received:",e),cleared:e=>i("info","Message cleared:",e),expired:e=>i("info","Message expired:",e),duplicate:e=>i("warn","Duplicate message ignored:",e),allSentCleared:()=>i("info","All sent messages cleared"),allReceivedCleared:()=>i("info","All received messages cleared"),ignored:e=>i("info","Message ignored due to type filter:",e)},p={inProgress:()=>i("warn","Ping already in progress. Skipping call.")},g={started:()=>i("info","Cleanup started"),completed:e=>i("info","Cleanup completed:",e)},f=e=>{const{action:r,channelName:t,type:n,source:s,originalError:a}=e;let o=`${r}`;if(t&&(o+=` | channel: ${t}`),n&&(o+=` | type: ${n}`),s&&(o+=` | source: ${s}`),a instanceof Error)o+=` | cause: ${a.message}`;else if("string"==typeof a)o+=` | cause: ${a}`;else if(null!=a)try{o+=` | cause: ${JSON.stringify(a)}`}catch(e){o+=" | cause: [unserializable]"}i("error","Error:",o)},h="CLEAR_SENT_MESSAGES",y="PING",m="PONG";let v;if("test"===process.env.NODE_ENV)try{v=require("react-dom").flushSync}catch(e){}const E=(r,t={})=>{const{sourceName:s,cleaningInterval:i=1e3,keepLatestMessage:E=!1,registeredTypes:C=[],namespace:b="",deduplicationTTL:M=3e5,cleanupDebounceMs:S=0,batchingDelayMs:N=20,excludedBatchMessageTypes:P=[]}=t,[w,$]=e.useState([]),[T,B]=e.useState([]),[A,x]=e.useState(null),[D,R]=e.useState(!1),k=e.useRef(null),_=e.useRef(new Map),G=e.useRef(null),I=e.useRef(null),L=e.useRef([]),O=e.useRef(!1),j=e.useMemo((()=>s||`tab-${n()}`),[s]),F=e.useMemo((()=>({CLEAR_SENT_MESSAGES:c(h,r,b),PING:c(y,r,b),PONG:c(m,r,b)})),[r,b]),q=e.useMemo((()=>b?`${r}-${b}`:r),[r,b]),J=e.useMemo((()=>C),[JSON.stringify(C)]),z=e.useCallback((()=>{$((e=>e.filter((e=>!a(e)))))}),[]),U=e.useRef(S>0?((e,r)=>{let t,n=null,s=null;const a=(...a)=>{s=a,null!==n&&clearTimeout(n),n=setTimeout((()=>{n=null,null!==s&&(t=e(...s),s=null)}),r)};return a.cancel=()=>{null!==n&&(clearTimeout(n),n=null,s=null)},a.flush=()=>(null!==n&&(clearTimeout(n),n=null,null!==s&&(t=e(...s),s=null)),t),a})(z,S):Object.assign(z,{cancel:()=>{}})).current,V=e.useCallback((e=>{x(e),setTimeout((()=>x(null)),3e3)}),[]),W=e.useCallback(((e=300)=>{if(D)return p.inProgress(),Promise.resolve([]);if(!k.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"ping",channelName:q,originalError:e}),V(e),Promise.resolve([])}v?v((()=>R(!0))):R(!0);const r=new Set;return G.current=r,k.current.postMessage(o(F.PING,null,j)),new Promise((t=>{setTimeout((()=>{R(!1),G.current===r&&(G.current=null),t(Array.from(r))}),e)}))}),[F.PING,j,V,D,v]),H=e.useCallback(((e,r,t={})=>{const n=k.current;if(!n){const r="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"postMessage",channelName:q,type:e,originalError:r}),void V(r)}const s=o(e,r,j,t);if(!N||N<0||P.includes(e))try{n.postMessage(s)}catch(r){const t="Failed to send message";f({action:"postMessage",channelName:q,type:e,originalError:t}),V(t),O.current=!0}else L.current.push(s),I.current||(I.current=setTimeout((()=>{if(O.current)return L.current=[],void(I.current=null);try{n.postMessage(L.current)}catch(r){const t="Failed to send message";f({action:"postMessage",channelName:q,type:e,originalError:t}),V(t),O.current=!0}L.current=[],I.current=null}),N));d.sent(s),B((e=>[...e,s]))}),[j,V,N,P]),K=e.useCallback(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);$((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[])),r||d.allReceivedCleared()}),[]),Q=e.useCallback(((e={})=>{var r,t,n;const{ids:s=[],types:a=[],sync:c=!1}=null!=e?e:{};B((e=>s.length>0||a.length>0?e.filter((e=>{if(e.source!==j)return!0;const r=0===s.length||s.includes(e.id),t=0===a.length||a.includes(e.type);return!(r&&t)})):[])),0===s.length&&0===a.length&&d.allSentCleared(),c&&(null===(r=k.current)||void 0===r||r.postMessage(o(F.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},j)))}),[]),X=e.useCallback(((e={})=>{const{source:r,type:t}=e;for(let e=w.length-1;e>=0;e--){const n=w[e],s=!r||n.source===r,a=!t||n.type===t;if(s&&a)return n}return null}),[w]),Y=e.useCallback((e=>{var r;try{const t=e.data;if(d.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===j)return;if(l(t)){if(t.type===F.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void $((n=>[...n.filter((n=>{if(n.source!==t.source)return!0;const s=0===e.length||e.includes(n.id),a=0===r.length||r.includes(n.type);return!(s&&a)}))]))}if(t.type===F.PING)return void(null===(r=k.current)||void 0===r||r.postMessage(o(F.PONG,null,j)));if(t.type===F.PONG){const e=t.source,r=G.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(J.length>0&&!J.includes(t.type))return void d.ignored(t.type);if(a(t))return void d.expired(t.id);const n=Date.now(),s=_.current.get(t.id);if(s&&n-s<M)return void d.duplicate(t.id);_.current.set(t.id,n),$((e=>E?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";f({action:"handleMessage",channelName:q,originalError:r}),V(r)}}),[j,J,E,V,F,M]),Z=e.useCallback((()=>{const e=k.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",Y),e.close(),u.closed(q),k.current=null)}),[Y,q]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"useBroadcastChannel",channelName:q,originalError:e}),void V(e)}let e=null;try{e=new BroadcastChannel(q)}catch(e){const r="Failed to create BroadcastChannel";return f({action:"useBroadcastChannel",channelName:q,originalError:e instanceof Error?e:String(e)}),void V(r)}return k.current=e,u.created(q),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{Y({data:e})})):Y(e)})),()=>{Z()}}),[q,Y,V]),e.useEffect((()=>{if(i<=0)return;const e=setInterval((()=>{g.started();const e=w.length;U(),g.completed(e-w.length)}),i);return()=>{var r;clearInterval(e),S>0&&(null===(r=U.cancel)||void 0===r||r.call(U))}}),[i,U,S]),e.useEffect((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of _.current.entries())e-t>=M&&_.current.delete(r)}),6e4);return()=>clearInterval(e)}),[M]),e.useEffect((()=>()=>{if(L.current.length>0&&k.current&&!O.current){try{k.current.postMessage(L.current)}catch(e){const r="Failed to send message";f({action:"useBroadcastChannel",channelName:q,originalError:e instanceof Error?e:String(e)}),V(r)}L.current=[],setTimeout((()=>{}),0)}I.current&&(clearTimeout(I.current),I.current=null),O.current=!1}),[]),{channelName:q,messages:w,sentMessages:T,isPingInProgress:D,ping:W,postMessage:H,clearReceivedMessages:K,clearSentMessages:Q,getLatestMessage:X,error:A,closeChannel:Z}},C=e.createContext(void 0);exports.BroadcastProvider=({children:e,channelName:t})=>{const n=E(t);return r.jsx(C.Provider,{value:n,children:e})},exports.useBroadcastChannel=E,exports.useBroadcastProvider=()=>{const r=e.useContext(C);if(!r)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return r};
1
+ "use strict";var e=require("react"),r=require("react/jsx-runtime");const t="__INTERNAL__",n=()=>Math.random().toString(36).substr(2,9),s=(e,r)=>{const t=`${n()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},a=e=>!!e.expirationDate&&e.expirationDate<Date.now(),o=(e,r,t,n={})=>{var a;const o=Date.now();return{id:s(t,o),type:e,message:r,timestamp:o,source:t,expirationDate:null!==(a=n.expirationDate)&&void 0!==a?a:n.expirationDuration?o+n.expirationDuration:void 0}},c=(e,r,n="")=>{const s=btoa(`react-broadcast-sync:${e}:${`${r}-${n}`}`);return`${t}:${e}:${s}`},l=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${t}:`)&&"string"==typeof e.source,i=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const n=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(n,r,t||"");break;case"warn":console.warn(n,r,t||"");break;case"error":console.error(n,r,t||"")}},u={created:e=>i("info","Channel created:",e),closed:e=>i("info","Channel closed:",e)},d={sent:e=>i("info","Message sent:",e),received:e=>i("info","Message received:",e),cleared:e=>i("info","Message cleared:",e),expired:e=>i("info","Message expired:",e),duplicate:e=>i("warn","Duplicate message ignored:",e),allSentCleared:()=>i("info","All sent messages cleared"),allReceivedCleared:()=>i("info","All received messages cleared"),ignored:e=>i("info","Message ignored due to type filter:",e)},p={inProgress:()=>i("warn","Ping already in progress. Skipping call.")},g={started:()=>i("info","Cleanup started"),completed:e=>i("info","Cleanup completed:",e)},f=e=>{const{action:r,channelName:t,type:n,source:s,originalError:a}=e;let o=`${r}`;if(t&&(o+=` | channel: ${t}`),n&&(o+=` | type: ${n}`),s&&(o+=` | source: ${s}`),a instanceof Error)o+=` | cause: ${a.message}`;else if("string"==typeof a)o+=` | cause: ${a}`;else if(null!=a)try{o+=` | cause: ${JSON.stringify(a)}`}catch(e){o+=" | cause: [unserializable]"}i("error","Error:",o)},h="CLEAR_SENT_MESSAGES",y="PING",m="PONG";let v;if("test"===process.env.NODE_ENV)try{v=require("react-dom").flushSync}catch(e){}const E=(r,t={})=>{const{sourceName:s,cleaningInterval:i=1e3,keepLatestMessage:E=!1,registeredTypes:S=[],namespace:C="",deduplicationTTL:M=3e5,cleanupDebounceMs:b=0,batchingDelayMs:N=20,excludedBatchMessageTypes:P=[],onMessage:w}=t,[$,T]=e.useState([]),[A,R]=e.useState([]),[B,_]=e.useState(null),[x,D]=e.useState(!1),k=e.useRef(null),G=e.useRef(new Map),I=e.useRef(null),L=e.useRef(null),O=e.useRef([]),j=e.useRef(!1),F=e.useRef(w);F.current=w;const q=e.useMemo((()=>s||`tab-${n()}`),[s]),z=e.useMemo((()=>({CLEAR_SENT_MESSAGES:c(h,r,C),PING:c(y,r,C),PONG:c(m,r,C)})),[r,C]),J=e.useMemo((()=>C?`${r}-${C}`:r),[r,C]),U=e.useRef(S);U.current=S;const V=e.useCallback((()=>{T((e=>e.filter((e=>!a(e)))))}),[]),W=e.useRef(b>0?((e,r)=>{let t,n=null,s=null;const a=(...a)=>{s=a,null!==n&&clearTimeout(n),n=setTimeout((()=>{n=null,null!==s&&(t=e(...s),s=null)}),r)};return a.cancel=()=>{null!==n&&(clearTimeout(n),n=null,s=null)},a.flush=()=>(null!==n&&(clearTimeout(n),n=null,null!==s&&(t=e(...s),s=null)),t),a})(V,b):Object.assign(V,{cancel:()=>{}})).current,H=e.useCallback((e=>{_(e),setTimeout((()=>_(null)),3e3)}),[]),K=e.useCallback(((e=300)=>{if(x)return p.inProgress(),Promise.resolve([]);if(!k.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"ping",channelName:J,originalError:e}),H(e),Promise.resolve([])}v?v((()=>D(!0))):D(!0);const r=new Set;return I.current=r,k.current.postMessage(o(z.PING,null,q)),new Promise((t=>{setTimeout((()=>{D(!1),I.current===r&&(I.current=null),t(Array.from(r))}),e)}))}),[z.PING,q,H,x,v]),Q=e.useCallback(((e,r,t={})=>{const n=k.current;if(!n){const r="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"postMessage",channelName:J,type:e,originalError:r}),void H(r)}const s=o(e,r,q,t);if(!N||N<0||P.includes(e))try{n.postMessage(s)}catch(r){const t="Failed to send message";f({action:"postMessage",channelName:J,type:e,originalError:t}),H(t),j.current=!0}else O.current.push(s),L.current||(L.current=setTimeout((()=>{if(j.current)return O.current=[],void(L.current=null);try{n.postMessage(O.current)}catch(r){const t="Failed to send message";f({action:"postMessage",channelName:J,type:e,originalError:t}),H(t),j.current=!0}O.current=[],L.current=null}),N));d.sent(s),R((e=>[...e,s]))}),[q,H,N,P]),X=e.useCallback(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);T((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[])),r||d.allReceivedCleared()}),[]),Y=e.useCallback(((e={})=>{var r,t,n;const{ids:s=[],types:a=[],sync:c=!1}=null!=e?e:{};R((e=>s.length>0||a.length>0?e.filter((e=>{if(e.source!==q)return!0;const r=0===s.length||s.includes(e.id),t=0===a.length||a.includes(e.type);return!(r&&t)})):[])),0===s.length&&0===a.length&&d.allSentCleared(),c&&(null===(r=k.current)||void 0===r||r.postMessage(o(z.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},q)))}),[q,z.CLEAR_SENT_MESSAGES]),Z=e.useCallback(((e={})=>{const{source:r,type:t}=e;for(let e=$.length-1;e>=0;e--){const n=$[e],s=!r||n.source===r,a=!t||n.type===t;if(s&&a)return n}return null}),[$]),ee=e.useCallback((e=>{var r,t;try{const n=e.data;if(d.received(n),!(e=>Boolean(e&&"object"==typeof e&&"string"==typeof e.id&&"string"==typeof e.type&&"string"==typeof e.source&&"number"==typeof e.timestamp))(n))return;if(n.source===q)return;if(l(n)){if(n.type===z.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=n.message||{};return void T((t=>[...t.filter((t=>{if(t.source!==n.source)return!0;const s=0===e.length||e.includes(t.id),a=0===r.length||r.includes(t.type);return!(s&&a)}))]))}if(n.type===z.PING)return void(null===(r=k.current)||void 0===r||r.postMessage(o(z.PONG,null,q)));if(n.type===z.PONG){const e=n.source,r=I.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(U.current.length>0&&!U.current.includes(n.type))return void d.ignored(n.type);if(a(n))return void d.expired(n.id);const s=Date.now(),c=G.current.get(n.id);if(c&&s-c<M)return void d.duplicate(n.id);G.current.set(n.id,s),T((e=>E?[n]:[...e,n]));try{const e=F.current;"function"==typeof e?e(n):e&&(null===(t=e[n.type])||void 0===t||t.call(e,n))}catch(e){f({action:"onMessage",channelName:J,originalError:e instanceof Error?e.message:String(e)})}}catch(e){const r="Error processing broadcast message";f({action:"handleMessage",channelName:J,originalError:r}),H(r)}}),[q,E,H,z,M]),re=e.useCallback((()=>{const e=k.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",ee),e.close(),u.closed(J),k.current=null)}),[ee,J]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"useBroadcastChannel",channelName:J,originalError:e}),void H(e)}let e=null;try{e=new BroadcastChannel(J)}catch(e){const r="Failed to create BroadcastChannel";return f({action:"useBroadcastChannel",channelName:J,originalError:e instanceof Error?e:String(e)}),void H(r)}return k.current=e,u.created(J),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{ee({data:e})})):ee(e)})),()=>{re()}}),[J,ee,H]),e.useEffect((()=>{if(i<=0)return;const e=setInterval((()=>{g.started();const e=$.length;W(),g.completed(e-$.length)}),i);return()=>{var r;clearInterval(e),b>0&&(null===(r=W.cancel)||void 0===r||r.call(W))}}),[i,W,b]),e.useEffect((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of G.current.entries())e-t>=M&&G.current.delete(r)}),6e4);return()=>clearInterval(e)}),[M]),e.useEffect((()=>()=>{if(O.current.length>0&&k.current&&!j.current){try{k.current.postMessage(O.current)}catch(e){const r="Failed to send message";f({action:"useBroadcastChannel",channelName:J,originalError:e instanceof Error?e:String(e)}),H(r)}O.current=[],setTimeout((()=>{}),0)}L.current&&(clearTimeout(L.current),L.current=null),j.current=!1}),[]),{channelName:J,messages:$,sentMessages:A,isPingInProgress:x,ping:K,postMessage:Q,clearReceivedMessages:X,clearSentMessages:Y,getLatestMessage:Z,error:B,closeChannel:re}},S=e.createContext(void 0);exports.BroadcastProvider=({children:e,channelName:t,options:n})=>{const s=E(t,n);return r.jsx(S.Provider,{value:s,children:e})},exports.useBroadcastChannel=E,exports.useBroadcastProvider=()=>{const r=e.useContext(S);if(!r)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return r};
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/utils/messageUtils.ts","../src/utils/debug.ts","../src/hooks/useBroadcastChannel.ts","../src/BroadcastProvider.tsx"],"sourcesContent":[null,null,null,null],"names":["INTERNAL_PREFIX","generateRandomPart","Math","random","toString","substr","generateMessageId","source","timestamp","raw","btoa","replace","isMessageExpired","message","expirationDate","Date","now","createMessage","type","content","options","id","_a","expirationDuration","undefined","getInternalMessageType","baseType","channelName","namespace","hash","isValidInternalClearMessage","startsWith","log","level","data","process","env","REACT_APP_DEBUG_BROADCAST","prefix","toISOString","console","warn","error","debug","created","name","closed","sent","received","cleared","messageId","expired","duplicate","allSentCleared","allReceivedCleared","ignored","messageType","inProgress","started","completed","removedCount","context","action","originalError","Error","JSON","stringify","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","stableRegisteredTypes","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","String","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","call","key","entries","delete","BroadcastChannelContext","createContext","BroadcastProvider","children","BroadcastChannelActions","_jsx","jsx","Provider","value","useBroadcastProvider","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/utils/messageUtils.ts","../src/utils/debug.ts","../src/hooks/useBroadcastChannel.ts","../src/BroadcastProvider.tsx"],"sourcesContent":[null,null,null,null],"names":["INTERNAL_PREFIX","generateRandomPart","Math","random","toString","substr","generateMessageId","source","timestamp","raw","btoa","replace","isMessageExpired","message","expirationDate","Date","now","createMessage","type","content","options","id","_a","expirationDuration","undefined","getInternalMessageType","baseType","channelName","namespace","hash","isValidInternalClearMessage","startsWith","log","level","data","process","env","REACT_APP_DEBUG_BROADCAST","prefix","toISOString","console","warn","error","debug","created","name","closed","sent","received","cleared","messageId","expired","duplicate","allSentCleared","allReceivedCleared","ignored","messageType","inProgress","started","completed","removedCount","context","action","originalError","Error","JSON","stringify","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","onMessage","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","onMessageRef","current","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","registeredTypesRef","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","setErrorMessage","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","cb","call","String","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","key","entries","delete","BroadcastChannelContext","createContext","BroadcastProvider","children","BroadcastChannelActions","_jsx","jsx","Provider","value","useBroadcastProvider","useContext"],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{useState as e,useRef as r,useMemo as t,useCallback as n,useEffect as s,createContext as a,useContext as o}from"react";import{jsx as c}from"react/jsx-runtime";const i="__INTERNAL__",l=()=>Math.random().toString(36).substr(2,9),u=(e,r)=>{const t=`${l()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},d=e=>!!e.expirationDate&&e.expirationDate<Date.now(),p=(e,r,t,n={})=>{var s;const a=Date.now();return{id:u(t,a),type:e,message:r,timestamp:a,source:t,expirationDate:null!==(s=n.expirationDate)&&void 0!==s?s:n.expirationDuration?a+n.expirationDuration:void 0}},g=(e,r,t="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${r}-${t}`}`);return`${i}:${e}:${n}`},f=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${i}:`)&&"string"==typeof e.source,h=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const n=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(n,r,t||"");break;case"warn":console.warn(n,r,t||"");break;case"error":console.error(n,r,t||"")}},y={created:e=>h("info","Channel created:",e),closed:e=>h("info","Channel closed:",e)},m={sent:e=>h("info","Message sent:",e),received:e=>h("info","Message received:",e),cleared:e=>h("info","Message cleared:",e),expired:e=>h("info","Message expired:",e),duplicate:e=>h("warn","Duplicate message ignored:",e),allSentCleared:()=>h("info","All sent messages cleared"),allReceivedCleared:()=>h("info","All received messages cleared"),ignored:e=>h("info","Message ignored due to type filter:",e)},v={inProgress:()=>h("warn","Ping already in progress. Skipping call.")},E={started:()=>h("info","Cleanup started"),completed:e=>h("info","Cleanup completed:",e)},N=e=>{const{action:r,channelName:t,type:n,source:s,originalError:a}=e;let o=`${r}`;if(t&&(o+=` | channel: ${t}`),n&&(o+=` | type: ${n}`),s&&(o+=` | source: ${s}`),a instanceof Error)o+=` | cause: ${a.message}`;else if("string"==typeof a)o+=` | cause: ${a}`;else if(null!=a)try{o+=` | cause: ${JSON.stringify(a)}`}catch(e){o+=" | cause: [unserializable]"}h("error","Error:",o)},M="CLEAR_SENT_MESSAGES",S="PING",b="PONG";let P;if("test"===process.env.NODE_ENV)try{P=require("react-dom").flushSync}catch(e){}const C=(a,o={})=>{const{sourceName:c,cleaningInterval:i=1e3,keepLatestMessage:u=!1,registeredTypes:h=[],namespace:C="",deduplicationTTL:w=3e5,cleanupDebounceMs:$=0,batchingDelayMs:T=20,excludedBatchMessageTypes:A=[]}=o,[D,B]=e([]),[_,G]=e([]),[I,x]=e(null),[L,O]=e(!1),R=r(null),k=r(new Map),j=r(null),F=r(null),J=r([]),q=r(!1),z=t((()=>c||`tab-${l()}`),[c]),U=t((()=>({CLEAR_SENT_MESSAGES:g(M,a,C),PING:g(S,a,C),PONG:g(b,a,C)})),[a,C]),V=t((()=>C?`${a}-${C}`:a),[a,C]),W=t((()=>h),[JSON.stringify(h)]),H=n((()=>{B((e=>e.filter((e=>!d(e)))))}),[]),K=r($>0?((e,r)=>{let t,n=null,s=null;const a=(...a)=>{s=a,null!==n&&clearTimeout(n),n=setTimeout((()=>{n=null,null!==s&&(t=e(...s),s=null)}),r)};return a.cancel=()=>{null!==n&&(clearTimeout(n),n=null,s=null)},a.flush=()=>(null!==n&&(clearTimeout(n),n=null,null!==s&&(t=e(...s),s=null)),t),a})(H,$):Object.assign(H,{cancel:()=>{}})).current,Q=n((e=>{x(e),setTimeout((()=>x(null)),3e3)}),[]),X=n(((e=300)=>{if(L)return v.inProgress(),Promise.resolve([]);if(!R.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return N({action:"ping",channelName:V,originalError:e}),Q(e),Promise.resolve([])}P?P((()=>O(!0))):O(!0);const r=new Set;return j.current=r,R.current.postMessage(p(U.PING,null,z)),new Promise((t=>{setTimeout((()=>{O(!1),j.current===r&&(j.current=null),t(Array.from(r))}),e)}))}),[U.PING,z,Q,L,P]),Y=n(((e,r,t={})=>{const n=R.current;if(!n){const r="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return N({action:"postMessage",channelName:V,type:e,originalError:r}),void Q(r)}const s=p(e,r,z,t);if(!T||T<0||A.includes(e))try{n.postMessage(s)}catch(r){const t="Failed to send message";N({action:"postMessage",channelName:V,type:e,originalError:t}),Q(t),q.current=!0}else J.current.push(s),F.current||(F.current=setTimeout((()=>{if(q.current)return J.current=[],void(F.current=null);try{n.postMessage(J.current)}catch(r){const t="Failed to send message";N({action:"postMessage",channelName:V,type:e,originalError:t}),Q(t),q.current=!0}J.current=[],F.current=null}),T));m.sent(s),G((e=>[...e,s]))}),[z,Q,T,A]),Z=n(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);B((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[])),r||m.allReceivedCleared()}),[]),ee=n(((e={})=>{var r,t,n;const{ids:s=[],types:a=[],sync:o=!1}=null!=e?e:{};G((e=>s.length>0||a.length>0?e.filter((e=>{if(e.source!==z)return!0;const r=0===s.length||s.includes(e.id),t=0===a.length||a.includes(e.type);return!(r&&t)})):[])),0===s.length&&0===a.length&&m.allSentCleared(),o&&(null===(r=R.current)||void 0===r||r.postMessage(p(U.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},z)))}),[]),re=n(((e={})=>{const{source:r,type:t}=e;for(let e=D.length-1;e>=0;e--){const n=D[e],s=!r||n.source===r,a=!t||n.type===t;if(s&&a)return n}return null}),[D]),te=n((e=>{var r;try{const t=e.data;if(m.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===z)return;if(f(t)){if(t.type===U.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void B((n=>[...n.filter((n=>{if(n.source!==t.source)return!0;const s=0===e.length||e.includes(n.id),a=0===r.length||r.includes(n.type);return!(s&&a)}))]))}if(t.type===U.PING)return void(null===(r=R.current)||void 0===r||r.postMessage(p(U.PONG,null,z)));if(t.type===U.PONG){const e=t.source,r=j.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(W.length>0&&!W.includes(t.type))return void m.ignored(t.type);if(d(t))return void m.expired(t.id);const n=Date.now(),s=k.current.get(t.id);if(s&&n-s<w)return void m.duplicate(t.id);k.current.set(t.id,n),B((e=>u?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";N({action:"handleMessage",channelName:V,originalError:r}),Q(r)}}),[z,W,u,Q,U,w]),ne=n((()=>{const e=R.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",te),e.close(),y.closed(V),R.current=null)}),[te,V]);return s((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return N({action:"useBroadcastChannel",channelName:V,originalError:e}),void Q(e)}let e=null;try{e=new BroadcastChannel(V)}catch(e){const r="Failed to create BroadcastChannel";return N({action:"useBroadcastChannel",channelName:V,originalError:e instanceof Error?e:String(e)}),void Q(r)}return R.current=e,y.created(V),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{te({data:e})})):te(e)})),()=>{ne()}}),[V,te,Q]),s((()=>{if(i<=0)return;const e=setInterval((()=>{E.started();const e=D.length;K(),E.completed(e-D.length)}),i);return()=>{var r;clearInterval(e),$>0&&(null===(r=K.cancel)||void 0===r||r.call(K))}}),[i,K,$]),s((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of k.current.entries())e-t>=w&&k.current.delete(r)}),6e4);return()=>clearInterval(e)}),[w]),s((()=>()=>{if(J.current.length>0&&R.current&&!q.current){try{R.current.postMessage(J.current)}catch(e){const r="Failed to send message";N({action:"useBroadcastChannel",channelName:V,originalError:e instanceof Error?e:String(e)}),Q(r)}J.current=[],setTimeout((()=>{}),0)}F.current&&(clearTimeout(F.current),F.current=null),q.current=!1}),[]),{channelName:V,messages:D,sentMessages:_,isPingInProgress:L,ping:X,postMessage:Y,clearReceivedMessages:Z,clearSentMessages:ee,getLatestMessage:re,error:I,closeChannel:ne}},w=a(void 0),$=({children:e,channelName:r})=>{const t=C(r);return c(w.Provider,{value:t,children:e})},T=()=>{const e=o(w);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{$ as BroadcastProvider,C as useBroadcastChannel,T as useBroadcastProvider};
1
+ import{useState as e,useRef as r,useMemo as t,useCallback as n,useEffect as s,createContext as o,useContext as a}from"react";import{jsx as c}from"react/jsx-runtime";const i="__INTERNAL__",l=()=>Math.random().toString(36).substr(2,9),u=(e,r)=>{const t=`${l()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},d=e=>!!e.expirationDate&&e.expirationDate<Date.now(),p=(e,r,t,n={})=>{var s;const o=Date.now();return{id:u(t,o),type:e,message:r,timestamp:o,source:t,expirationDate:null!==(s=n.expirationDate)&&void 0!==s?s:n.expirationDuration?o+n.expirationDuration:void 0}},g=(e,r,t="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${r}-${t}`}`);return`${i}:${e}:${n}`},f=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${i}:`)&&"string"==typeof e.source,h=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const n=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(n,r,t||"");break;case"warn":console.warn(n,r,t||"");break;case"error":console.error(n,r,t||"")}},y={created:e=>h("info","Channel created:",e),closed:e=>h("info","Channel closed:",e)},m={sent:e=>h("info","Message sent:",e),received:e=>h("info","Message received:",e),cleared:e=>h("info","Message cleared:",e),expired:e=>h("info","Message expired:",e),duplicate:e=>h("warn","Duplicate message ignored:",e),allSentCleared:()=>h("info","All sent messages cleared"),allReceivedCleared:()=>h("info","All received messages cleared"),ignored:e=>h("info","Message ignored due to type filter:",e)},v={inProgress:()=>h("warn","Ping already in progress. Skipping call.")},E={started:()=>h("info","Cleanup started"),completed:e=>h("info","Cleanup completed:",e)},S=e=>{const{action:r,channelName:t,type:n,source:s,originalError:o}=e;let a=`${r}`;if(t&&(a+=` | channel: ${t}`),n&&(a+=` | type: ${n}`),s&&(a+=` | source: ${s}`),o instanceof Error)a+=` | cause: ${o.message}`;else if("string"==typeof o)a+=` | cause: ${o}`;else if(null!=o)try{a+=` | cause: ${JSON.stringify(o)}`}catch(e){a+=" | cause: [unserializable]"}h("error","Error:",a)},M="CLEAR_SENT_MESSAGES",N="PING",b="PONG";let C;if("test"===process.env.NODE_ENV)try{C=require("react-dom").flushSync}catch(e){}const P=(o,a={})=>{const{sourceName:c,cleaningInterval:i=1e3,keepLatestMessage:u=!1,registeredTypes:h=[],namespace:P="",deduplicationTTL:w=3e5,cleanupDebounceMs:$=0,batchingDelayMs:T=20,excludedBatchMessageTypes:A=[],onMessage:_}=a,[D,B]=e([]),[G,I]=e([]),[x,L]=e(null),[R,O]=e(!1),k=r(null),j=r(new Map),F=r(null),q=r(null),z=r([]),J=r(!1),U=r(_);U.current=_;const V=t((()=>c||`tab-${l()}`),[c]),W=t((()=>({CLEAR_SENT_MESSAGES:g(M,o,P),PING:g(N,o,P),PONG:g(b,o,P)})),[o,P]),H=t((()=>P?`${o}-${P}`:o),[o,P]),K=r(h);K.current=h;const Q=n((()=>{B((e=>e.filter((e=>!d(e)))))}),[]),X=r($>0?((e,r)=>{let t,n=null,s=null;const o=(...o)=>{s=o,null!==n&&clearTimeout(n),n=setTimeout((()=>{n=null,null!==s&&(t=e(...s),s=null)}),r)};return o.cancel=()=>{null!==n&&(clearTimeout(n),n=null,s=null)},o.flush=()=>(null!==n&&(clearTimeout(n),n=null,null!==s&&(t=e(...s),s=null)),t),o})(Q,$):Object.assign(Q,{cancel:()=>{}})).current,Y=n((e=>{L(e),setTimeout((()=>L(null)),3e3)}),[]),Z=n(((e=300)=>{if(R)return v.inProgress(),Promise.resolve([]);if(!k.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return S({action:"ping",channelName:H,originalError:e}),Y(e),Promise.resolve([])}C?C((()=>O(!0))):O(!0);const r=new Set;return F.current=r,k.current.postMessage(p(W.PING,null,V)),new Promise((t=>{setTimeout((()=>{O(!1),F.current===r&&(F.current=null),t(Array.from(r))}),e)}))}),[W.PING,V,Y,R,C]),ee=n(((e,r,t={})=>{const n=k.current;if(!n){const r="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return S({action:"postMessage",channelName:H,type:e,originalError:r}),void Y(r)}const s=p(e,r,V,t);if(!T||T<0||A.includes(e))try{n.postMessage(s)}catch(r){const t="Failed to send message";S({action:"postMessage",channelName:H,type:e,originalError:t}),Y(t),J.current=!0}else z.current.push(s),q.current||(q.current=setTimeout((()=>{if(J.current)return z.current=[],void(q.current=null);try{n.postMessage(z.current)}catch(r){const t="Failed to send message";S({action:"postMessage",channelName:H,type:e,originalError:t}),Y(t),J.current=!0}z.current=[],q.current=null}),T));m.sent(s),I((e=>[...e,s]))}),[V,Y,T,A]),re=n(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);B((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[])),r||m.allReceivedCleared()}),[]),te=n(((e={})=>{var r,t,n;const{ids:s=[],types:o=[],sync:a=!1}=null!=e?e:{};I((e=>s.length>0||o.length>0?e.filter((e=>{if(e.source!==V)return!0;const r=0===s.length||s.includes(e.id),t=0===o.length||o.includes(e.type);return!(r&&t)})):[])),0===s.length&&0===o.length&&m.allSentCleared(),a&&(null===(r=k.current)||void 0===r||r.postMessage(p(W.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},V)))}),[V,W.CLEAR_SENT_MESSAGES]),ne=n(((e={})=>{const{source:r,type:t}=e;for(let e=D.length-1;e>=0;e--){const n=D[e],s=!r||n.source===r,o=!t||n.type===t;if(s&&o)return n}return null}),[D]),se=n((e=>{var r,t;try{const n=e.data;if(m.received(n),!(e=>Boolean(e&&"object"==typeof e&&"string"==typeof e.id&&"string"==typeof e.type&&"string"==typeof e.source&&"number"==typeof e.timestamp))(n))return;if(n.source===V)return;if(f(n)){if(n.type===W.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=n.message||{};return void B((t=>[...t.filter((t=>{if(t.source!==n.source)return!0;const s=0===e.length||e.includes(t.id),o=0===r.length||r.includes(t.type);return!(s&&o)}))]))}if(n.type===W.PING)return void(null===(r=k.current)||void 0===r||r.postMessage(p(W.PONG,null,V)));if(n.type===W.PONG){const e=n.source,r=F.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(K.current.length>0&&!K.current.includes(n.type))return void m.ignored(n.type);if(d(n))return void m.expired(n.id);const s=Date.now(),o=j.current.get(n.id);if(o&&s-o<w)return void m.duplicate(n.id);j.current.set(n.id,s),B((e=>u?[n]:[...e,n]));try{const e=U.current;"function"==typeof e?e(n):e&&(null===(t=e[n.type])||void 0===t||t.call(e,n))}catch(e){S({action:"onMessage",channelName:H,originalError:e instanceof Error?e.message:String(e)})}}catch(e){const r="Error processing broadcast message";S({action:"handleMessage",channelName:H,originalError:r}),Y(r)}}),[V,u,Y,W,w]),oe=n((()=>{const e=k.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",se),e.close(),y.closed(H),k.current=null)}),[se,H]);return s((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return S({action:"useBroadcastChannel",channelName:H,originalError:e}),void Y(e)}let e=null;try{e=new BroadcastChannel(H)}catch(e){const r="Failed to create BroadcastChannel";return S({action:"useBroadcastChannel",channelName:H,originalError:e instanceof Error?e:String(e)}),void Y(r)}return k.current=e,y.created(H),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{se({data:e})})):se(e)})),()=>{oe()}}),[H,se,Y]),s((()=>{if(i<=0)return;const e=setInterval((()=>{E.started();const e=D.length;X(),E.completed(e-D.length)}),i);return()=>{var r;clearInterval(e),$>0&&(null===(r=X.cancel)||void 0===r||r.call(X))}}),[i,X,$]),s((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of j.current.entries())e-t>=w&&j.current.delete(r)}),6e4);return()=>clearInterval(e)}),[w]),s((()=>()=>{if(z.current.length>0&&k.current&&!J.current){try{k.current.postMessage(z.current)}catch(e){const r="Failed to send message";S({action:"useBroadcastChannel",channelName:H,originalError:e instanceof Error?e:String(e)}),Y(r)}z.current=[],setTimeout((()=>{}),0)}q.current&&(clearTimeout(q.current),q.current=null),J.current=!1}),[]),{channelName:H,messages:D,sentMessages:G,isPingInProgress:R,ping:Z,postMessage:ee,clearReceivedMessages:re,clearSentMessages:te,getLatestMessage:ne,error:x,closeChannel:oe}},w=o(void 0),$=({children:e,channelName:r,options:t})=>{const n=P(r,t);return c(w.Provider,{value:n,children:e})},T=()=>{const e=a(w);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{$ as BroadcastProvider,P as useBroadcastChannel,T as useBroadcastProvider};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/messageUtils.ts","../src/utils/debug.ts","../src/hooks/useBroadcastChannel.ts","../src/BroadcastProvider.tsx"],"sourcesContent":[null,null,null,null],"names":["INTERNAL_PREFIX","generateRandomPart","Math","random","toString","substr","generateMessageId","source","timestamp","raw","btoa","replace","isMessageExpired","message","expirationDate","Date","now","createMessage","type","content","options","id","_a","expirationDuration","undefined","getInternalMessageType","baseType","channelName","namespace","hash","isValidInternalClearMessage","startsWith","log","level","data","process","env","REACT_APP_DEBUG_BROADCAST","prefix","toISOString","console","warn","error","debug","created","name","closed","sent","received","cleared","messageId","expired","duplicate","allSentCleared","allReceivedCleared","ignored","messageType","inProgress","started","completed","removedCount","context","action","originalError","Error","JSON","stringify","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","stableRegisteredTypes","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","String","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","call","key","entries","delete","BroadcastChannelContext","createContext","BroadcastProvider","children","BroadcastChannelActions","_jsx","Provider","value","useBroadcastProvider","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/messageUtils.ts","../src/utils/debug.ts","../src/hooks/useBroadcastChannel.ts","../src/BroadcastProvider.tsx"],"sourcesContent":[null,null,null,null],"names":["INTERNAL_PREFIX","generateRandomPart","Math","random","toString","substr","generateMessageId","source","timestamp","raw","btoa","replace","isMessageExpired","message","expirationDate","Date","now","createMessage","type","content","options","id","_a","expirationDuration","undefined","getInternalMessageType","baseType","channelName","namespace","hash","isValidInternalClearMessage","startsWith","log","level","data","process","env","REACT_APP_DEBUG_BROADCAST","prefix","toISOString","console","warn","error","debug","created","name","closed","sent","received","cleared","messageId","expired","duplicate","allSentCleared","allReceivedCleared","ignored","messageType","inProgress","started","completed","removedCount","context","action","originalError","Error","JSON","stringify","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","onMessage","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","onMessageRef","current","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","registeredTypesRef","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","setErrorMessage","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","cb","call","String","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","key","entries","delete","BroadcastChannelContext","createContext","BroadcastProvider","children","BroadcastChannelActions","_jsx","Provider","value","useBroadcastProvider","useContext"],"mappings":"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"}
@@ -20,6 +20,17 @@ export interface BroadcastOptions {
20
20
  batchingDelayMs?: number;
21
21
  /** Array of message types that should not be batched and sent immediately (default: []) */
22
22
  excludedBatchMessageTypes?: string[];
23
+ /**
24
+ * Callback(s) fired when an incoming message passes all filters
25
+ * (registeredTypes, expiry, deduplication, self-filter).
26
+ *
27
+ * - Pass a single function to handle all incoming message types.
28
+ * - Pass a type-keyed map `{ error: fn, success: fn }` for per-type handling.
29
+ *
30
+ * The callback fires after the message is added to state.
31
+ * Internal messages (PING, PONG, CLEAR_SENT_MESSAGES) never trigger this.
32
+ */
33
+ onMessage?: MessageCallback | OnMessageMap;
23
34
  }
24
35
  /**
25
36
  * Options for sending messages
@@ -61,6 +72,12 @@ export interface GetLatestMessageOptions {
61
72
  source?: string;
62
73
  type?: string;
63
74
  }
75
+ /** Callback invoked when a received message passes all filters */
76
+ export type MessageCallback = (msg: BroadcastMessage) => void;
77
+ /** Map from message type string to a single handler callback */
78
+ export type OnMessageMap = {
79
+ [type: string]: MessageCallback;
80
+ };
64
81
  /**
65
82
  * Actions and state provided by the broadcast channel hook
66
83
  */
package/package.json CHANGED
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "react-broadcast-sync",
3
- "version": "1.6.0",
3
+ "version": "1.9.0",
4
4
  "description": "A lightweight React hook and provider for syncing state across browser tabs using BroadcastChannel API.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "sideEffects": false,
9
9
  "type": "module",
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
10
15
  "exports": {
11
16
  ".": {
12
17
  "import": "./dist/index.esm.js",
package/.eslintignore DELETED
@@ -1,5 +0,0 @@
1
- node_modules/
2
- dist/
3
- coverage/
4
- demo/react-broadcast-sync/node_modules
5
- demo/react-broadcast-sync/dist
@@ -1,61 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- jobs:
10
- lint-and-typecheck:
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v3
14
-
15
- - name: Setup Node.js
16
- uses: actions/setup-node@v4
17
- with:
18
- node-version: 20.11.1
19
-
20
- - name: Install dependencies
21
- run: npm ci
22
-
23
- - name: Run linter
24
- run: npm run lint
25
-
26
- - name: Run Prettier check
27
- run: npm run format:check
28
-
29
- - name: Run type checks
30
- run: npm run typecheck
31
-
32
- build-and-test:
33
- runs-on: ubuntu-latest
34
-
35
- strategy:
36
- matrix:
37
- node-version: [20.11.1]
38
-
39
- steps:
40
- - uses: actions/checkout@v3
41
-
42
- - name: Setup Node.js ${{ matrix.node-version }}
43
- uses: actions/setup-node@v4
44
- with:
45
- node-version: ${{ matrix.node-version }}
46
-
47
- - name: Install dependencies
48
- run: npm ci
49
-
50
- - name: Run build
51
- run: npm run build
52
-
53
- - name: Run tests with coverage
54
- run: npm test -- --coverage
55
-
56
- - name: Upload coverage to Codecov
57
- uses: codecov/codecov-action@v4
58
- with:
59
- token: ${{ secrets.CODECOV_TOKEN }}
60
- files: ./coverage/lcov.info
61
- fail_ci_if_error: true
@@ -1,39 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- permissions:
9
- contents: write
10
- issues: write
11
- pull-requests: write
12
-
13
- jobs:
14
- release:
15
- name: Release
16
- runs-on: ubuntu-latest
17
- steps:
18
- - name: Checkout
19
- uses: actions/checkout@v4
20
- with:
21
- fetch-depth: 0
22
-
23
- - name: Setup Node.js
24
- uses: actions/setup-node@v4
25
- with:
26
- node-version: 20.11.1
27
- cache: 'npm'
28
-
29
- - name: Install dependencies
30
- run: npm ci
31
-
32
- - name: Build
33
- run: npm run build
34
-
35
- - name: Release
36
- env:
37
- GH_TOKEN: ${{ secrets.GH_PAT }}
38
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
39
- run: npx semantic-release
package/.husky/pre-commit DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env sh
2
- . "$(dirname -- "$0")/_/husky.sh"
3
-
4
- npx lint-staged
5
- npm run typecheck
package/.nvmrc DELETED
@@ -1 +0,0 @@
1
- 20.11.1
package/.prettierignore DELETED
@@ -1,4 +0,0 @@
1
- node_modules
2
- dist
3
- coverage
4
- CHANGELOG.md
package/.prettierrc DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "semi": true,
3
- "tabWidth": 2,
4
- "printWidth": 100,
5
- "singleQuote": true,
6
- "trailingComma": "es5",
7
- "bracketSpacing": true,
8
- "arrowParens": "avoid"
9
- }
package/.releaserc.json DELETED
@@ -1,22 +0,0 @@
1
- {
2
- "branches": ["main"],
3
- "plugins": [
4
- "@semantic-release/commit-analyzer",
5
- "@semantic-release/release-notes-generator",
6
- [
7
- "@semantic-release/changelog",
8
- {
9
- "changelogFile": "CHANGELOG.md"
10
- }
11
- ],
12
- "@semantic-release/npm",
13
- [
14
- "@semantic-release/git",
15
- {
16
- "assets": ["CHANGELOG.md", "package.json"],
17
- "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
18
- }
19
- ],
20
- "@semantic-release/github"
21
- ]
22
- }