react-broadcast-sync 1.2.1 → 1.4.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.4.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.3.0...v1.4.0) (2025-06-29)
2
+
3
+
4
+ ### Features
5
+
6
+ * ping for other sources ([794631a](https://github.com/IdanShalem/react-broadcast-sync/commit/794631ae118da61dd888b18ca3d960ae4869498d))
7
+
8
+ # [1.3.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.2.1...v1.3.0) (2025-06-16)
9
+
10
+
11
+ ### Features
12
+
13
+ * added getLatestMessage and closeChannel methods ([2ca0c32](https://github.com/IdanShalem/react-broadcast-sync/commit/2ca0c320c6558fd4205a8965d364d49c07609e97))
14
+
1
15
  ## [1.2.1](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.2.0...v1.2.1) (2025-06-11)
2
16
 
3
17
 
package/README.md CHANGED
@@ -70,6 +70,7 @@ Easily sync UI state or user events across browser tabs in React apps — notifi
70
70
  - Clear individual or all messages
71
71
  - Only accept allowed message types (optional)
72
72
  - `BroadcastProvider` for context-based usage
73
+ - **Ping and active source detection** (discover other tabs and their source names)
73
74
 
74
75
  ## Demo App
75
76
 
@@ -252,6 +253,8 @@ interface BroadcastActions {
252
253
  postMessage: (type: string, content: any, options?: SendMessageOptions) => void;
253
254
  clearReceivedMessages: (opts?: { ids?: string[]; types?: string[]; sources?: string[] }) => void;
254
255
  clearSentMessages: (opts?: { ids?: string[]; types?: string[]; sync?: boolean }) => void;
256
+ getLatestMessage: (opts?: { type?: string; source?: string }) => BroadcastMessage | null;
257
+ closeChannel: () => void;
255
258
  error: string | null; // Current error state
256
259
  }
257
260
  ```
@@ -268,6 +271,10 @@ Returns an object with:
268
271
  | `postMessage()` | `function` | Send a message to all tabs |
269
272
  | `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
273
  | `clearSentMessages()` | `function` | Clear messages this tab sent (same matching rules). Pass `sync: true` to broadcast the clear to other tabs. |
274
+ | `getLatestMessage()` | `function` | Get the latest message matching optional filters (`type`, `source`). Returns the most recent message that matches, or `null` if none. |
275
+ | `ping(timeoutMs?)` | `function` | Ping other tabs on the channel and collect their source names. `timeoutMs` (default: 300ms) controls how long to wait for responses before resolving. Returns a Promise of string array. |
276
+ | `isPingInProgress` | `boolean` | `true` while a ping is active, otherwise `false`. |
277
+ | `closeChannel()` | `function` | Explicitly closes the broadcast channel and removes event listeners. Safe to call multiple times. |
271
278
  | `error` | `string \| null` | Any runtime error from the channel |
272
279
 
273
280
  #### Clearing examples
@@ -310,6 +317,91 @@ interface BroadcastMessage {
310
317
  }
311
318
  ```
312
319
 
320
+ #### Getting the Latest Message
321
+
322
+ 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`.
323
+
324
+ **Signature:**
325
+
326
+ ```ts
327
+ getLatestMessage(options?: { type?: string; source?: string }): BroadcastMessage | null
328
+ ```
329
+
330
+ **Examples:**
331
+
332
+ ```tsx
333
+ // Get the latest message of any type/source
334
+ const latest = getLatestMessage();
335
+
336
+ // Get the latest message of a specific type
337
+ const latestAlert = getLatestMessage({ type: 'alert' });
338
+
339
+ // Get the latest message from a specific source
340
+ const latestFromTab = getLatestMessage({ source: 'tab-123' });
341
+
342
+ // Get the latest message of a specific type from a specific source
343
+ const latestInfoFromTab = getLatestMessage({ type: 'info', source: 'tab-123' });
344
+
345
+ // Check if there are any messages of a type
346
+ if (getLatestMessage({ type: 'notification' })) {
347
+ // ...
348
+ }
349
+ ```
350
+
351
+ **Behavior:**
352
+
353
+ - If no messages are present, returns `null`.
354
+ - If no message matches the filter, returns `null`.
355
+ - If multiple messages match, returns the most recently received one.
356
+
357
+ #### Ping & Active Source Detection
358
+
359
+ `useBroadcastChannel` provides a `ping` method and an `isPingInProgress` state for discovering active sources (tabs) on the same channel.
360
+
361
+ - **`ping(timeoutMs?: number): Promise<string[]>`**: Broadcasts a ping and collects responses from other tabs within the timeout. Returns an array of source names (excluding your own).
362
+ - **`isPingInProgress: boolean`**: Indicates if a ping is currently in progress.
363
+
364
+ **Example:**
365
+
366
+ ```tsx
367
+ const { ping, isPingInProgress } = useBroadcastChannel('my-channel', {
368
+ sourceName: 'my-tab',
369
+ });
370
+
371
+ // To discover other active sources:
372
+ const activeSources = await ping(300); // e.g., ['tab-2', 'tab-3']
373
+
374
+ // To show loading state:
375
+ if (isPingInProgress) {
376
+ // Show spinner or status
377
+ }
378
+ ```
379
+
380
+ #### Closing the Channel Explicitly
381
+
382
+ 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.
383
+
384
+ **Signature:**
385
+
386
+ ```ts
387
+ closeChannel(): void
388
+ ```
389
+
390
+ **Example:**
391
+
392
+ ```tsx
393
+ const { closeChannel } = useBroadcastChannel('my-channel');
394
+
395
+ // ... later, when you want to stop all communication:
396
+ closeChannel();
397
+ ```
398
+
399
+ **Notes:**
400
+
401
+ - After calling `closeChannel`, the channel is closed and will not send or receive any more messages.
402
+ - It is safe to call `closeChannel` multiple times (idempotent).
403
+ - You do not need to call this for normal React unmounting; the hook will clean up automatically. Use it for explicit/manual cleanup only.
404
+
313
405
  ---
314
406
 
315
407
  ## 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"),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&&"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 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"),ignored:e=>i("info","Message ignored due to type filter:",e)},p={inProgress:()=>i("warn","Ping already in progress. Skipping call.")},f={started:()=>i("info","Cleanup started"),completed:e=>i("info","Cleanup completed:",{removedCount:e})},g=e=>i("error","Error:",e),h="CLEAR_SENT_MESSAGES",v="PING",m="PONG";let y;if("test"===process.env.NODE_ENV)try{y=require("react-dom").flushSync}catch(e){}const C=(r,t={})=>{const{sourceName:n,cleaningInterval:i=1e3,keepLatestMessage:C=!1,registeredTypes:b=[],namespace:E="",deduplicationTTL:S=3e5,cleanupDebounceMs:P=0}=t,[M,w]=e.useState([]),[N,x]=e.useState([]),[B,D]=e.useState(null),[k,A]=e.useState(!1),T=e.useRef(null),$=e.useRef(new Map),_=e.useRef(null),G=e.useMemo((()=>n||`tab-${s()}`),[n]),R=e.useMemo((()=>({CLEAR_SENT_MESSAGES:c(h,r,E),PING:c(v,r,E),PONG:c(m,r,E)})),[r,E]),I=e.useMemo((()=>`${r}-${E}`),[r,E]),L=e.useMemo((()=>b),[JSON.stringify(b)]),O=e.useCallback((()=>{w((e=>e.filter((e=>!o(e)))))}),[]),j=e.useRef(P>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})(O,P):Object.assign(O,{cancel:()=>{}})).current,q=e.useCallback((e=>{D(e),setTimeout((()=>D(null)),3e3)}),[]),F=e.useCallback(((e=300)=>{if(k)return p.inProgress(),Promise.resolve([]);if(!T.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return g(e),q(e),Promise.resolve([])}y?y((()=>A(!0))):A(!0);const r=new Set;return _.current=r,T.current.postMessage(a(R.PING,null,G)),new Promise((t=>{setTimeout((()=>{A(!1),_.current===r&&(_.current=null),t(Array.from(r))}),e)}))}),[R.PING,G,q,k,y]),J=e.useCallback(((e,r,t={})=>{const s=T.current;if(!s){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return g(e),void q(e)}try{const n=a(e,r,G,t);s.postMessage(n),d.sent(n),x((e=>[...e,n]))}catch(e){const r="Failed to send message";g(r),q(r)}}),[G,q]),U=e.useCallback(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);w((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)))):[]))}),[]),V=e.useCallback(((e={})=>{var r,t,s;const{ids:n=[],types:o=[],sync:c=!1}=null!=e?e:{};x((e=>n.length>0||o.length>0?e.filter((e=>{if(e.source!==G)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=T.current)||void 0===r||r.postMessage(a(R.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(s=e.types)&&void 0!==s?s:[]},G)))}),[]),W=e.useCallback(((e={})=>{const{source:r,type:t}=e;for(let e=M.length-1;e>=0;e--){const s=M[e],n=!r||s.source===r,o=!t||s.type===t;if(n&&o)return s}return null}),[M]),z=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===G)return;if(l(t)){if(t.type===R.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void w((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(t.type===R.PING)return void(null===(r=T.current)||void 0===r||r.postMessage(a(R.PONG,null,G)));if(t.type===R.PONG){const e=t.source,r=_.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(L.length>0&&!L.includes(t.type))return void d.ignored(t.type);if(o(t))return void d.expired(t.id);const s=Date.now(),n=$.current.get(t.id);if(n&&s-n<S)return void d.duplicate(t.id);$.current.set(t.id,s),w((e=>C?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";g(r),q(r)}}),[G,L,C,q,R,S]),H=e.useCallback((()=>{const e=T.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",z),e.close(),u.closed(I),T.current=null)}),[z,I]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return g(e),void q(e)}const e=new BroadcastChannel(I);return T.current=e,u.created(I),e.addEventListener("message",z),()=>{H()}}),[I,z,q]),e.useEffect((()=>{if(i<=0)return;const e=setInterval((()=>{f.started();const e=M.length;j(),f.completed(e-M.length)}),i);return()=>{var r;clearInterval(e),P>0&&(null===(r=j.cancel)||void 0===r||r.call(j))}}),[i,j,P]),e.useEffect((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of $.current.entries())e-t>=S&&$.current.delete(r)}),6e4);return()=>clearInterval(e)}),[S]),{channelName:I,messages:M,sentMessages:N,isPingInProgress:k,ping:F,postMessage:J,clearReceivedMessages:U,clearSentMessages:V,getLatestMessage:W,error:B,closeChannel:H}},b=e.createContext(void 0);class E 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}=C(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(E,{children:r.jsx(b.Provider,{value:i,children:t})})},exports.useBroadcastChannel=C,exports.useBroadcastProvider=()=>{const r=e.useContext(b);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","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","inProgress","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","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","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","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":"mEAEA,MAAMA,EAAkB,eAIXC,EAAqBA,IAAMC,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,GAMhEC,EAAoBA,CAACC,EAAgBC,KAChD,MAAMC,EAAM,GAAGR,OAAwBM,KAAUC,IACjD,OAAOE,KAAKD,GAAKE,QAAQ,MAAO,KASrBC,EAAoBC,KACxBA,EAAQC,gBAAiBD,EAAQC,eAAiBC,KAAKC,MAInDC,EAAgBA,CAC3BC,EACAC,EACAZ,EACAa,EAAoE,CAAA,WAEpE,MAAMZ,EAAYO,KAAKC,MACvB,MAAO,CACLK,GAAIf,EAAkBC,EAAQC,GAC9BU,OACAL,QAASM,EACTX,YACAD,SACAO,eAEE,UADAM,EAAQN,sBACR,IAAAQ,EAAAA,EAACF,EAAQG,mBAAqBf,EAAYY,EAAQG,wBAAqBC,IAIhEC,EAAyBA,CACpCC,EACAC,EACAC,EAAY,MAEZ,MAEMC,EAAOnB,KADC,wBAAagB,KADP,GAAGC,KAAeC,OAGtC,MAAO,GAAG5B,KAAmB0B,KAAYG,KAO9BC,EAA+BjB,GAExCA,GACmB,iBAAZA,GACiB,iBAAjBA,EAAQK,MACAL,EAAQK,KARba,WAAW,GAAG/B,OASE,iBAAnBa,EAAQN,OCzDbyB,EAAMA,CAACC,EAAiBpB,EAAiBqB,KAC7C,GATuB,oBAAZC,UAA2BA,QAAQC,KACK,SAA1CD,QAAQC,IAAIC,0BAQD,OAEpB,MACMC,EAAS,KADG,IAAIvB,MAAOwB,wCAE7B,OAAQN,GACN,IAAK,OACHO,QAAQR,IAAIM,EAAQzB,EAASqB,GAAQ,IACrC,MACF,IAAK,OACHM,QAAQC,KAAKH,EAAQzB,EAASqB,GAAQ,IACtC,MACF,IAAK,QACHM,QAAQE,MAAMJ,EAAQzB,EAASqB,GAAQ,MAKhCS,EACF,CACPC,QAAUC,GAAiBb,EAAI,OAAQ,mBAAoBa,GAC3DC,OAASD,GAAiBb,EAAI,OAAQ,kBAAmBa,IAHhDF,EAKF,CACPI,KAAOlC,GAAiBmB,EAAI,OAAQ,gBAAiBnB,GACrDmC,SAAWnC,GAAiBmB,EAAI,OAAQ,oBAAqBnB,GAC7DoC,QAAUC,GAAsBlB,EAAI,OAAQ,mBAAoBkB,GAChEC,QAAUD,GAAsBlB,EAAI,OAAQ,mBAAoBkB,GAChEE,UAAYF,GAAsBlB,EAAI,OAAQ,6BAA8BkB,GAC5EG,eAAgBA,IAAMrB,EAAI,OAAQ,6BAClCsB,mBAAoBA,IAAMtB,EAAI,OAAQ,iCACtCuB,QAAUC,GACRxB,EAAI,OAAQ,sCAAuCwB,IAd5Cb,EAgBL,CACJc,WAAYA,IAAMzB,EAAI,OAAQ,6CAjBrBW,EAmBF,CACPe,QAASA,IAAM1B,EAAI,OAAQ,mBAC3B2B,UAAYC,GAAyB5B,EAAI,OAAQ,qBAAsB,CAAE4B,kBArBhEjB,EAuBHD,GAAkBV,EAAI,QAAS,SAAUU,GC9B7CmB,EACiB,sBADjBA,EAEE,OAFFA,EAGE,OAGR,IAAIC,EACJ,GAA6B,SAAzB3B,QAAQC,IAAI2B,SACd,IAEED,EAAcE,QAAQ,aAAaC,SACpC,CAAC,MAAA3C,GACA,CAIG,MAAM4C,EAAsBA,CACjCvC,EACAP,EAA4B,MAE5B,MAAM+C,WACJA,EAAUC,iBACVA,EAAmB,IAAIC,kBACvBA,GAAoB,EAAKC,gBACzBA,EAAkB,GAAE1C,UACpBA,EAAY,GAAE2C,iBACdA,EAAmB,IAAaC,kBAChCA,EAAoB,GAClBpD,GAGGqD,EAAUC,GAAeC,EAAAA,SAA6B,KACtDC,EAAcC,GAAmBF,EAAAA,SAA6B,KAC9DjC,EAAOoC,GAAYH,EAAAA,SAAwB,OAC3CI,EAAkBC,GAAuBL,EAAAA,UAAS,GAGnDM,EAAUC,EAAMA,OAA0B,MAC1CC,EAAqBD,EAAAA,OAAO,IAAIE,KAChCC,EAAyBH,EAAMA,OAAqB,MAGpD3E,EAAS+E,EAAAA,SAAQ,IAAMnB,GFvDS,OAAOlE,OEuDoB,CAACkE,IAC5DoB,EAAgBD,EAAAA,SACpB,KAAO,CACLE,oBAAqB/D,EACnBoC,EACAlC,EACAC,GAEF6D,KAAMhE,EAAuBoC,EAA6BlC,EAAaC,GACvE8D,KAAMjE,EAAuBoC,EAA6BlC,EAAaC,MAEzE,CAACD,EAAaC,IAGV+D,EAAsBL,EAAAA,SAAQ,IAC3B,GAAG3D,KAAeC,KACxB,CAACD,EAAaC,IAEXgE,EAAwBN,EAAOA,SAAC,IAAMhB,GAAiB,CAACuB,KAAKC,UAAUxB,KAEvEyB,EAAiBC,EAAAA,aAAY,KACjCtB,GAAYuB,GAAQA,EAAKC,QAAOC,IAAQvF,EAAiBuF,SACxD,IAEGC,EAAmBlB,EAAAA,OAIvBV,EAAoB,EFpBA6B,EACtBC,EACAC,KAKA,IAEIC,EAFAC,EAAkD,KAClDC,EAAiC,KAGrC,MAAMC,EAAYA,IAAIC,KACpBF,EAAWE,EACO,OAAdH,GACFI,aAAaJ,GAEfA,EAAYK,YAAW,KACrBL,EAAY,KACK,OAAbC,IACFF,EAASF,KAAMI,GACfA,EAAW,QAEZH,IAuBL,OApBAI,EAAUI,OAAS,KACC,OAAdN,IACFI,aAAaJ,GACbA,EAAY,KACZC,EAAW,OAIfC,EAAUK,MAAQ,KACE,OAAdP,IACFI,aAAaJ,GACbA,EAAY,KACK,OAAbC,IACFF,EAASF,KAAMI,GACfA,EAAW,OAGRF,GAGFG,GExBDN,CAASN,EAAgBvB,GACzByC,OAAOC,OAAOnB,EAAgB,CAAEgB,OAAQA,UAC5CI,QAEIC,EAAkBpB,EAAWA,aAAEtD,IACnCoC,EAASpC,GACToE,YAAW,IAAMhC,EAAS,OAAO,OAChC,IAEGuC,EAAOrB,EAAAA,aACX,CAACsB,EAAoB,OACnB,GAAIvC,EAEF,OADApC,EAAWc,aACJ8D,QAAQC,QAAQ,IAGzB,IAAKvC,EAAQkC,QAAS,CACpB,MAAMzE,EACJ,yFAGF,OAFAC,EAAYD,GACZ0E,EAAgB1E,GACT6E,QAAQC,QAAQ,GACzB,CAGI1D,EACFA,GAAY,IAAMkB,GAAoB,KAEtCA,GAAoB,GAEtB,MAAMyC,EAAY,IAAIC,IAKtB,OAJArC,EAAuB8B,QAAUM,EAEjCxC,EAAQkC,QAAQQ,YAAY1G,EAAcsE,EAAcE,KAAM,KAAMlF,IAE7D,IAAIgH,SAAQC,IACjBV,YAAW,KACT9B,GAAoB,GAChBK,EAAuB8B,UAAYM,IACrCpC,EAAuB8B,QAAU,MAEnCK,EAAQI,MAAMC,KAAKJ,MAClBH,QAGP,CAAC/B,EAAcE,KAAMlF,EAAQ6G,EAAiBrC,EAAkBjB,IAG5D6D,EAAc3B,EAAAA,aAClB,CAACxC,EAAqBsE,EAAqB1G,EAA8B,MACvE,MAAM2G,EAAiB9C,EAAQkC,QAC/B,IAAKY,EAAgB,CACnB,MAAMrF,EACJ,yFAGF,OAFAC,EAAYD,QACZ0E,EAAgB1E,EAElB,CAEA,IACE,MAAM7B,EAAUI,EAAcuC,EAAasE,EAAgBvH,EAAQa,GACnE2G,EAAeJ,YAAY9G,GAC3B8B,EAAcI,KAAKlC,GACnBgE,GAAgBoB,GAAQ,IAAIA,EAAMpF,IACnC,CAAC,MAAOmH,GACP,MAAMtF,EAAQ,yBACdC,EAAYD,GACZ0E,EAAgB1E,EAClB,IAEF,CAACnC,EAAQ6G,IAGLa,EAAwBjC,EAAAA,aAAY,CAAC5E,EAAwC,CAAA,KACjF,MAAM8G,EAAaC,QAChB/G,EAAQgH,KAAOhH,EAAQgH,IAAIC,QACzBjH,EAAQkH,OAASlH,EAAQkH,MAAMD,QAC/BjH,EAAQmH,SAAWnH,EAAQmH,QAAQF,QAGxC3D,GAAYuB,GACViC,EACIjC,EAAKC,QACHC,KACI/E,EAAQgH,KAAOhH,EAAQgH,IAAII,SAASrC,EAAI9E,KACxCD,EAAQkH,OAASlH,EAAQkH,MAAME,SAASrC,EAAIjF,OAC5CE,EAAQmH,SAAWnH,EAAQmH,QAAQC,SAASrC,EAAI5F,WAEtD,OAEL,IAEGkI,EAAoBzC,EAAAA,aAAY,CAAC5E,EAAoC,CAAA,eACzE,MAAMgH,IAAEA,EAAM,GAAEE,MAAEA,EAAQ,GAAEI,KAAEA,GAAO,GAAUtH,QAAAA,EAAW,CAAE,EAC5DyD,GAAgBoB,GACdmC,EAAIC,OAAS,GAAKC,EAAMD,OAAS,EAC7BpC,EAAKC,QAAOC,IAEV,GAAIA,EAAI5F,SAAWA,EAAQ,OAAO,EAKlC,MAAMoI,EAA2B,IAAfP,EAAIC,QAAgBD,EAAII,SAASrC,EAAI9E,IACjDuH,EAA+B,IAAjBN,EAAMD,QAAgBC,EAAME,SAASrC,EAAIjF,MAG7D,QAASyH,GAAaC,MAExB,KAEFF,IACa,QAAfpH,EAAA2D,EAAQkC,eAAO,IAAA7F,GAAAA,EAAEqG,YACf1G,EACEsE,EAAcC,oBACd,CAAE4C,YAAKS,EAAAzH,EAAQgH,mBAAO,GAAIE,MAAoB,UAAblH,EAAQkH,aAAK,IAAAQ,EAAAA,EAAI,IAClDvI,OAIL,IAEGwI,EAAmB/C,EAAAA,aACvB,CAAC5E,EAAmC,CAAA,KAClC,MAAMb,OAAEA,EAAMW,KAAEA,GAASE,EAEzB,IAAK,IAAI4H,EAAIvE,EAAS4D,OAAS,EAAGW,GAAK,EAAGA,IAAK,CAC7C,MAAM7C,EAAM1B,EAASuE,GACfC,GAAiB1I,GAAU4F,EAAI5F,SAAWA,EAC1CqI,GAAe1H,GAAQiF,EAAIjF,OAASA,EAC1C,GAAI+H,GAAiBL,EACnB,OAAOzC,CAEX,CAEA,OAAO,OAET,CAAC1B,IAGGyE,EAAgBlD,EAAWA,aAC9BmD,UACC,IACE,MAAMtI,EAA4BsI,EAAMjH,KAGxC,GAFAS,EAAcK,SAASnC,IF3NAA,IACtBsH,QAAQtH,GAA8B,iBAAZA,GAAwB,OAAQA,GE4NtDuI,CAAevI,GAAU,OAC9B,GAAIA,EAAQN,SAAWA,EAAQ,OAC/B,GAAIuB,EAA4BjB,GAAU,CACxC,GAAIA,EAAQK,OAASqE,EAAcC,oBAAqB,CACtD,MAAM4C,IAAEA,EAAM,GAAEE,MAAEA,EAAQ,IAAQzH,EAAgBA,SAAW,CAAE,EAiB/D,YAfA6D,GAAYuB,GAAQ,IACfA,EAAKC,QAAOC,IAEb,GAAIA,EAAI5F,SAAWM,EAAQN,OAAQ,OAAO,EAK1C,MAAMoI,EAA2B,IAAfP,EAAIC,QAAgBD,EAAII,SAASrC,EAAI9E,IACjDuH,EAA+B,IAAjBN,EAAMD,QAAgBC,EAAME,SAASrC,EAAIjF,MAE7D,QAASyH,GAAaC,QAK5B,CACA,GAAI/H,EAAQK,OAASqE,EAAcE,KAEjC,YADiB,QAAjBnE,EAAA2D,EAAQkC,eAAS,IAAA7F,GAAAA,EAAAqG,YAAY1G,EAAcsE,EAAcG,KAAM,KAAMnF,KAIvE,GAAIM,EAAQK,OAASqE,EAAcG,KAAM,CACvC,MAAM2D,EAAaxI,EAAQN,OACrBkH,EAAYpC,EAAuB8B,QAMzC,YAJIM,IAA2C,IAA9BA,EAAU6B,IAAID,IAC7B5B,EAAU8B,IAAIF,GAIlB,CACF,CACA,GAAIzD,EAAsByC,OAAS,IAAMzC,EAAsB4C,SAAS3H,EAAQK,MAE9E,YADAyB,EAAcY,QAAQ1C,EAAQK,MAGhC,GAAIN,EAAiBC,GAEnB,YADA8B,EAAcQ,QAAQtC,EAAQQ,IAIhC,MAAML,EAAMD,KAAKC,MACXwI,EAAarE,EAAmBgC,QAAQsC,IAAI5I,EAAQQ,IAC1D,GAAImI,GAAcxI,EAAMwI,EAAajF,EAEnC,YADA5B,EAAcS,UAAUvC,EAAQQ,IAIlC8D,EAAmBgC,QAAQuC,IAAI7I,EAAQQ,GAAIL,GAC3C0D,GAAYuB,GAAS5B,EAAoB,CAACxD,GAAW,IAAIoF,EAAMpF,IAChE,CAAC,MAAOmH,GACP,MAAMtF,EAAQ,qCACdC,EAAYD,GACZ0E,EAAgB1E,EAClB,IAEF,CACEnC,EACAqF,EACAvB,EACA+C,EACA7B,EACAhB,IAIEoF,EAAe3D,EAAAA,aAAY,KAC/B,MAAM4D,EAAK3E,EAAQkC,QACfyC,GAA0B,mBAAbA,EAAGC,QAClBD,EAAGE,oBAAoB,UAAWZ,GAClCU,EAAGC,QACHlH,EAAcG,OAAO6C,GACrBV,EAAQkC,QAAU,QAEnB,CAAC+B,EAAevD,IAqDnB,OAnDAoE,EAAAA,WAAU,KACR,GAAgC,oBAArBC,iBAAkC,CAC3C,MAAMtH,EACJ,yFAGF,OAFAC,EAAYD,QACZ0E,EAAgB1E,EAElB,CAEA,MAAMkH,EAAK,IAAII,iBAAiBrE,GAKhC,OAJAV,EAAQkC,QAAUyC,EAClBjH,EAAcC,QAAQ+C,GAEtBiE,EAAGK,iBAAiB,UAAWf,GACxB,KACLS,OAED,CAAChE,EAAqBuD,EAAe9B,IAExC2C,EAAAA,WAAU,KACR,GAAI3F,GAAoB,EAAG,OAE3B,MAAM8F,EAAWC,aAAY,KAC3BxH,EAAce,UACd,MAAM0G,EAAS3F,EAAS4D,OACxBjC,IACAzD,EAAcgB,UAAUyG,EAAS3F,EAAS4D,UACzCjE,GAEH,MAAO,WACLiG,cAAcH,GAEV1F,EAAoB,IACC,QAAvBlD,EAAA8E,EAAiBW,cAAM,IAAAzF,GAAAA,EAAAgJ,KAAAlE,OAG1B,CAAChC,EAAkBgC,EAAkB5B,IAExCuF,EAAAA,WAAU,KACR,MAAMG,EAAWC,aAAY,KAC3B,MAAMnJ,EAAMD,KAAKC,MACjB,IAAK,MAAOK,EAAIb,KAAc2E,EAAmBgC,QAAQoD,UACnDvJ,EAAMR,GAAa+D,GACrBY,EAAmBgC,QAAQqD,OAAOnJ,KAGrC,KAEH,MAAO,IAAMgJ,cAAcH,KAC1B,CAAC3F,IAEG,CACL5C,YAAagE,EACblB,WACAG,eACAG,mBACAsC,OACAM,cACAM,wBACAQ,oBACAM,mBACArG,QACAiH,iBCtXEc,EAA0BC,EAAaA,mBAAoClJ,GAMjF,MAAMmJ,UAAsBC,EAAMC,UAAlCC,WAAAA,uBACEC,KAAAC,MAAQ,CAAEC,UAAU,EAgBtB,CAdE,+BAAOC,GACL,MAAO,CAAED,UAAU,EACrB,CAEAE,iBAAAA,CAAkBzI,GAChBF,QAAQE,MAAM,0BAA2BA,EAC3C,CAEA0I,MAAAA,GACE,OAAIL,KAAKC,MAAMC,SACNI,EAAAA,4DAEFN,KAAKO,MAAMC,QACpB,4BAQiEC,EAAGD,WAAU5J,kBAC9E,MAAM8C,SAAEA,EAAU/B,MAAO+I,GAAcvH,EAAoBvC,IAEpDe,EAAOoC,GAAY8F,EAAMjG,SAAwB,MAClDM,EAAUC,EAAMA,OAA0B,MAEhD6E,EAAAA,WAAU,KACR,GAAgC,oBAArBC,iBAIT,YAHAlF,EACE,0FAIJ,MAAM8E,EAAK,IAAII,iBAAiBrI,GAGhC,OAFAsD,EAAQkC,QAAUyC,EAEX,KACLA,EAAGC,WAEJ,CAAClI,IAEJ,MAAM+J,EAAQpG,EAAAA,SACZ,KAAO,CAAEb,WAAU/B,MAAOA,GAAS+I,EAAWxG,QAASA,EAAQkC,WAC/D,CAAC1C,EAAU/B,EAAO+I,IAGpB,OACEJ,EAAAA,IAACV,EACC,CAAAY,SAAAF,EAAAA,IAACZ,EAAwBkB,SAAS,CAAAD,MAAOA,EAAKH,SAAGA,kEAKnBK,KAClC,MAAMC,EAAUC,EAAUA,WAACrB,GAC3B,IAAKoB,EACH,MAAM,IAAIE,MAAM,gEAElB,OAAOF"}
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 c,useContext as i}from"react";import{jsx as a}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}},f=(e,r,t="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${r}-${t}`}`);return`${l}:${e}:${n}`},h=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={inProgress:()=>m("warn","Ping already in progress. Skipping call.")},S={started:()=>m("info","Cleanup started"),completed:e=>m("info","Cleanup completed:",{removedCount:e})},P=e=>m("error","Error:",e),b="CLEAR_SENT_MESSAGES",w="PING",C="PONG";let M;if("test"===process.env.NODE_ENV)try{M=require("react-dom").flushSync}catch(e){}const N=(e,c={})=>{const{sourceName:i,cleaningInterval:a=1e3,keepLatestMessage:l=!1,registeredTypes:d=[],namespace:m="",deduplicationTTL:N=3e5,cleanupDebounceMs:D=0}=c,[A,B]=r([]),[T,$]=r([]),[_,G]=r(null),[I,x]=r(!1),L=t(null),O=t(new Map),R=t(null),k=n((()=>i||`tab-${u()}`),[i]),j=n((()=>({CLEAR_SENT_MESSAGES:f(b,e,m),PING:f(w,e,m),PONG:f(C,e,m)})),[e,m]),F=n((()=>`${e}-${m}`),[e,m]),q=n((()=>d),[JSON.stringify(d)]),J=s((()=>{B((e=>e.filter((e=>!p(e)))))}),[]),U=t(D>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})(J,D):Object.assign(J,{cancel:()=>{}})).current,V=s((e=>{G(e),setTimeout((()=>G(null)),3e3)}),[]),W=s(((e=300)=>{if(I)return E.inProgress(),Promise.resolve([]);if(!L.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return P(e),V(e),Promise.resolve([])}M?M((()=>x(!0))):x(!0);const r=new Set;return R.current=r,L.current.postMessage(g(j.PING,null,k)),new Promise((t=>{setTimeout((()=>{x(!1),R.current===r&&(R.current=null),t(Array.from(r))}),e)}))}),[j.PING,k,V,I,M]),z=s(((e,r,t={})=>{const n=L.current;if(!n){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return P(e),void V(e)}try{const s=g(e,r,k,t);n.postMessage(s),y.sent(s),$((e=>[...e,s]))}catch(e){const r="Failed to send message";P(r),V(r)}}),[k,V]),H=s(((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)))):[]))}),[]),K=s(((e={})=>{var r,t,n;const{ids:s=[],types:o=[],sync:c=!1}=null!=e?e:{};$((e=>s.length>0||o.length>0?e.filter((e=>{if(e.source!==k)return!0;const r=0===s.length||s.includes(e.id),t=0===o.length||o.includes(e.type);return!(r&&t)})):[])),c&&(null===(r=L.current)||void 0===r||r.postMessage(g(j.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},k)))}),[]),Q=s(((e={})=>{const{source:r,type:t}=e;for(let e=A.length-1;e>=0;e--){const n=A[e],s=!r||n.source===r,o=!t||n.type===t;if(s&&o)return n}return null}),[A]),X=s((e=>{var r;try{const t=e.data;if(y.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===k)return;if(h(t)){if(t.type===j.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),o=0===r.length||r.includes(n.type);return!(s&&o)}))]))}if(t.type===j.PING)return void(null===(r=L.current)||void 0===r||r.postMessage(g(j.PONG,null,k)));if(t.type===j.PONG){const e=t.source,r=R.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(q.length>0&&!q.includes(t.type))return void y.ignored(t.type);if(p(t))return void y.expired(t.id);const n=Date.now(),s=O.current.get(t.id);if(s&&n-s<N)return void y.duplicate(t.id);O.current.set(t.id,n),B((e=>l?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";P(r),V(r)}}),[k,q,l,V,j,N]),Y=s((()=>{const e=L.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",X),e.close(),v.closed(F),L.current=null)}),[X,F]);return o((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return P(e),void V(e)}const e=new BroadcastChannel(F);return L.current=e,v.created(F),e.addEventListener("message",X),()=>{Y()}}),[F,X,V]),o((()=>{if(a<=0)return;const e=setInterval((()=>{S.started();const e=A.length;U(),S.completed(e-A.length)}),a);return()=>{var r;clearInterval(e),D>0&&(null===(r=U.cancel)||void 0===r||r.call(U))}}),[a,U,D]),o((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of O.current.entries())e-t>=N&&O.current.delete(r)}),6e4);return()=>clearInterval(e)}),[N]),{channelName:F,messages:A,sentMessages:T,isPingInProgress:I,ping:W,postMessage:z,clearReceivedMessages:H,clearSentMessages:K,getLatestMessage:Q,error:_,closeChannel:Y}},D=c(void 0);class A 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?a("div",{children:"Error occurred in BroadcastProvider"}):this.props.children}}const B=({children:r,channelName:s})=>{const{messages:c,error:i}=N(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:c,error:l||i,channel:d.current})),[c,l,i]);return a(A,{children:a(D.Provider,{value:p,children:r})})},T=()=>{const e=i(D);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{B as BroadcastProvider,N 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","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","inProgress","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","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","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","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
  */
@@ -63,13 +67,22 @@ export interface BroadcastActions {
63
67
  messages: BroadcastMessage[];
64
68
  /** Array of sent messages */
65
69
  sentMessages: BroadcastMessage[];
70
+ /** Whether a ping operation is currently in progress */
71
+ isPingInProgress: boolean;
72
+ /** Function to ping the channel and get active sources */
73
+ ping: (timeoutMs?: number) => Promise<string[]>;
66
74
  /** Function to send a message */
67
75
  postMessage: (messageType: string, messageContent: any, options?: SendMessageOptions) => void;
68
76
  /** Function to clear received messages */
69
77
  clearReceivedMessages: (options?: ClearReceivedMessagesOptions) => void;
70
78
  /** Function to clear sent messages */
71
79
  clearSentMessages: (options?: ClearSentMessagesOptions) => void;
80
+ /** Function to get the latest message by source and type */
81
+ getLatestMessage: (options?: GetLatestMessageOptions) => BroadcastMessage | null;
82
+ /** Explicitly close the broadcast channel and remove listeners */
83
+ closeChannel: () => void;
72
84
  /** Current error state */
73
85
  error: string | null;
74
86
  }
75
87
  export type ClearMessage = 'CLEAR_SENT_MESSAGES';
88
+ export type InternalMessage = ClearMessage | 'PING' | 'PONG';
@@ -11,6 +11,10 @@ export declare const debug: {
11
11
  duplicate: (messageId: string) => void;
12
12
  allSentCleared: () => void;
13
13
  allReceivedCleared: () => void;
14
+ ignored: (messageType: string) => void;
15
+ };
16
+ ping: {
17
+ inProgress: () => void;
14
18
  };
15
19
  cleanup: {
16
20
  started: () => void;
@@ -1,4 +1,4 @@
1
- import { ClearMessage } from '../types/types';
1
+ import { InternalMessage } from '../types/types';
2
2
  export declare const generateRandomPart: () => string;
3
3
  export declare const generateSourceName: () => string;
4
4
  export declare const generateMessageId: (source: string, timestamp: number) => string;
@@ -10,7 +10,7 @@ export declare const createMessage: (type: string, content: any, source: string,
10
10
  expirationDate?: number;
11
11
  expirationDuration?: number;
12
12
  }) => any;
13
- export declare const getInternalMessageType: (baseType: ClearMessage, channelName: string, namespace?: string) => string;
13
+ export declare const getInternalMessageType: (baseType: InternalMessage, channelName: string, namespace?: string) => string;
14
14
  export declare const isInternalType: (type: string) => boolean;
15
15
  export declare const isValidInternalClearMessage: (message: any) => boolean;
16
16
  export declare const debounce: <T extends (...args: any[]) => any>(fn: T, wait: number) => ((...args: Parameters<T>) => void) & {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-broadcast-sync",
3
- "version": "1.2.1",
3
+ "version": "1.4.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",