react-broadcast-sync 1.2.0 → 1.3.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [1.3.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.2.1...v1.3.0) (2025-06-16)
2
+
3
+
4
+ ### Features
5
+
6
+ * added getLatestMessage and closeChannel methods ([2ca0c32](https://github.com/IdanShalem/react-broadcast-sync/commit/2ca0c320c6558fd4205a8965d364d49c07609e97))
7
+
8
+ ## [1.2.1](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.2.0...v1.2.1) (2025-06-11)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * added unit testing for same tab scenarios ([5e3df1d](https://github.com/IdanShalem/react-broadcast-sync/commit/5e3df1deab456565a09f0dfda84b21b526f157ba))
14
+
1
15
  # [1.2.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.1.4...v1.2.0) (2025-06-08)
2
16
 
3
17
 
package/README.md CHANGED
@@ -252,6 +252,8 @@ interface BroadcastActions {
252
252
  postMessage: (type: string, content: any, options?: SendMessageOptions) => void;
253
253
  clearReceivedMessages: (opts?: { ids?: string[]; types?: string[]; sources?: string[] }) => void;
254
254
  clearSentMessages: (opts?: { ids?: string[]; types?: string[]; sync?: boolean }) => void;
255
+ getLatestMessage: (opts?: { type?: string; source?: string }) => BroadcastMessage | null;
256
+ closeChannel: () => void;
255
257
  error: string | null; // Current error state
256
258
  }
257
259
  ```
@@ -268,6 +270,8 @@ Returns an object with:
268
270
  | `postMessage()` | `function` | Send a message to all tabs |
269
271
  | `clearReceivedMessages()` | `function` | Clear received messages. No filters ⇒ clear all. With filters, a message is deleted only if it matches **every** provided filter (`ids`, `types`, `sources`). Empty arrays act as wildcards. |
270
272
  | `clearSentMessages()` | `function` | Clear messages this tab sent (same matching rules). Pass `sync: true` to broadcast the clear to other tabs. |
273
+ | `getLatestMessage()` | `function` | Get the latest message matching optional filters (`type`, `source`). Returns the most recent message that matches, or `null` if none. |
274
+ | `closeChannel()` | `function` | Explicitly closes the broadcast channel and removes event listeners. Safe to call multiple times. |
271
275
  | `error` | `string \| null` | Any runtime error from the channel |
272
276
 
273
277
  #### Clearing examples
@@ -310,6 +314,68 @@ interface BroadcastMessage {
310
314
  }
311
315
  ```
312
316
 
317
+ #### Getting the Latest Message
318
+
319
+ You can use `getLatestMessage` to retrieve the most recent message received, optionally filtered by `type` and/or `source`. If no options are provided, it returns the latest message of any kind. If no message matches, it returns `null`.
320
+
321
+ **Signature:**
322
+
323
+ ```ts
324
+ getLatestMessage(options?: { type?: string; source?: string }): BroadcastMessage | null
325
+ ```
326
+
327
+ **Examples:**
328
+
329
+ ```tsx
330
+ // Get the latest message of any type/source
331
+ const latest = getLatestMessage();
332
+
333
+ // Get the latest message of a specific type
334
+ const latestAlert = getLatestMessage({ type: 'alert' });
335
+
336
+ // Get the latest message from a specific source
337
+ const latestFromTab = getLatestMessage({ source: 'tab-123' });
338
+
339
+ // Get the latest message of a specific type from a specific source
340
+ const latestInfoFromTab = getLatestMessage({ type: 'info', source: 'tab-123' });
341
+
342
+ // Check if there are any messages of a type
343
+ if (getLatestMessage({ type: 'notification' })) {
344
+ // ...
345
+ }
346
+ ```
347
+
348
+ **Behavior:**
349
+
350
+ - If no messages are present, returns `null`.
351
+ - If no message matches the filter, returns `null`.
352
+ - If multiple messages match, returns the most recently received one.
353
+
354
+ #### Closing the Channel Explicitly
355
+
356
+ You can use `closeChannel` to explicitly close the underlying BroadcastChannel and remove all event listeners. This is useful if you want to clean up resources before the component unmounts, or to stop all cross-tab communication on demand. Note that the channel will automatically close and all event listeners will be removed when the component unmounts, so this method is mainly useful for manual cleanup.
357
+
358
+ **Signature:**
359
+
360
+ ```ts
361
+ closeChannel(): void
362
+ ```
363
+
364
+ **Example:**
365
+
366
+ ```tsx
367
+ const { closeChannel } = useBroadcastChannel('my-channel');
368
+
369
+ // ... later, when you want to stop all communication:
370
+ closeChannel();
371
+ ```
372
+
373
+ **Notes:**
374
+
375
+ - After calling `closeChannel`, the channel is closed and will not send or receive any more messages.
376
+ - It is safe to call `closeChannel` multiple times (idempotent).
377
+ - You do not need to call this for normal React unmounting; the hook will clean up automatically. Use it for explicit/manual cleanup only.
378
+
313
379
  ---
314
380
 
315
381
  ## Best Practices
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__",s=()=>Math.random().toString(36).substr(2,9),n=(e,r)=>{const t=`${s()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},o=e=>!!e.expirationDate&&e.expirationDate<Date.now(),a=(e,r,t,s={})=>{var o;const a=Date.now();return{id:n(t,a),type:e,message:r,timestamp:a,source:t,expirationDate:null!==(o=s.expirationDate)&&void 0!==o?o:s.expirationDuration?a+s.expirationDuration:void 0}},c=(e,r,s="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${r}-${s}`}`);return`${t}:${e}:${n}`},l=e=>e.startsWith(`${t}:`),i=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const s=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(s,r,t||"");break;case"warn":console.warn(s,r,t||"");break;case"error":console.error(s,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")},p={started:()=>i("info","Cleanup started"),completed:e=>i("info","Cleanup completed:",{removedCount:e})},f=e=>i("error","Error:",e),h="CLEAR_SENT_MESSAGES",g=(r,t={})=>{const{sourceName:n,cleaningInterval:i=1e3,keepLatestMessage:g=!1,registeredTypes:v=[],namespace:m="",deduplicationTTL:E=3e5,cleanupDebounceMs:y=0}=t,[C,b]=e.useState([]),[S,M]=e.useState([]),[w,x]=e.useState(null),B=e.useRef(null),D=e.useRef(new Map),$=e.useRef(n||`tab-${s()}`).current,A=e.useRef({CLEAR_SENT_MESSAGES:c(h,r,m)}).current,R=e.useMemo((()=>`${r}-${m}`),[r,m]),T=e.useCallback((()=>{b((e=>e.filter((e=>!o(e)))))}),[]),_=e.useRef(y>0?((e,r)=>{let t,s=null,n=null;const o=(...o)=>{n=o,null!==s&&clearTimeout(s),s=setTimeout((()=>{s=null,null!==n&&(t=e(...n),n=null)}),r)};return o.cancel=()=>{null!==s&&(clearTimeout(s),s=null,n=null)},o.flush=()=>(null!==s&&(clearTimeout(s),s=null,null!==n&&(t=e(...n),n=null)),t),o})(T,y):Object.assign(T,{cancel:()=>{}})).current,k=e.useCallback((e=>{x(e),setTimeout((()=>x(null)),3e3)}),[]),P=e.useCallback(((e,r,t={})=>{const s=B.current;if(!s){const e="Channel not available";return f(e),void k(e)}try{const n=a(e,r,$,t);s.postMessage(n),d.sent(n),M((e=>[...e,n]))}catch(e){const r="Failed to send message";f(r),k(r)}}),[$,k]),L=e.useCallback(((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)))):[]))}),[]),N=e.useCallback(((e={})=>{var r,t,s;const{ids:n=[],types:o=[],sync:c=!1}=null!=e?e:{};M((e=>n.length>0||o.length>0?e.filter((e=>{if(e.source!==$)return!0;const r=0===n.length||n.includes(e.id),t=0===o.length||o.includes(e.type);return!(r&&t)})):[])),c&&(null===(r=B.current)||void 0===r||r.postMessage(a(A.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(s=e.types)&&void 0!==s?s:[]},$)))}),[]),j=e.useCallback((e=>{try{const r=e.data;if(d.received(r),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(r))return;if(r.source===$)return;if(!l(r.type)&&v.length>0&&!v.includes(r.type))return;if(o(r))return void d.expired(r.id);if((e=>e&&"object"==typeof e&&"string"==typeof e.type&&l(e.type)&&"string"==typeof e.source)(r)&&r.type===A.CLEAR_SENT_MESSAGES){const{ids:e=[],types:t=[]}=r.message||{};return void b((s=>s.filter((s=>{if(s.source!==r.source)return!0;const n=0===e.length||e.includes(s.id),o=0===t.length||t.includes(s.type);return!(n&&o)}))))}const t=Date.now(),s=D.current.get(r.id);if(s&&t-s<E)return void d.duplicate(r.id);D.current.set(r.id,t),b((e=>g?[r]:[...e,r]))}catch(e){const r="Error processing broadcast message";f(r),k(r)}}),[$,v,g,k,A,E]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f(e),void k(e)}const e=new BroadcastChannel(R);return B.current=e,u.created(R),e.addEventListener("message",j),()=>{e.removeEventListener("message",j),e.close(),u.closed(R)}}),[R,j,k]),e.useEffect((()=>{if(i<=0)return;const e=setInterval((()=>{p.started();const e=C.length;_(),p.completed(e-C.length)}),i);return()=>{var r;clearInterval(e),y>0&&(null===(r=_.cancel)||void 0===r||r.call(_))}}),[i,_,y]),e.useEffect((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of D.current.entries())e-t>=E&&D.current.delete(r)}),6e4);return()=>clearInterval(e)}),[E]),{channelName:R,messages:C,sentMessages:S,postMessage:P,clearReceivedMessages:L,clearSentMessages:N,error:w}},v=e.createContext(void 0);class m extends e.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("BroadcastChannel error:",e)}render(){return this.state.hasError?r.jsx("div",{children:"Error occurred in BroadcastProvider"}):this.props.children}}exports.BroadcastProvider=({children:t,channelName:s})=>{const{messages:n,error:o}=g(s),[a,c]=e.useState(null),l=e.useRef(null);e.useEffect((()=>{if("undefined"==typeof BroadcastChannel)return void c("BroadcastChannel is not supported in this browser. Please check browser compatibility.");const e=new BroadcastChannel(s);return l.current=e,()=>{e.close()}}),[s]);const i=e.useMemo((()=>({messages:n,error:a||o,channel:l.current})),[n,a,o]);return r.jsx(m,{children:r.jsx(v.Provider,{value:i,children:t})})},exports.useBroadcastChannel=g,exports.useBroadcastProvider=()=>{const r=e.useContext(v);if(!r)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return r};
1
+ "use strict";var e=require("react"),t=require("react/jsx-runtime");const r="__INTERNAL__",s=()=>Math.random().toString(36).substr(2,9),n=(e,t)=>{const r=`${s()}-${e}-${t}`;return btoa(r).replace(/=+$/,"")},o=e=>!!e.expirationDate&&e.expirationDate<Date.now(),a=(e,t,r,s={})=>{var o;const a=Date.now();return{id:n(r,a),type:e,message:t,timestamp:a,source:r,expirationDate:null!==(o=s.expirationDate)&&void 0!==o?o:s.expirationDuration?a+s.expirationDuration:void 0}},c=(e,t,s="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${t}-${s}`}`);return`${r}:${e}:${n}`},l=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${r}:`)&&"string"==typeof e.source,i=(e,t,r)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const s=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(s,t,r||"");break;case"warn":console.warn(s,t,r||"");break;case"error":console.error(s,t,r||"")}},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={started:()=>i("info","Cleanup started"),completed:e=>i("info","Cleanup completed:",{removedCount:e})},f=e=>i("error","Error:",e),g="CLEAR_SENT_MESSAGES",h=(t,r={})=>{const{sourceName:n,cleaningInterval:i=1e3,keepLatestMessage:h=!1,registeredTypes:v=[],namespace:m="",deduplicationTTL:y=3e5,cleanupDebounceMs:C=0}=r,[E,b]=e.useState([]),[S,M]=e.useState([]),[w,x]=e.useState(null),B=e.useRef(null),D=e.useRef(new Map),$=e.useMemo((()=>n||`tab-${s()}`),[n]),A=e.useMemo((()=>({CLEAR_SENT_MESSAGES:c(g,t,m)})),[t,m]),T=e.useMemo((()=>`${t}-${m}`),[t,m]),_=e.useMemo((()=>v),[JSON.stringify(v)]),k=e.useCallback((()=>{b((e=>e.filter((e=>!o(e)))))}),[]),R=e.useRef(C>0?((e,t)=>{let r,s=null,n=null;const o=(...o)=>{n=o,null!==s&&clearTimeout(s),s=setTimeout((()=>{s=null,null!==n&&(r=e(...n),n=null)}),t)};return o.cancel=()=>{null!==s&&(clearTimeout(s),s=null,n=null)},o.flush=()=>(null!==s&&(clearTimeout(s),s=null,null!==n&&(r=e(...n),n=null)),r),o})(k,C):Object.assign(k,{cancel:()=>{}})).current,P=e.useCallback((e=>{x(e),setTimeout((()=>x(null)),3e3)}),[]),L=e.useCallback(((e,t,r={})=>{const s=B.current;if(!s){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f(e),void P(e)}try{const n=a(e,t,$,r);s.postMessage(n),d.sent(n),M((e=>[...e,n]))}catch(e){const t="Failed to send message";f(t),P(t)}}),[$,P]),N=e.useCallback(((e={})=>{const t=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);b((r=>t?r.filter((t=>!(e.ids&&e.ids.includes(t.id)||e.types&&e.types.includes(t.type)||e.sources&&e.sources.includes(t.source)))):[]))}),[]),j=e.useCallback(((e={})=>{var t,r,s;const{ids:n=[],types:o=[],sync:c=!1}=null!=e?e:{};M((e=>n.length>0||o.length>0?e.filter((e=>{if(e.source!==$)return!0;const t=0===n.length||n.includes(e.id),r=0===o.length||o.includes(e.type);return!(t&&r)})):[])),c&&(null===(t=B.current)||void 0===t||t.postMessage(a(A.CLEAR_SENT_MESSAGES,{ids:null!==(r=e.ids)&&void 0!==r?r:[],types:null!==(s=e.types)&&void 0!==s?s:[]},$)))}),[]),I=e.useCallback(((e={})=>{const{source:t,type:r}=e;for(let e=E.length-1;e>=0;e--){const s=E[e],n=!t||s.source===t,o=!r||s.type===r;if(n&&o)return s}return null}),[E]),G=e.useCallback((e=>{try{const t=e.data;if(d.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===$)return;if(l(t)&&t.type===A.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void b((s=>[...s.filter((s=>{if(s.source!==t.source)return!0;const n=0===e.length||e.includes(s.id),o=0===r.length||r.includes(s.type);return!(n&&o)}))]))}if(_.length>0&&!_.includes(t.type))return void d.ignored(t.type);if(o(t))return void d.expired(t.id);const r=Date.now(),s=D.current.get(t.id);if(s&&r-s<y)return void d.duplicate(t.id);D.current.set(t.id,r),b((e=>h?[t]:[...e,t]))}catch(e){const t="Error processing broadcast message";f(t),P(t)}}),[$,_,h,P,A,y]),O=e.useCallback((()=>{const e=B.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",G),e.close(),u.closed(T),B.current=null)}),[G,T]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f(e),void P(e)}const e=new BroadcastChannel(T);return B.current=e,u.created(T),e.addEventListener("message",G),()=>{O()}}),[T,G,P]),e.useEffect((()=>{if(i<=0)return;const e=setInterval((()=>{p.started();const e=E.length;R(),p.completed(e-E.length)}),i);return()=>{var t;clearInterval(e),C>0&&(null===(t=R.cancel)||void 0===t||t.call(R))}}),[i,R,C]),e.useEffect((()=>{const e=setInterval((()=>{const e=Date.now();for(const[t,r]of D.current.entries())e-r>=y&&D.current.delete(t)}),6e4);return()=>clearInterval(e)}),[y]),{channelName:T,messages:E,sentMessages:S,postMessage:L,clearReceivedMessages:N,clearSentMessages:j,getLatestMessage:I,error:w,closeChannel:O}},v=e.createContext(void 0);class m extends e.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("BroadcastChannel error:",e)}render(){return this.state.hasError?t.jsx("div",{children:"Error occurred in BroadcastProvider"}):this.props.children}}exports.BroadcastProvider=({children:r,channelName:s})=>{const{messages:n,error:o}=h(s),[a,c]=e.useState(null),l=e.useRef(null);e.useEffect((()=>{if("undefined"==typeof BroadcastChannel)return void c("BroadcastChannel is not supported in this browser. Please check browser compatibility.");const e=new BroadcastChannel(s);return l.current=e,()=>{e.close()}}),[s]);const i=e.useMemo((()=>({messages:n,error:a||o,channel:l.current})),[n,a,o]);return t.jsx(m,{children:t.jsx(v.Provider,{value:i,children:r})})},exports.useBroadcastChannel=h,exports.useBroadcastProvider=()=>{const t=e.useContext(v);if(!t)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return t};
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","isInternalType","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","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","channel","useRef","receivedMessageIds","Map","current","internalTypes","CLEAR_SENT_MESSAGES","resolvedChannelName","useMemo","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","setErrorMessage","postMessage","messageType","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","handleMessage","event","isValidMessage","isValidInternalClearMessage","receivedAt","get","set","useEffect","BroadcastChannel","bc","addEventListener","removeEventListener","close","interval","setInterval","before","clearInterval","call","entries","delete","BroadcastChannelContext","createContext","ErrorBoundary","React","Component","constructor","this","state","hasError","getDerivedStateFromError","componentDidCatch","render","_jsx","props","children","BroadcastProvider","hookError","value","Provider","useBroadcastProvider","context","useContext","Error"],"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","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","channel","useRef","receivedMessageIds","Map","useMemo","internalTypes","CLEAR_SENT_MESSAGES","resolvedChannelName","stableRegisteredTypes","JSON","stringify","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","postMessage","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","interval","setInterval","before","clearInterval","call","entries","delete","BroadcastChannelContext","createContext","ErrorBoundary","React","Component","constructor","this","state","hasError","getDerivedStateFromError","componentDidCatch","render","_jsx","props","children","BroadcastProvider","hookError","value","Provider","useBroadcastProvider","context","useContext","Error"],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import e,{useState as r,useRef as t,useMemo as n,useCallback as s,useEffect as o,createContext as a,useContext as c}from"react";import{jsx as l}from"react/jsx-runtime";const i="__INTERNAL__",u=()=>Math.random().toString(36).substr(2,9),d=(e,r)=>{const t=`${u()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},p=e=>!!e.expirationDate&&e.expirationDate<Date.now(),h=(e,r,t,n={})=>{var s;const o=Date.now();return{id:d(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.startsWith(`${i}:`),v=(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||"")}},m={created:e=>v("info","Channel created:",e),closed:e=>v("info","Channel closed:",e)},y={sent:e=>v("info","Message sent:",e),received:e=>v("info","Message received:",e),cleared:e=>v("info","Message cleared:",e),expired:e=>v("info","Message expired:",e),duplicate:e=>v("warn","Duplicate message ignored:",e),allSentCleared:()=>v("info","All sent messages cleared"),allReceivedCleared:()=>v("info","All received messages cleared")},E={started:()=>v("info","Cleanup started"),completed:e=>v("info","Cleanup completed:",{removedCount:e})},S=e=>v("error","Error:",e),C="CLEAR_SENT_MESSAGES",b=(e,a={})=>{const{sourceName:c,cleaningInterval:l=1e3,keepLatestMessage:i=!1,registeredTypes:d=[],namespace:v="",deduplicationTTL:b=3e5,cleanupDebounceMs:w=0}=a,[M,D]=r([]),[$,A]=r([]),[T,_]=r(null),B=t(null),x=t(new Map),L=t(c||`tab-${u()}`).current,N=t({CLEAR_SENT_MESSAGES:g(C,e,v)}).current,R=n((()=>`${e}-${v}`),[e,v]),P=s((()=>{D((e=>e.filter((e=>!p(e)))))}),[]),I=t(w>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})(P,w):Object.assign(P,{cancel:()=>{}})).current,k=s((e=>{_(e),setTimeout((()=>_(null)),3e3)}),[]),G=s(((e,r,t={})=>{const n=B.current;if(!n){const e="Channel not available";return S(e),void k(e)}try{const s=h(e,r,L,t);n.postMessage(s),y.sent(s),A((e=>[...e,s]))}catch(e){const r="Failed to send message";S(r),k(r)}}),[L,k]),j=s(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);D((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)))):[]))}),[]),O=s(((e={})=>{var r,t,n;const{ids:s=[],types:o=[],sync:a=!1}=null!=e?e:{};A((e=>s.length>0||o.length>0?e.filter((e=>{if(e.source!==L)return!0;const r=0===s.length||s.includes(e.id),t=0===o.length||o.includes(e.type);return!(r&&t)})):[])),a&&(null===(r=B.current)||void 0===r||r.postMessage(h(N.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},L)))}),[]),F=s((e=>{try{const r=e.data;if(y.received(r),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(r))return;if(r.source===L)return;if(!f(r.type)&&d.length>0&&!d.includes(r.type))return;if(p(r))return void y.expired(r.id);if((e=>e&&"object"==typeof e&&"string"==typeof e.type&&f(e.type)&&"string"==typeof e.source)(r)&&r.type===N.CLEAR_SENT_MESSAGES){const{ids:e=[],types:t=[]}=r.message||{};return void D((n=>n.filter((n=>{if(n.source!==r.source)return!0;const s=0===e.length||e.includes(n.id),o=0===t.length||t.includes(n.type);return!(s&&o)}))))}const t=Date.now(),n=x.current.get(r.id);if(n&&t-n<b)return void y.duplicate(r.id);x.current.set(r.id,t),D((e=>i?[r]:[...e,r]))}catch(e){const r="Error processing broadcast message";S(r),k(r)}}),[L,d,i,k,N,b]);return o((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return S(e),void k(e)}const e=new BroadcastChannel(R);return B.current=e,m.created(R),e.addEventListener("message",F),()=>{e.removeEventListener("message",F),e.close(),m.closed(R)}}),[R,F,k]),o((()=>{if(l<=0)return;const e=setInterval((()=>{E.started();const e=M.length;I(),E.completed(e-M.length)}),l);return()=>{var r;clearInterval(e),w>0&&(null===(r=I.cancel)||void 0===r||r.call(I))}}),[l,I,w]),o((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of x.current.entries())e-t>=b&&x.current.delete(r)}),6e4);return()=>clearInterval(e)}),[b]),{channelName:R,messages:M,sentMessages:$,postMessage:G,clearReceivedMessages:j,clearSentMessages:O,error:T}},w=a(void 0);class M extends e.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("BroadcastChannel error:",e)}render(){return this.state.hasError?l("div",{children:"Error occurred in BroadcastProvider"}):this.props.children}}const D=({children:r,channelName:s})=>{const{messages:a,error:c}=b(s),[i,u]=e.useState(null),d=t(null);o((()=>{if("undefined"==typeof BroadcastChannel)return void u("BroadcastChannel is not supported in this browser. Please check browser compatibility.");const e=new BroadcastChannel(s);return d.current=e,()=>{e.close()}}),[s]);const p=n((()=>({messages:a,error:i||c,channel:d.current})),[a,i,c]);return l(M,{children:l(w.Provider,{value:p,children:r})})},$=()=>{const e=c(w);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{D as BroadcastProvider,b as useBroadcastChannel,$ as useBroadcastProvider};
1
+ import e,{useState as r,useRef as t,useMemo as n,useCallback as s,useEffect as o,createContext as a,useContext as c}from"react";import{jsx as i}from"react/jsx-runtime";const l="__INTERNAL__",u=()=>Math.random().toString(36).substr(2,9),d=(e,r)=>{const t=`${u()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},p=e=>!!e.expirationDate&&e.expirationDate<Date.now(),g=(e,r,t,n={})=>{var s;const o=Date.now();return{id:d(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}},h=(e,r,t="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${r}-${t}`}`);return`${l}:${e}:${n}`},f=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${l}:`)&&"string"==typeof e.source,m=(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||"")}},v={created:e=>m("info","Channel created:",e),closed:e=>m("info","Channel closed:",e)},y={sent:e=>m("info","Message sent:",e),received:e=>m("info","Message received:",e),cleared:e=>m("info","Message cleared:",e),expired:e=>m("info","Message expired:",e),duplicate:e=>m("warn","Duplicate message ignored:",e),allSentCleared:()=>m("info","All sent messages cleared"),allReceivedCleared:()=>m("info","All received messages cleared"),ignored:e=>m("info","Message ignored due to type filter:",e)},E={started:()=>m("info","Cleanup started"),completed:e=>m("info","Cleanup completed:",{removedCount:e})},S=e=>m("error","Error:",e),C="CLEAR_SENT_MESSAGES",b=(e,a={})=>{const{sourceName:c,cleaningInterval:i=1e3,keepLatestMessage:l=!1,registeredTypes:d=[],namespace:m="",deduplicationTTL:b=3e5,cleanupDebounceMs:w=0}=a,[M,D]=r([]),[$,A]=r([]),[B,T]=r(null),_=t(null),x=t(new Map),L=n((()=>c||`tab-${u()}`),[c]),N=n((()=>({CLEAR_SENT_MESSAGES:h(C,e,m)})),[e,m]),P=n((()=>`${e}-${m}`),[e,m]),R=n((()=>d),[JSON.stringify(d)]),I=s((()=>{D((e=>e.filter((e=>!p(e)))))}),[]),k=t(w>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})(I,w):Object.assign(I,{cancel:()=>{}})).current,G=s((e=>{T(e),setTimeout((()=>T(null)),3e3)}),[]),j=s(((e,r,t={})=>{const n=_.current;if(!n){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return S(e),void G(e)}try{const s=g(e,r,L,t);n.postMessage(s),y.sent(s),A((e=>[...e,s]))}catch(e){const r="Failed to send message";S(r),G(r)}}),[L,G]),O=s(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);D((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)))):[]))}),[]),F=s(((e={})=>{var r,t,n;const{ids:s=[],types:o=[],sync:a=!1}=null!=e?e:{};A((e=>s.length>0||o.length>0?e.filter((e=>{if(e.source!==L)return!0;const r=0===s.length||s.includes(e.id),t=0===o.length||o.includes(e.type);return!(r&&t)})):[])),a&&(null===(r=_.current)||void 0===r||r.postMessage(g(N.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},L)))}),[]),J=s(((e={})=>{const{source:r,type:t}=e;for(let e=M.length-1;e>=0;e--){const n=M[e],s=!r||n.source===r,o=!t||n.type===t;if(s&&o)return n}return null}),[M]),U=s((e=>{try{const r=e.data;if(y.received(r),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(r))return;if(r.source===L)return;if(f(r)&&r.type===N.CLEAR_SENT_MESSAGES){const{ids:e=[],types:t=[]}=r.message||{};return void D((n=>[...n.filter((n=>{if(n.source!==r.source)return!0;const s=0===e.length||e.includes(n.id),o=0===t.length||t.includes(n.type);return!(s&&o)}))]))}if(R.length>0&&!R.includes(r.type))return void y.ignored(r.type);if(p(r))return void y.expired(r.id);const t=Date.now(),n=x.current.get(r.id);if(n&&t-n<b)return void y.duplicate(r.id);x.current.set(r.id,t),D((e=>l?[r]:[...e,r]))}catch(e){const r="Error processing broadcast message";S(r),G(r)}}),[L,R,l,G,N,b]),W=s((()=>{const e=_.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",U),e.close(),v.closed(P),_.current=null)}),[U,P]);return o((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return S(e),void G(e)}const e=new BroadcastChannel(P);return _.current=e,v.created(P),e.addEventListener("message",U),()=>{W()}}),[P,U,G]),o((()=>{if(i<=0)return;const e=setInterval((()=>{E.started();const e=M.length;k(),E.completed(e-M.length)}),i);return()=>{var r;clearInterval(e),w>0&&(null===(r=k.cancel)||void 0===r||r.call(k))}}),[i,k,w]),o((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of x.current.entries())e-t>=b&&x.current.delete(r)}),6e4);return()=>clearInterval(e)}),[b]),{channelName:P,messages:M,sentMessages:$,postMessage:j,clearReceivedMessages:O,clearSentMessages:F,getLatestMessage:J,error:B,closeChannel:W}},w=a(void 0);class M extends e.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("BroadcastChannel error:",e)}render(){return this.state.hasError?i("div",{children:"Error occurred in BroadcastProvider"}):this.props.children}}const D=({children:r,channelName:s})=>{const{messages:a,error:c}=b(s),[l,u]=e.useState(null),d=t(null);o((()=>{if("undefined"==typeof BroadcastChannel)return void u("BroadcastChannel is not supported in this browser. Please check browser compatibility.");const e=new BroadcastChannel(s);return d.current=e,()=>{e.close()}}),[s]);const p=n((()=>({messages:a,error:l||c,channel:d.current})),[a,l,c]);return i(M,{children:i(w.Provider,{value:p,children:r})})},$=()=>{const e=c(w);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{D as BroadcastProvider,b as useBroadcastChannel,$ 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","isInternalType","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","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","channel","useRef","receivedMessageIds","Map","current","internalTypes","CLEAR_SENT_MESSAGES","resolvedChannelName","useMemo","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","setErrorMessage","postMessage","messageType","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","handleMessage","event","isValidMessage","isValidInternalClearMessage","receivedAt","get","set","useEffect","BroadcastChannel","bc","addEventListener","removeEventListener","close","interval","setInterval","before","clearInterval","call","entries","delete","BroadcastChannelContext","createContext","ErrorBoundary","React","Component","constructor","this","state","hasError","getDerivedStateFromError","componentDidCatch","render","_jsx","props","children","BroadcastProvider","hookError","value","Provider","useBroadcastProvider","context","useContext","Error"],"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","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","channel","useRef","receivedMessageIds","Map","useMemo","internalTypes","CLEAR_SENT_MESSAGES","resolvedChannelName","stableRegisteredTypes","JSON","stringify","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","postMessage","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","interval","setInterval","before","clearInterval","call","entries","delete","BroadcastChannelContext","createContext","ErrorBoundary","React","Component","constructor","this","state","hasError","getDerivedStateFromError","componentDidCatch","render","_jsx","props","children","BroadcastProvider","hookError","value","Provider","useBroadcastProvider","context","useContext","Error"],"mappings":"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"}
@@ -53,6 +53,10 @@ export interface ClearReceivedMessagesOptions extends ClearOptions {
53
53
  export interface ClearSentMessagesOptions extends ClearOptions {
54
54
  sync?: boolean;
55
55
  }
56
+ export interface GetLatestMessageOptions {
57
+ source?: string;
58
+ type?: string;
59
+ }
56
60
  /**
57
61
  * Actions and state provided by the broadcast channel hook
58
62
  */
@@ -69,6 +73,10 @@ export interface BroadcastActions {
69
73
  clearReceivedMessages: (options?: ClearReceivedMessagesOptions) => void;
70
74
  /** Function to clear sent messages */
71
75
  clearSentMessages: (options?: ClearSentMessagesOptions) => void;
76
+ /** Function to get the latest message by source and type */
77
+ getLatestMessage: (options?: GetLatestMessageOptions) => BroadcastMessage | null;
78
+ /** Explicitly close the broadcast channel and remove listeners */
79
+ closeChannel: () => void;
72
80
  /** Current error state */
73
81
  error: string | null;
74
82
  }
@@ -11,6 +11,7 @@ export declare const debug: {
11
11
  duplicate: (messageId: string) => void;
12
12
  allSentCleared: () => void;
13
13
  allReceivedCleared: () => void;
14
+ ignored: (messageType: string) => void;
14
15
  };
15
16
  cleanup: {
16
17
  started: () => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-broadcast-sync",
3
- "version": "1.2.0",
3
+ "version": "1.3.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",
@@ -6,6 +6,7 @@ import {
6
6
  ClearMessage,
7
7
  ClearReceivedMessagesOptions,
8
8
  ClearSentMessagesOptions,
9
+ GetLatestMessageOptions,
9
10
  SendMessageOptions,
10
11
  } from '../types/types';
11
12
  import {
@@ -14,7 +15,6 @@ import {
14
15
  isMessageExpired,
15
16
  createMessage,
16
17
  getInternalMessageType,
17
- isInternalType,
18
18
  isValidInternalClearMessage,
19
19
  debounce,
20
20
  } from '../utils/messageUtils';
@@ -46,19 +46,24 @@ export const useBroadcastChannel = (
46
46
  // Refs
47
47
  const channel = useRef<BroadcastChannel | null>(null);
48
48
  const receivedMessageIds = useRef(new Map<string, number>());
49
- const source = useRef(sourceName || generateSourceName()).current;
50
- const internalTypes = useRef({
51
- CLEAR_SENT_MESSAGES: getInternalMessageType(
52
- INTERNAL_MESSAGE_TYPES.CLEAR_SENT_MESSAGES,
53
- channelName,
54
- namespace
55
- ),
56
- }).current;
49
+ const source = useMemo(() => sourceName || generateSourceName(), [sourceName]);
50
+ const internalTypes = useMemo(
51
+ () => ({
52
+ CLEAR_SENT_MESSAGES: getInternalMessageType(
53
+ INTERNAL_MESSAGE_TYPES.CLEAR_SENT_MESSAGES,
54
+ channelName,
55
+ namespace
56
+ ),
57
+ }),
58
+ [channelName, namespace]
59
+ );
57
60
 
58
61
  const resolvedChannelName = useMemo(() => {
59
62
  return `${channelName}-${namespace}`;
60
63
  }, [channelName, namespace]);
61
64
 
65
+ const stableRegisteredTypes = useMemo(() => registeredTypes, [JSON.stringify(registeredTypes)]);
66
+
62
67
  const performCleanup = useCallback(() => {
63
68
  setMessages(prev => prev.filter(msg => !isMessageExpired(msg)));
64
69
  }, []);
@@ -81,7 +86,8 @@ export const useBroadcastChannel = (
81
86
  (messageType: string, messageContent: any, options: SendMessageOptions = {}) => {
82
87
  const channelCurrent = channel.current;
83
88
  if (!channelCurrent) {
84
- const error = 'Channel not available';
89
+ const error =
90
+ 'BroadcastChannel is not supported in this browser. Please check browser compatibility.';
85
91
  debug.error(error);
86
92
  setErrorMessage(error);
87
93
  return;
@@ -150,6 +156,24 @@ export const useBroadcastChannel = (
150
156
  }
151
157
  }, []);
152
158
 
159
+ const getLatestMessage = useCallback(
160
+ (options: GetLatestMessageOptions = {}) => {
161
+ const { source, type } = options;
162
+
163
+ for (let i = messages.length - 1; i >= 0; i--) {
164
+ const msg = messages[i];
165
+ const sourceMatches = !source || msg.source === source;
166
+ const typeMatches = !type || msg.type === type;
167
+ if (sourceMatches && typeMatches) {
168
+ return msg;
169
+ }
170
+ }
171
+
172
+ return null;
173
+ },
174
+ [messages]
175
+ );
176
+
153
177
  const handleMessage = useCallback(
154
178
  (event: MessageEvent) => {
155
179
  try {
@@ -158,23 +182,12 @@ export const useBroadcastChannel = (
158
182
 
159
183
  if (!isValidMessage(message)) return;
160
184
  if (message.source === source) return;
161
- if (
162
- !isInternalType(message.type) &&
163
- registeredTypes.length > 0 &&
164
- !registeredTypes.includes(message.type)
165
- )
166
- return;
167
- if (isMessageExpired(message)) {
168
- debug.message.expired(message.id);
169
- return;
170
- }
171
-
172
185
  if (isValidInternalClearMessage(message)) {
173
186
  if (message.type === internalTypes.CLEAR_SENT_MESSAGES) {
174
187
  const { ids = [], types = [] } = (message as any).message || {};
175
188
 
176
- setMessages(prev =>
177
- prev.filter(msg => {
189
+ setMessages(prev => [
190
+ ...prev.filter(msg => {
178
191
  // Only consider messages from the same sender
179
192
  if (msg.source !== message.source) return true;
180
193
 
@@ -186,13 +199,21 @@ export const useBroadcastChannel = (
186
199
 
187
200
  // Remove when BOTH criteria match (wildcards included)
188
201
  return !(idMatches && typeMatches);
189
- })
190
- );
202
+ }),
203
+ ]);
191
204
 
192
205
  // After handling we don't want to process this internal control packet further
193
206
  return;
194
207
  }
195
208
  }
209
+ if (stableRegisteredTypes.length > 0 && !stableRegisteredTypes.includes(message.type)) {
210
+ debug.message.ignored(message.type);
211
+ return;
212
+ }
213
+ if (isMessageExpired(message)) {
214
+ debug.message.expired(message.id);
215
+ return;
216
+ }
196
217
 
197
218
  const now = Date.now();
198
219
  const receivedAt = receivedMessageIds.current.get(message.id);
@@ -209,9 +230,26 @@ export const useBroadcastChannel = (
209
230
  setErrorMessage(error);
210
231
  }
211
232
  },
212
- [source, registeredTypes, keepLatestMessage, setErrorMessage, internalTypes, deduplicationTTL]
233
+ [
234
+ source,
235
+ stableRegisteredTypes,
236
+ keepLatestMessage,
237
+ setErrorMessage,
238
+ internalTypes,
239
+ deduplicationTTL,
240
+ ]
213
241
  );
214
242
 
243
+ const closeChannel = useCallback(() => {
244
+ const bc = channel.current;
245
+ if (bc && typeof bc.close === 'function') {
246
+ bc.removeEventListener('message', handleMessage);
247
+ bc.close();
248
+ debug.channel.closed(resolvedChannelName);
249
+ channel.current = null;
250
+ }
251
+ }, [handleMessage, resolvedChannelName]);
252
+
215
253
  useEffect(() => {
216
254
  if (typeof BroadcastChannel === 'undefined') {
217
255
  const error =
@@ -227,9 +265,7 @@ export const useBroadcastChannel = (
227
265
 
228
266
  bc.addEventListener('message', handleMessage);
229
267
  return () => {
230
- bc.removeEventListener('message', handleMessage);
231
- bc.close();
232
- debug.channel.closed(resolvedChannelName);
268
+ closeChannel();
233
269
  };
234
270
  }, [resolvedChannelName, handleMessage, setErrorMessage]);
235
271
 
@@ -272,7 +308,9 @@ export const useBroadcastChannel = (
272
308
  postMessage,
273
309
  clearReceivedMessages,
274
310
  clearSentMessages,
311
+ getLatestMessage,
275
312
  error,
313
+ closeChannel,
276
314
  };
277
315
  };
278
316