react-broadcast-sync 1.5.0 → 1.6.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.6.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.5.1...v1.6.0) (2025-09-03)
2
+
3
+
4
+ ### Features
5
+
6
+ * improve error messaging for debug mode ([3a1016f](https://github.com/IdanShalem/react-broadcast-sync/commit/3a1016f45244f412eaa96d8ca8310b5ca72cd73a))
7
+
8
+ ## [1.5.1](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.5.0...v1.5.1) (2025-07-03)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * added readme for batching ([568a52c](https://github.com/IdanShalem/react-broadcast-sync/commit/568a52c4d23443a1e4c2a0c2ab10a6c618c68529))
14
+
1
15
  # [1.5.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.4.0...v1.5.0) (2025-07-03)
2
16
 
3
17
 
package/README.md CHANGED
@@ -228,20 +228,24 @@ interface BroadcastOptions {
228
228
  namespace?: string; // Channel namespace for isolation
229
229
  deduplicationTTL?: number; // Time in ms to keep message IDs for deduplication (default: 5 minutes)
230
230
  cleanupDebounceMs?: number; // Debounce time in ms for cleanup operations (default: 0)
231
+ batchingDelayMs?: number; // Delay in ms to batch outgoing messages (default: 20). If > 0, messages are batched and sent together.
232
+ excludedBatchMessageTypes?: string[]; // Message types to always send immediately, never batched (default: []).
231
233
  }
232
234
  ```
233
235
 
234
236
  #### Default Values
235
237
 
236
- | Option | Default Value | Description |
237
- | ------------------- | ------------- | ----------------------------------- |
238
- | `sourceName` | `undefined` | Auto-generated if not provided |
239
- | `cleaningInterval` | `1000` | 1 second between cleanup runs |
240
- | `keepLatestMessage` | `false` | Keep all messages by default |
241
- | `registeredTypes` | `[]` | Accept all message types by default |
242
- | `namespace` | `''` | No namespace by default |
243
- | `deduplicationTTL` | `300000` | 5 minutes (5 _ 60 _ 1000 ms) |
244
- | `cleanupDebounceMs` | `0` | No debounce by default |
238
+ | Option | Default Value | Description |
239
+ | --------------------------- | ------------- | ----------------------------------- |
240
+ | `sourceName` | `undefined` | Auto-generated if not provided |
241
+ | `cleaningInterval` | `1000` | 1 second between cleanup runs |
242
+ | `keepLatestMessage` | `false` | Keep all messages by default |
243
+ | `registeredTypes` | `[]` | Accept all message types by default |
244
+ | `namespace` | `''` | No namespace by default |
245
+ | `deduplicationTTL` | `300000` | 5 minutes (5 _ 60 _ 1000 ms) |
246
+ | `cleanupDebounceMs` | `0` | No debounce by default |
247
+ | `batchingDelayMs` | `20` | Batch delay in ms (0 = off) |
248
+ | `excludedBatchMessageTypes` | `[]` | Types never batched |
245
249
 
246
250
  #### Return Value
247
251
 
@@ -484,6 +488,40 @@ function TabStatus() {
484
488
  - Implement debouncing for rapid state changes
485
489
  - Consider using `expirationDuration` for temporary messages
486
490
 
491
+ #### Batching Mechanism
492
+
493
+ **Batching** allows you to group multiple outgoing messages and send them together in a single post to the BroadcastChannel. This can significantly reduce the number of cross-tab events, improve performance, and avoid flooding the channel when many messages are sent in rapid succession (e.g., during fast typing or bulk updates).
494
+
495
+ - **batchingDelayMs**: If set to a value greater than 0 (default: 20ms), outgoing messages are collected for up to this delay and then sent as an array. If 0 or negative, batching is disabled and all messages are sent immediately.
496
+ - **excludedBatchMessageTypes**: An array of message types that should always be sent immediately, even if batching is enabled. Use this for urgent or high-priority messages (e.g., 'alert', 'sync-now').
497
+
498
+ **How it works:**
499
+
500
+ - When batching is enabled, calls to `postMessage` within the batching window are buffered and sent as a batch (array of messages) after the delay.
501
+ - On the receiving side, the hook automatically handles both single messages and batches (arrays). If you listen to the channel directly, always check if `Array.isArray(event.data)`.
502
+ - If the tab unmounts or the channel closes, any unsent batched messages are flushed immediately.
503
+
504
+ **Why batching matters:**
505
+
506
+ - Reduces the number of events and improves efficiency, especially for high-frequency updates.
507
+ - Prevents message storms that can occur when many updates happen in a short time.
508
+ - Lets you control which messages are always sent immediately for real-time needs.
509
+
510
+ **Example:**
511
+
512
+ ```tsx
513
+ const { postMessage } = useBroadcastChannel('my-channel', {
514
+ batchingDelayMs: 50, // Batch messages for up to 50ms
515
+ excludedBatchMessageTypes: ['alert'], // Always send 'alert' immediately
516
+ });
517
+
518
+ // These will be batched if sent within 50ms
519
+ postMessage('edit', { field: 'a', value: 1 });
520
+ postMessage('edit', { field: 'b', value: 2 });
521
+ // This will be sent immediately
522
+ postMessage('alert', { message: 'Something happened!' });
523
+ ```
524
+
487
525
  ### Memory Management
488
526
 
489
527
  - Clear messages when they're no longer needed using `clearReceivedMessages` / `clearSentMessages`
@@ -1,14 +1,9 @@
1
1
  import React from 'react';
2
- import { BroadcastMessage } from './types/types';
3
- interface BroadcastContextValue {
4
- messages: BroadcastMessage[];
5
- error: string | null;
6
- channel: BroadcastChannel | null;
7
- }
2
+ import { BroadcastActions } from './types/types';
8
3
  interface BroadcastProviderProps {
9
4
  channelName: string;
10
5
  children: React.ReactNode;
11
6
  }
12
7
  export declare const BroadcastProvider: React.FC<BroadcastProviderProps>;
13
- export declare const useBroadcastProvider: () => BroadcastContextValue;
8
+ export declare const useBroadcastProvider: () => BroadcastActions;
14
9
  export {};
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(),c=(e,r,t,s={})=>{var o;const c=Date.now();return{id:n(t,c),type:e,message:r,timestamp:c,source:t,expirationDate:null!==(o=s.expirationDate)&&void 0!==o?o:s.expirationDuration?c+s.expirationDuration:void 0}},a=(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,u=(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||"")}},i={created:e=>u("info","Channel created:",e),closed:e=>u("info","Channel closed:",e)},d={sent:e=>u("info","Message sent:",e),received:e=>u("info","Message received:",e),cleared:e=>u("info","Message cleared:",e),expired:e=>u("info","Message expired:",e),duplicate:e=>u("warn","Duplicate message ignored:",e),allSentCleared:()=>u("info","All sent messages cleared"),allReceivedCleared:()=>u("info","All received messages cleared"),ignored:e=>u("info","Message ignored due to type filter:",e)},p={inProgress:()=>u("warn","Ping already in progress. Skipping call.")},f={started:()=>u("info","Cleanup started"),completed:e=>u("info","Cleanup completed:",{removedCount:e})},g=e=>u("error","Error:",e),h="CLEAR_SENT_MESSAGES",m="PING",v="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:u=1e3,keepLatestMessage:C=!1,registeredTypes:E=[],namespace:b="",deduplicationTTL:S=3e5,cleanupDebounceMs:M=0,batchingDelayMs:P=20,excludedBatchMessageTypes:w=[]}=t,[N,x]=e.useState([]),[B,T]=e.useState([]),[D,A]=e.useState(null),[k,R]=e.useState(!1),$=e.useRef(null),_=e.useRef(new Map),G=e.useRef(null),I=e.useRef(null),L=e.useRef([]),O=e.useRef(!1),j=e.useMemo((()=>n||`tab-${s()}`),[n]),F=e.useMemo((()=>({CLEAR_SENT_MESSAGES:a(h,r,b),PING:a(m,r,b),PONG:a(v,r,b)})),[r,b]),q=e.useMemo((()=>b?`${r}-${b}`:r),[r,b]),J=e.useMemo((()=>E),[JSON.stringify(E)]),U=e.useCallback((()=>{x((e=>e.filter((e=>!o(e)))))}),[]),V=e.useRef(M>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})(U,M):Object.assign(U,{cancel:()=>{}})).current,W=e.useCallback((e=>{A(e),setTimeout((()=>A(null)),3e3)}),[]),z=e.useCallback(((e=300)=>{if(k)return p.inProgress(),Promise.resolve([]);if(!$.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return g(e),W(e),Promise.resolve([])}y?y((()=>R(!0))):R(!0);const r=new Set;return G.current=r,$.current.postMessage(c(F.PING,null,j)),new Promise((t=>{setTimeout((()=>{R(!1),G.current===r&&(G.current=null),t(Array.from(r))}),e)}))}),[F.PING,j,W,k,y]),H=e.useCallback(((e,r,t={})=>{const s=$.current;if(!s){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return g(e),void W(e)}const n=c(e,r,j,t);if(!P||P<0||w.includes(e))try{s.postMessage(n)}catch(e){const r="Failed to send message";g(r),W(r),O.current=!0}else L.current.push(n),I.current||(I.current=setTimeout((()=>{if(O.current)return L.current=[],void(I.current=null);try{s.postMessage(L.current)}catch(e){const r="Failed to send message";g(r),W(r),O.current=!0}L.current=[],I.current=null}),P));d.sent(n),T((e=>[...e,n]))}),[j,W,P,w]),K=e.useCallback(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);x((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)))):[]))}),[]),Q=e.useCallback(((e={})=>{var r,t,s;const{ids:n=[],types:o=[],sync:a=!1}=null!=e?e:{};T((e=>n.length>0||o.length>0?e.filter((e=>{if(e.source!==j)return!0;const r=0===n.length||n.includes(e.id),t=0===o.length||o.includes(e.type);return!(r&&t)})):[])),a&&(null===(r=$.current)||void 0===r||r.postMessage(c(F.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(s=e.types)&&void 0!==s?s:[]},j)))}),[]),X=e.useCallback(((e={})=>{const{source:r,type:t}=e;for(let e=N.length-1;e>=0;e--){const s=N[e],n=!r||s.source===r,o=!t||s.type===t;if(n&&o)return s}return null}),[N]),Y=e.useCallback((e=>{var r;try{const t=e.data;if(d.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===j)return;if(l(t)){if(t.type===F.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void x((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===F.PING)return void(null===(r=$.current)||void 0===r||r.postMessage(c(F.PONG,null,j)));if(t.type===F.PONG){const e=t.source,r=G.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(J.length>0&&!J.includes(t.type))return void d.ignored(t.type);if(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),x((e=>C?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";g(r),W(r)}}),[j,J,C,W,F,S]),Z=e.useCallback((()=>{const e=$.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",Y),e.close(),i.closed(q),$.current=null)}),[Y,q]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return g(e),void W(e)}const e=new BroadcastChannel(q);return $.current=e,i.created(q),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{Y({data:e})})):Y(e)})),()=>{Z()}}),[q,Y,W]),e.useEffect((()=>{if(u<=0)return;const e=setInterval((()=>{f.started();const e=N.length;V(),f.completed(e-N.length)}),u);return()=>{var r;clearInterval(e),M>0&&(null===(r=V.cancel)||void 0===r||r.call(V))}}),[u,V,M]),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]),e.useEffect((()=>()=>{if(L.current.length>0&&$.current&&!O.current){try{$.current.postMessage(L.current)}catch(e){const r="Failed to send message";g(r),W(r)}L.current=[],setTimeout((()=>{}),0)}I.current&&(clearTimeout(I.current),I.current=null),O.current=!1}),[]),{channelName:q,messages:N,sentMessages:B,isPingInProgress:k,ping:z,postMessage:H,clearReceivedMessages:K,clearSentMessages:Q,getLatestMessage:X,error:D,closeChannel:Z}},E=e.createContext(void 0);class b 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),[c,a]=e.useState(null),l=e.useRef(null);e.useEffect((()=>{if("undefined"==typeof BroadcastChannel)return void a("BroadcastChannel is not supported in this browser. Please check browser compatibility.");const e=new BroadcastChannel(s);return l.current=e,()=>{e.close()}}),[s]);const u=e.useMemo((()=>({messages:n,error:c||o,channel:l.current})),[n,c,o]);return r.jsx(b,{children:r.jsx(E.Provider,{value:u,children:t})})},exports.useBroadcastChannel=C,exports.useBroadcastProvider=()=>{const r=e.useContext(E);if(!r)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return r};
1
+ "use strict";var e=require("react"),r=require("react/jsx-runtime");const t="__INTERNAL__",n=()=>Math.random().toString(36).substr(2,9),s=(e,r)=>{const t=`${n()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},a=e=>!!e.expirationDate&&e.expirationDate<Date.now(),o=(e,r,t,n={})=>{var a;const o=Date.now();return{id:s(t,o),type:e,message:r,timestamp:o,source:t,expirationDate:null!==(a=n.expirationDate)&&void 0!==a?a:n.expirationDuration?o+n.expirationDuration:void 0}},c=(e,r,n="")=>{const s=btoa(`react-broadcast-sync:${e}:${`${r}-${n}`}`);return`${t}:${e}:${s}`},l=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${t}:`)&&"string"==typeof e.source,i=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const n=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(n,r,t||"");break;case"warn":console.warn(n,r,t||"");break;case"error":console.error(n,r,t||"")}},u={created:e=>i("info","Channel created:",e),closed:e=>i("info","Channel closed:",e)},d={sent:e=>i("info","Message sent:",e),received:e=>i("info","Message received:",e),cleared:e=>i("info","Message cleared:",e),expired:e=>i("info","Message expired:",e),duplicate:e=>i("warn","Duplicate message ignored:",e),allSentCleared:()=>i("info","All sent messages cleared"),allReceivedCleared:()=>i("info","All received messages cleared"),ignored:e=>i("info","Message ignored due to type filter:",e)},p={inProgress:()=>i("warn","Ping already in progress. Skipping call.")},g={started:()=>i("info","Cleanup started"),completed:e=>i("info","Cleanup completed:",e)},f=e=>{const{action:r,channelName:t,type:n,source:s,originalError:a}=e;let o=`${r}`;if(t&&(o+=` | channel: ${t}`),n&&(o+=` | type: ${n}`),s&&(o+=` | source: ${s}`),a instanceof Error)o+=` | cause: ${a.message}`;else if("string"==typeof a)o+=` | cause: ${a}`;else if(null!=a)try{o+=` | cause: ${JSON.stringify(a)}`}catch(e){o+=" | cause: [unserializable]"}i("error","Error:",o)},h="CLEAR_SENT_MESSAGES",y="PING",m="PONG";let v;if("test"===process.env.NODE_ENV)try{v=require("react-dom").flushSync}catch(e){}const E=(r,t={})=>{const{sourceName:s,cleaningInterval:i=1e3,keepLatestMessage:E=!1,registeredTypes:C=[],namespace:b="",deduplicationTTL:M=3e5,cleanupDebounceMs:S=0,batchingDelayMs:N=20,excludedBatchMessageTypes:P=[]}=t,[w,$]=e.useState([]),[T,B]=e.useState([]),[A,x]=e.useState(null),[D,R]=e.useState(!1),k=e.useRef(null),_=e.useRef(new Map),G=e.useRef(null),I=e.useRef(null),L=e.useRef([]),O=e.useRef(!1),j=e.useMemo((()=>s||`tab-${n()}`),[s]),F=e.useMemo((()=>({CLEAR_SENT_MESSAGES:c(h,r,b),PING:c(y,r,b),PONG:c(m,r,b)})),[r,b]),q=e.useMemo((()=>b?`${r}-${b}`:r),[r,b]),J=e.useMemo((()=>C),[JSON.stringify(C)]),z=e.useCallback((()=>{$((e=>e.filter((e=>!a(e)))))}),[]),U=e.useRef(S>0?((e,r)=>{let t,n=null,s=null;const a=(...a)=>{s=a,null!==n&&clearTimeout(n),n=setTimeout((()=>{n=null,null!==s&&(t=e(...s),s=null)}),r)};return a.cancel=()=>{null!==n&&(clearTimeout(n),n=null,s=null)},a.flush=()=>(null!==n&&(clearTimeout(n),n=null,null!==s&&(t=e(...s),s=null)),t),a})(z,S):Object.assign(z,{cancel:()=>{}})).current,V=e.useCallback((e=>{x(e),setTimeout((()=>x(null)),3e3)}),[]),W=e.useCallback(((e=300)=>{if(D)return p.inProgress(),Promise.resolve([]);if(!k.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"ping",channelName:q,originalError:e}),V(e),Promise.resolve([])}v?v((()=>R(!0))):R(!0);const r=new Set;return G.current=r,k.current.postMessage(o(F.PING,null,j)),new Promise((t=>{setTimeout((()=>{R(!1),G.current===r&&(G.current=null),t(Array.from(r))}),e)}))}),[F.PING,j,V,D,v]),H=e.useCallback(((e,r,t={})=>{const n=k.current;if(!n){const r="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"postMessage",channelName:q,type:e,originalError:r}),void V(r)}const s=o(e,r,j,t);if(!N||N<0||P.includes(e))try{n.postMessage(s)}catch(r){const t="Failed to send message";f({action:"postMessage",channelName:q,type:e,originalError:t}),V(t),O.current=!0}else L.current.push(s),I.current||(I.current=setTimeout((()=>{if(O.current)return L.current=[],void(I.current=null);try{n.postMessage(L.current)}catch(r){const t="Failed to send message";f({action:"postMessage",channelName:q,type:e,originalError:t}),V(t),O.current=!0}L.current=[],I.current=null}),N));d.sent(s),B((e=>[...e,s]))}),[j,V,N,P]),K=e.useCallback(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);$((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[])),r||d.allReceivedCleared()}),[]),Q=e.useCallback(((e={})=>{var r,t,n;const{ids:s=[],types:a=[],sync:c=!1}=null!=e?e:{};B((e=>s.length>0||a.length>0?e.filter((e=>{if(e.source!==j)return!0;const r=0===s.length||s.includes(e.id),t=0===a.length||a.includes(e.type);return!(r&&t)})):[])),0===s.length&&0===a.length&&d.allSentCleared(),c&&(null===(r=k.current)||void 0===r||r.postMessage(o(F.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},j)))}),[]),X=e.useCallback(((e={})=>{const{source:r,type:t}=e;for(let e=w.length-1;e>=0;e--){const n=w[e],s=!r||n.source===r,a=!t||n.type===t;if(s&&a)return n}return null}),[w]),Y=e.useCallback((e=>{var r;try{const t=e.data;if(d.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===j)return;if(l(t)){if(t.type===F.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void $((n=>[...n.filter((n=>{if(n.source!==t.source)return!0;const s=0===e.length||e.includes(n.id),a=0===r.length||r.includes(n.type);return!(s&&a)}))]))}if(t.type===F.PING)return void(null===(r=k.current)||void 0===r||r.postMessage(o(F.PONG,null,j)));if(t.type===F.PONG){const e=t.source,r=G.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(J.length>0&&!J.includes(t.type))return void d.ignored(t.type);if(a(t))return void d.expired(t.id);const n=Date.now(),s=_.current.get(t.id);if(s&&n-s<M)return void d.duplicate(t.id);_.current.set(t.id,n),$((e=>E?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";f({action:"handleMessage",channelName:q,originalError:r}),V(r)}}),[j,J,E,V,F,M]),Z=e.useCallback((()=>{const e=k.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",Y),e.close(),u.closed(q),k.current=null)}),[Y,q]);return e.useEffect((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return f({action:"useBroadcastChannel",channelName:q,originalError:e}),void V(e)}let e=null;try{e=new BroadcastChannel(q)}catch(e){const r="Failed to create BroadcastChannel";return f({action:"useBroadcastChannel",channelName:q,originalError:e instanceof Error?e:String(e)}),void V(r)}return k.current=e,u.created(q),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{Y({data:e})})):Y(e)})),()=>{Z()}}),[q,Y,V]),e.useEffect((()=>{if(i<=0)return;const e=setInterval((()=>{g.started();const e=w.length;U(),g.completed(e-w.length)}),i);return()=>{var r;clearInterval(e),S>0&&(null===(r=U.cancel)||void 0===r||r.call(U))}}),[i,U,S]),e.useEffect((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of _.current.entries())e-t>=M&&_.current.delete(r)}),6e4);return()=>clearInterval(e)}),[M]),e.useEffect((()=>()=>{if(L.current.length>0&&k.current&&!O.current){try{k.current.postMessage(L.current)}catch(e){const r="Failed to send message";f({action:"useBroadcastChannel",channelName:q,originalError:e instanceof Error?e:String(e)}),V(r)}L.current=[],setTimeout((()=>{}),0)}I.current&&(clearTimeout(I.current),I.current=null),O.current=!1}),[]),{channelName:q,messages:w,sentMessages:T,isPingInProgress:D,ping:W,postMessage:H,clearReceivedMessages:K,clearSentMessages:Q,getLatestMessage:X,error:A,closeChannel:Z}},C=e.createContext(void 0);exports.BroadcastProvider=({children:e,channelName:t})=>{const n=E(t);return r.jsx(C.Provider,{value:n,children:e})},exports.useBroadcastChannel=E,exports.useBroadcastProvider=()=>{const r=e.useContext(C);if(!r)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return r};
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/utils/messageUtils.ts","../src/utils/debug.ts","../src/hooks/useBroadcastChannel.ts","../src/BroadcastProvider.tsx"],"sourcesContent":[null,null,null,null],"names":["INTERNAL_PREFIX","generateRandomPart","Math","random","toString","substr","generateMessageId","source","timestamp","raw","btoa","replace","isMessageExpired","message","expirationDate","Date","now","createMessage","type","content","options","id","_a","expirationDuration","undefined","getInternalMessageType","baseType","channelName","namespace","hash","isValidInternalClearMessage","startsWith","log","level","data","process","env","REACT_APP_DEBUG_BROADCAST","prefix","toISOString","console","warn","error","debug","created","name","closed","sent","received","cleared","messageId","expired","duplicate","allSentCleared","allReceivedCleared","ignored","messageType","inProgress","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","stableRegisteredTypes","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","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","call","key","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","context","action","originalError","Error","JSON","stringify","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","stableRegisteredTypes","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","String","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","call","key","entries","delete","BroadcastChannelContext","createContext","BroadcastProvider","children","BroadcastChannelActions","_jsx","jsx","Provider","value","useBroadcastProvider","useContext"],"mappings":"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"}
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 c,useContext as a}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||"")}},y={created:e=>m("info","Channel created:",e),closed:e=>m("info","Channel closed:",e)},v={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})},b=e=>m("error","Error:",e),P="CLEAR_SENT_MESSAGES",w="PING",M="PONG";let C;if("test"===process.env.NODE_ENV)try{C=require("react-dom").flushSync}catch(e){}const N=(e,c={})=>{const{sourceName:a,cleaningInterval:i=1e3,keepLatestMessage:l=!1,registeredTypes:d=[],namespace:m="",deduplicationTTL:N=3e5,cleanupDebounceMs:T=0,batchingDelayMs:D=20,excludedBatchMessageTypes:A=[]}=c,[B,$]=r([]),[_,G]=r([]),[x,I]=r(null),[L,O]=r(!1),R=t(null),k=t(new Map),j=t(null),F=t(null),q=t([]),J=t(!1),U=n((()=>a||`tab-${u()}`),[a]),V=n((()=>({CLEAR_SENT_MESSAGES:h(P,e,m),PING:h(w,e,m),PONG:h(M,e,m)})),[e,m]),W=n((()=>m?`${e}-${m}`:e),[e,m]),z=n((()=>d),[JSON.stringify(d)]),H=s((()=>{$((e=>e.filter((e=>!p(e)))))}),[]),K=t(T>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})(H,T):Object.assign(H,{cancel:()=>{}})).current,Q=s((e=>{I(e),setTimeout((()=>I(null)),3e3)}),[]),X=s(((e=300)=>{if(L)return E.inProgress(),Promise.resolve([]);if(!R.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return b(e),Q(e),Promise.resolve([])}C?C((()=>O(!0))):O(!0);const r=new Set;return j.current=r,R.current.postMessage(g(V.PING,null,U)),new Promise((t=>{setTimeout((()=>{O(!1),j.current===r&&(j.current=null),t(Array.from(r))}),e)}))}),[V.PING,U,Q,L,C]),Y=s(((e,r,t={})=>{const n=R.current;if(!n){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return b(e),void Q(e)}const s=g(e,r,U,t);if(!D||D<0||A.includes(e))try{n.postMessage(s)}catch(e){const r="Failed to send message";b(r),Q(r),J.current=!0}else q.current.push(s),F.current||(F.current=setTimeout((()=>{if(J.current)return q.current=[],void(F.current=null);try{n.postMessage(q.current)}catch(e){const r="Failed to send message";b(r),Q(r),J.current=!0}q.current=[],F.current=null}),D));v.sent(s),G((e=>[...e,s]))}),[U,Q,D,A]),Z=s(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);$((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[]))}),[]),ee=s(((e={})=>{var r,t,n;const{ids:s=[],types:o=[],sync:c=!1}=null!=e?e:{};G((e=>s.length>0||o.length>0?e.filter((e=>{if(e.source!==U)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=R.current)||void 0===r||r.postMessage(g(V.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},U)))}),[]),re=s(((e={})=>{const{source:r,type:t}=e;for(let e=B.length-1;e>=0;e--){const n=B[e],s=!r||n.source===r,o=!t||n.type===t;if(s&&o)return n}return null}),[B]),te=s((e=>{var r;try{const t=e.data;if(v.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===U)return;if(f(t)){if(t.type===V.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void $((n=>[...n.filter((n=>{if(n.source!==t.source)return!0;const s=0===e.length||e.includes(n.id),o=0===r.length||r.includes(n.type);return!(s&&o)}))]))}if(t.type===V.PING)return void(null===(r=R.current)||void 0===r||r.postMessage(g(V.PONG,null,U)));if(t.type===V.PONG){const e=t.source,r=j.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(z.length>0&&!z.includes(t.type))return void v.ignored(t.type);if(p(t))return void v.expired(t.id);const n=Date.now(),s=k.current.get(t.id);if(s&&n-s<N)return void v.duplicate(t.id);k.current.set(t.id,n),$((e=>l?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";b(r),Q(r)}}),[U,z,l,Q,V,N]),ne=s((()=>{const e=R.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",te),e.close(),y.closed(W),R.current=null)}),[te,W]);return o((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return b(e),void Q(e)}const e=new BroadcastChannel(W);return R.current=e,y.created(W),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{te({data:e})})):te(e)})),()=>{ne()}}),[W,te,Q]),o((()=>{if(i<=0)return;const e=setInterval((()=>{S.started();const e=B.length;K(),S.completed(e-B.length)}),i);return()=>{var r;clearInterval(e),T>0&&(null===(r=K.cancel)||void 0===r||r.call(K))}}),[i,K,T]),o((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of k.current.entries())e-t>=N&&k.current.delete(r)}),6e4);return()=>clearInterval(e)}),[N]),o((()=>()=>{if(q.current.length>0&&R.current&&!J.current){try{R.current.postMessage(q.current)}catch(e){const r="Failed to send message";b(r),Q(r)}q.current=[],setTimeout((()=>{}),0)}F.current&&(clearTimeout(F.current),F.current=null),J.current=!1}),[]),{channelName:W,messages:B,sentMessages:_,isPingInProgress:L,ping:X,postMessage:Y,clearReceivedMessages:Z,clearSentMessages:ee,getLatestMessage:re,error:x,closeChannel:ne}},T=c(void 0);class D 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 A=({children:r,channelName:s})=>{const{messages:c,error:a}=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||a,channel:d.current})),[c,l,a]);return i(D,{children:i(T.Provider,{value:p,children:r})})},B=()=>{const e=a(T);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{A as BroadcastProvider,N as useBroadcastChannel,B as useBroadcastProvider};
1
+ import{useState as e,useRef as r,useMemo as t,useCallback as n,useEffect as s,createContext as a,useContext as o}from"react";import{jsx as c}from"react/jsx-runtime";const i="__INTERNAL__",l=()=>Math.random().toString(36).substr(2,9),u=(e,r)=>{const t=`${l()}-${e}-${r}`;return btoa(t).replace(/=+$/,"")},d=e=>!!e.expirationDate&&e.expirationDate<Date.now(),p=(e,r,t,n={})=>{var s;const a=Date.now();return{id:u(t,a),type:e,message:r,timestamp:a,source:t,expirationDate:null!==(s=n.expirationDate)&&void 0!==s?s:n.expirationDuration?a+n.expirationDuration:void 0}},g=(e,r,t="")=>{const n=btoa(`react-broadcast-sync:${e}:${`${r}-${t}`}`);return`${i}:${e}:${n}`},f=e=>e&&"object"==typeof e&&"string"==typeof e.type&&e.type.startsWith(`${i}:`)&&"string"==typeof e.source,h=(e,r,t)=>{if("undefined"==typeof process||!process.env||"true"!==process.env.REACT_APP_DEBUG_BROADCAST)return;const n=`[${(new Date).toISOString()}] [react-broadcast-sync]`;switch(e){case"info":console.log(n,r,t||"");break;case"warn":console.warn(n,r,t||"");break;case"error":console.error(n,r,t||"")}},y={created:e=>h("info","Channel created:",e),closed:e=>h("info","Channel closed:",e)},m={sent:e=>h("info","Message sent:",e),received:e=>h("info","Message received:",e),cleared:e=>h("info","Message cleared:",e),expired:e=>h("info","Message expired:",e),duplicate:e=>h("warn","Duplicate message ignored:",e),allSentCleared:()=>h("info","All sent messages cleared"),allReceivedCleared:()=>h("info","All received messages cleared"),ignored:e=>h("info","Message ignored due to type filter:",e)},v={inProgress:()=>h("warn","Ping already in progress. Skipping call.")},E={started:()=>h("info","Cleanup started"),completed:e=>h("info","Cleanup completed:",e)},N=e=>{const{action:r,channelName:t,type:n,source:s,originalError:a}=e;let o=`${r}`;if(t&&(o+=` | channel: ${t}`),n&&(o+=` | type: ${n}`),s&&(o+=` | source: ${s}`),a instanceof Error)o+=` | cause: ${a.message}`;else if("string"==typeof a)o+=` | cause: ${a}`;else if(null!=a)try{o+=` | cause: ${JSON.stringify(a)}`}catch(e){o+=" | cause: [unserializable]"}h("error","Error:",o)},M="CLEAR_SENT_MESSAGES",S="PING",b="PONG";let P;if("test"===process.env.NODE_ENV)try{P=require("react-dom").flushSync}catch(e){}const C=(a,o={})=>{const{sourceName:c,cleaningInterval:i=1e3,keepLatestMessage:u=!1,registeredTypes:h=[],namespace:C="",deduplicationTTL:w=3e5,cleanupDebounceMs:$=0,batchingDelayMs:T=20,excludedBatchMessageTypes:A=[]}=o,[D,B]=e([]),[_,G]=e([]),[I,x]=e(null),[L,O]=e(!1),R=r(null),k=r(new Map),j=r(null),F=r(null),J=r([]),q=r(!1),z=t((()=>c||`tab-${l()}`),[c]),U=t((()=>({CLEAR_SENT_MESSAGES:g(M,a,C),PING:g(S,a,C),PONG:g(b,a,C)})),[a,C]),V=t((()=>C?`${a}-${C}`:a),[a,C]),W=t((()=>h),[JSON.stringify(h)]),H=n((()=>{B((e=>e.filter((e=>!d(e)))))}),[]),K=r($>0?((e,r)=>{let t,n=null,s=null;const a=(...a)=>{s=a,null!==n&&clearTimeout(n),n=setTimeout((()=>{n=null,null!==s&&(t=e(...s),s=null)}),r)};return a.cancel=()=>{null!==n&&(clearTimeout(n),n=null,s=null)},a.flush=()=>(null!==n&&(clearTimeout(n),n=null,null!==s&&(t=e(...s),s=null)),t),a})(H,$):Object.assign(H,{cancel:()=>{}})).current,Q=n((e=>{x(e),setTimeout((()=>x(null)),3e3)}),[]),X=n(((e=300)=>{if(L)return v.inProgress(),Promise.resolve([]);if(!R.current){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return N({action:"ping",channelName:V,originalError:e}),Q(e),Promise.resolve([])}P?P((()=>O(!0))):O(!0);const r=new Set;return j.current=r,R.current.postMessage(p(U.PING,null,z)),new Promise((t=>{setTimeout((()=>{O(!1),j.current===r&&(j.current=null),t(Array.from(r))}),e)}))}),[U.PING,z,Q,L,P]),Y=n(((e,r,t={})=>{const n=R.current;if(!n){const r="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return N({action:"postMessage",channelName:V,type:e,originalError:r}),void Q(r)}const s=p(e,r,z,t);if(!T||T<0||A.includes(e))try{n.postMessage(s)}catch(r){const t="Failed to send message";N({action:"postMessage",channelName:V,type:e,originalError:t}),Q(t),q.current=!0}else J.current.push(s),F.current||(F.current=setTimeout((()=>{if(q.current)return J.current=[],void(F.current=null);try{n.postMessage(J.current)}catch(r){const t="Failed to send message";N({action:"postMessage",channelName:V,type:e,originalError:t}),Q(t),q.current=!0}J.current=[],F.current=null}),T));m.sent(s),G((e=>[...e,s]))}),[z,Q,T,A]),Z=n(((e={})=>{const r=Boolean(e.ids&&e.ids.length||e.types&&e.types.length||e.sources&&e.sources.length);B((t=>r?t.filter((r=>!(e.ids&&e.ids.includes(r.id)||e.types&&e.types.includes(r.type)||e.sources&&e.sources.includes(r.source)))):[])),r||m.allReceivedCleared()}),[]),ee=n(((e={})=>{var r,t,n;const{ids:s=[],types:a=[],sync:o=!1}=null!=e?e:{};G((e=>s.length>0||a.length>0?e.filter((e=>{if(e.source!==z)return!0;const r=0===s.length||s.includes(e.id),t=0===a.length||a.includes(e.type);return!(r&&t)})):[])),0===s.length&&0===a.length&&m.allSentCleared(),o&&(null===(r=R.current)||void 0===r||r.postMessage(p(U.CLEAR_SENT_MESSAGES,{ids:null!==(t=e.ids)&&void 0!==t?t:[],types:null!==(n=e.types)&&void 0!==n?n:[]},z)))}),[]),re=n(((e={})=>{const{source:r,type:t}=e;for(let e=D.length-1;e>=0;e--){const n=D[e],s=!r||n.source===r,a=!t||n.type===t;if(s&&a)return n}return null}),[D]),te=n((e=>{var r;try{const t=e.data;if(m.received(t),!(e=>Boolean(e&&"object"==typeof e&&"id"in e))(t))return;if(t.source===z)return;if(f(t)){if(t.type===U.CLEAR_SENT_MESSAGES){const{ids:e=[],types:r=[]}=t.message||{};return void B((n=>[...n.filter((n=>{if(n.source!==t.source)return!0;const s=0===e.length||e.includes(n.id),a=0===r.length||r.includes(n.type);return!(s&&a)}))]))}if(t.type===U.PING)return void(null===(r=R.current)||void 0===r||r.postMessage(p(U.PONG,null,z)));if(t.type===U.PONG){const e=t.source,r=j.current;return void(r&&!1===r.has(e)&&r.add(e))}}if(W.length>0&&!W.includes(t.type))return void m.ignored(t.type);if(d(t))return void m.expired(t.id);const n=Date.now(),s=k.current.get(t.id);if(s&&n-s<w)return void m.duplicate(t.id);k.current.set(t.id,n),B((e=>u?[t]:[...e,t]))}catch(e){const r="Error processing broadcast message";N({action:"handleMessage",channelName:V,originalError:r}),Q(r)}}),[z,W,u,Q,U,w]),ne=n((()=>{const e=R.current;e&&"function"==typeof e.close&&(e.removeEventListener("message",te),e.close(),y.closed(V),R.current=null)}),[te,V]);return s((()=>{if("undefined"==typeof BroadcastChannel){const e="BroadcastChannel is not supported in this browser. Please check browser compatibility.";return N({action:"useBroadcastChannel",channelName:V,originalError:e}),void Q(e)}let e=null;try{e=new BroadcastChannel(V)}catch(e){const r="Failed to create BroadcastChannel";return N({action:"useBroadcastChannel",channelName:V,originalError:e instanceof Error?e:String(e)}),void Q(r)}return R.current=e,y.created(V),e.addEventListener("message",(e=>{Array.isArray(e.data)?e.data.forEach((e=>{te({data:e})})):te(e)})),()=>{ne()}}),[V,te,Q]),s((()=>{if(i<=0)return;const e=setInterval((()=>{E.started();const e=D.length;K(),E.completed(e-D.length)}),i);return()=>{var r;clearInterval(e),$>0&&(null===(r=K.cancel)||void 0===r||r.call(K))}}),[i,K,$]),s((()=>{const e=setInterval((()=>{const e=Date.now();for(const[r,t]of k.current.entries())e-t>=w&&k.current.delete(r)}),6e4);return()=>clearInterval(e)}),[w]),s((()=>()=>{if(J.current.length>0&&R.current&&!q.current){try{R.current.postMessage(J.current)}catch(e){const r="Failed to send message";N({action:"useBroadcastChannel",channelName:V,originalError:e instanceof Error?e:String(e)}),Q(r)}J.current=[],setTimeout((()=>{}),0)}F.current&&(clearTimeout(F.current),F.current=null),q.current=!1}),[]),{channelName:V,messages:D,sentMessages:_,isPingInProgress:L,ping:X,postMessage:Y,clearReceivedMessages:Z,clearSentMessages:ee,getLatestMessage:re,error:I,closeChannel:ne}},w=a(void 0),$=({children:e,channelName:r})=>{const t=C(r);return c(w.Provider,{value:t,children:e})},T=()=>{const e=o(w);if(!e)throw new Error("useBroadcastProvider must be used within a BroadcastProvider");return e};export{$ as BroadcastProvider,C as useBroadcastChannel,T as useBroadcastProvider};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/messageUtils.ts","../src/utils/debug.ts","../src/hooks/useBroadcastChannel.ts","../src/BroadcastProvider.tsx"],"sourcesContent":[null,null,null,null],"names":["INTERNAL_PREFIX","generateRandomPart","Math","random","toString","substr","generateMessageId","source","timestamp","raw","btoa","replace","isMessageExpired","message","expirationDate","Date","now","createMessage","type","content","options","id","_a","expirationDuration","undefined","getInternalMessageType","baseType","channelName","namespace","hash","isValidInternalClearMessage","startsWith","log","level","data","process","env","REACT_APP_DEBUG_BROADCAST","prefix","toISOString","console","warn","error","debug","created","name","closed","sent","received","cleared","messageId","expired","duplicate","allSentCleared","allReceivedCleared","ignored","messageType","inProgress","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","stableRegisteredTypes","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","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","call","key","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","context","action","originalError","Error","JSON","stringify","INTERNAL_MESSAGE_TYPES","flushSyncFn","NODE_ENV","require","flushSync","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","batchingDelayMs","excludedBatchMessageTypes","messages","setMessages","useState","sentMessages","setSentMessages","setError","isPingInProgress","setIsPingInProgress","channel","useRef","receivedMessageIds","Map","activeSourcesCollector","batchingTimeoutRef","batchingMessagesRef","batchingErrorRef","useMemo","internalTypes","CLEAR_SENT_MESSAGES","PING","PONG","resolvedChannelName","stableRegisteredTypes","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","ping","timeoutMs","Promise","resolve","collector","Set","postMessage","Array","from","messageContent","channelCurrent","includes","e","push","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","pongSource","has","add","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","String","addEventListener","isArray","forEach","interval","setInterval","before","clearInterval","call","key","entries","delete","BroadcastChannelContext","createContext","BroadcastProvider","children","BroadcastChannelActions","_jsx","Provider","value","useBroadcastProvider","useContext"],"mappings":"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"}
@@ -20,5 +20,11 @@ export declare const debug: {
20
20
  started: () => void;
21
21
  completed: (removedCount: number) => void;
22
22
  };
23
- error: (error: string) => void;
23
+ error: (context: {
24
+ action: string;
25
+ channelName?: string;
26
+ type?: string;
27
+ source?: string;
28
+ originalError?: unknown;
29
+ }) => void;
24
30
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-broadcast-sync",
3
- "version": "1.5.0",
3
+ "version": "1.6.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",
@@ -1,37 +1,8 @@
1
- import React, { createContext, useContext, useEffect, useMemo, useRef } from 'react';
1
+ import React, { createContext, useContext } from 'react';
2
2
  import { useBroadcastChannel } from './hooks/useBroadcastChannel';
3
- import { BroadcastMessage } from './types/types';
3
+ import { BroadcastActions } from './types/types';
4
4
 
5
- interface BroadcastContextValue {
6
- messages: BroadcastMessage[];
7
- error: string | null;
8
- channel: BroadcastChannel | null;
9
- }
10
-
11
- const BroadcastChannelContext = createContext<BroadcastContextValue | undefined>(undefined);
12
-
13
- interface ErrorBoundaryProps {
14
- children: React.ReactNode;
15
- }
16
-
17
- class ErrorBoundary extends React.Component<ErrorBoundaryProps, { hasError: boolean }> {
18
- state = { hasError: false };
19
-
20
- static getDerivedStateFromError() {
21
- return { hasError: true };
22
- }
23
-
24
- componentDidCatch(error: Error) {
25
- console.error('BroadcastChannel error:', error);
26
- }
27
-
28
- render() {
29
- if (this.state.hasError) {
30
- return <div>Error occurred in BroadcastProvider</div>;
31
- }
32
- return this.props.children;
33
- }
34
- }
5
+ const BroadcastChannelContext = createContext<BroadcastActions | undefined>(undefined);
35
6
 
36
7
  interface BroadcastProviderProps {
37
8
  channelName: string;
@@ -39,39 +10,16 @@ interface BroadcastProviderProps {
39
10
  }
40
11
 
41
12
  export const BroadcastProvider: React.FC<BroadcastProviderProps> = ({ children, channelName }) => {
42
- const { messages, error: hookError } = useBroadcastChannel(channelName);
43
-
44
- const [error, setError] = React.useState<string | null>(null);
45
- const channel = useRef<BroadcastChannel | null>(null);
46
-
47
- useEffect(() => {
48
- if (typeof BroadcastChannel === 'undefined') {
49
- setError(
50
- 'BroadcastChannel is not supported in this browser. Please check browser compatibility.'
51
- );
52
- return;
53
- }
54
- const bc = new BroadcastChannel(channelName);
55
- channel.current = bc;
56
-
57
- return () => {
58
- bc.close();
59
- };
60
- }, [channelName]);
61
-
62
- const value = useMemo(
63
- () => ({ messages, error: error || hookError, channel: channel.current }),
64
- [messages, error, hookError]
65
- );
13
+ const BroadcastChannelActions = useBroadcastChannel(channelName);
66
14
 
67
15
  return (
68
- <ErrorBoundary>
69
- <BroadcastChannelContext.Provider value={value}>{children}</BroadcastChannelContext.Provider>
70
- </ErrorBoundary>
16
+ <BroadcastChannelContext.Provider value={BroadcastChannelActions}>
17
+ {children}
18
+ </BroadcastChannelContext.Provider>
71
19
  );
72
20
  };
73
21
 
74
- export const useBroadcastProvider = (): BroadcastContextValue => {
22
+ export const useBroadcastProvider = (): BroadcastActions => {
75
23
  const context = useContext(BroadcastChannelContext);
76
24
  if (!context) {
77
25
  throw new Error('useBroadcastProvider must be used within a BroadcastProvider');
@@ -126,7 +126,11 @@ export const useBroadcastChannel = (
126
126
  if (!channel.current) {
127
127
  const error =
128
128
  'BroadcastChannel is not supported in this browser. Please check browser compatibility.';
129
- debug.error(error);
129
+ debug.error({
130
+ action: 'ping',
131
+ channelName: resolvedChannelName,
132
+ originalError: error,
133
+ });
130
134
  setErrorMessage(error);
131
135
  return Promise.resolve([]);
132
136
  }
@@ -161,7 +165,12 @@ export const useBroadcastChannel = (
161
165
  if (!channelCurrent) {
162
166
  const error =
163
167
  'BroadcastChannel is not supported in this browser. Please check browser compatibility.';
164
- debug.error(error);
168
+ debug.error({
169
+ action: 'postMessage',
170
+ channelName: resolvedChannelName,
171
+ type: messageType,
172
+ originalError: error,
173
+ });
165
174
  setErrorMessage(error);
166
175
  return;
167
176
  }
@@ -175,7 +184,12 @@ export const useBroadcastChannel = (
175
184
  channelCurrent.postMessage(message);
176
185
  } catch (e) {
177
186
  const error = 'Failed to send message';
178
- debug.error(error);
187
+ debug.error({
188
+ action: 'postMessage',
189
+ channelName: resolvedChannelName,
190
+ type: messageType,
191
+ originalError: error,
192
+ });
179
193
  setErrorMessage(error);
180
194
  batchingErrorRef.current = true;
181
195
  }
@@ -192,7 +206,12 @@ export const useBroadcastChannel = (
192
206
  channelCurrent.postMessage(batchingMessagesRef.current);
193
207
  } catch (e) {
194
208
  const error = 'Failed to send message';
195
- debug.error(error);
209
+ debug.error({
210
+ action: 'postMessage',
211
+ channelName: resolvedChannelName,
212
+ type: messageType,
213
+ originalError: error,
214
+ });
196
215
  setErrorMessage(error);
197
216
  batchingErrorRef.current = true;
198
217
  }
@@ -224,6 +243,9 @@ export const useBroadcastChannel = (
224
243
  )
225
244
  : []
226
245
  );
246
+ if (!hasFilters) {
247
+ debug.message.allReceivedCleared();
248
+ }
227
249
  }, []);
228
250
 
229
251
  const clearSentMessages = useCallback((options: ClearSentMessagesOptions = {}) => {
@@ -245,6 +267,9 @@ export const useBroadcastChannel = (
245
267
  })
246
268
  : []
247
269
  );
270
+ if (ids.length === 0 && types.length === 0) {
271
+ debug.message.allSentCleared();
272
+ }
248
273
  if (sync) {
249
274
  channel.current?.postMessage(
250
275
  createMessage(
@@ -339,7 +364,11 @@ export const useBroadcastChannel = (
339
364
  setMessages(prev => (keepLatestMessage ? [message] : [...prev, message]));
340
365
  } catch (e) {
341
366
  const error = 'Error processing broadcast message';
342
- debug.error(error);
367
+ debug.error({
368
+ action: 'handleMessage',
369
+ channelName: resolvedChannelName,
370
+ originalError: error,
371
+ });
343
372
  setErrorMessage(error);
344
373
  }
345
374
  },
@@ -367,12 +396,28 @@ export const useBroadcastChannel = (
367
396
  if (typeof BroadcastChannel === 'undefined') {
368
397
  const error =
369
398
  'BroadcastChannel is not supported in this browser. Please check browser compatibility.';
370
- debug.error(error);
399
+ debug.error({
400
+ action: 'useBroadcastChannel',
401
+ channelName: resolvedChannelName,
402
+ originalError: error,
403
+ });
371
404
  setErrorMessage(error);
372
405
  return;
373
406
  }
374
407
 
375
- const bc = new BroadcastChannel(resolvedChannelName);
408
+ let bc: BroadcastChannel | null = null;
409
+ try {
410
+ bc = new BroadcastChannel(resolvedChannelName);
411
+ } catch (e) {
412
+ const error = 'Failed to create BroadcastChannel';
413
+ debug.error({
414
+ action: 'useBroadcastChannel',
415
+ channelName: resolvedChannelName,
416
+ originalError: e instanceof Error ? e : String(e),
417
+ });
418
+ setErrorMessage(error);
419
+ return;
420
+ }
376
421
  channel.current = bc;
377
422
  debug.channel.created(resolvedChannelName);
378
423
 
@@ -431,7 +476,11 @@ export const useBroadcastChannel = (
431
476
  channel.current.postMessage(batchingMessagesRef.current);
432
477
  } catch (e) {
433
478
  const error = 'Failed to send message';
434
- debug.error(error);
479
+ debug.error({
480
+ action: 'useBroadcastChannel',
481
+ channelName: resolvedChannelName,
482
+ originalError: e instanceof Error ? e : String(e),
483
+ });
435
484
  setErrorMessage(error);
436
485
  }
437
486
  batchingMessagesRef.current = [];
@@ -63,10 +63,9 @@ describe('BroadcastProvider', () => {
63
63
  </BroadcastProvider>
64
64
  );
65
65
 
66
- // The provider creates two channels - one in the provider and one in useBroadcastChannel
67
- expect(mockChannels).toHaveLength(2);
66
+ // The provider delegates to useBroadcastChannel which creates one channel
67
+ expect(mockChannels).toHaveLength(1);
68
68
  expect(mockChannels[0].name).toBe('test-channel');
69
- expect(mockChannels[1].name).toBe('test-channel');
70
69
  });
71
70
 
72
71
  it('provides context values to children', () => {
@@ -132,23 +131,18 @@ describe('BroadcastProvider', () => {
132
131
  expect(mockChannels[0].close).toHaveBeenCalled();
133
132
  });
134
133
 
135
- it('handles error boundary when child component throws', () => {
134
+ it('propagates child component errors (no internal error boundary)', () => {
136
135
  const ThrowComponent = () => {
137
136
  throw new Error('Test error');
138
137
  };
139
138
 
140
- const consoleError = jest.spyOn(console, 'error').mockImplementation(() => {});
141
-
142
- render(
143
- <BroadcastProvider channelName="test-channel">
144
- <ThrowComponent />
145
- </BroadcastProvider>
146
- );
147
-
148
- expect(screen.getByText('Error occurred in BroadcastProvider')).toBeInTheDocument();
149
- expect(consoleError).toHaveBeenCalledWith('BroadcastChannel error:', expect.any(Error));
150
-
151
- consoleError.mockRestore();
139
+ expect(() => {
140
+ render(
141
+ <BroadcastProvider channelName="test-channel">
142
+ <ThrowComponent />
143
+ </BroadcastProvider>
144
+ );
145
+ }).toThrow('Test error');
152
146
  });
153
147
 
154
148
  it('throws error when useBroadcastProvider is used outside provider', () => {
@@ -32,7 +32,7 @@ describe('debug', () => {
32
32
  it('does not log anything', () => {
33
33
  debug.channel.created('test-channel');
34
34
  debug.message.sent({ id: '123' });
35
- debug.error('test error');
35
+ debug.error({ action: 'test error' });
36
36
 
37
37
  expect(console.log).not.toHaveBeenCalled();
38
38
  expect(console.warn).not.toHaveBeenCalled();
@@ -130,12 +130,12 @@ describe('debug', () => {
130
130
  /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\] \[react-broadcast-sync\]/
131
131
  ),
132
132
  'Cleanup completed:',
133
- { removedCount: 5 }
133
+ 5
134
134
  );
135
135
  });
136
136
 
137
137
  it('logs errors', () => {
138
- debug.error('test error');
138
+ debug.error({ action: 'test error' });
139
139
  expect(console.error).toHaveBeenCalledWith(
140
140
  expect.stringMatching(
141
141
  /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z\] \[react-broadcast-sync\]/
@@ -145,6 +145,24 @@ describe('debug', () => {
145
145
  );
146
146
  });
147
147
 
148
+ it('includes string cause in error logs', () => {
149
+ debug.error({ action: 'action', originalError: 'string-cause' });
150
+ expect(console.error).toHaveBeenCalledWith(
151
+ expect.stringMatching(/\[.*react-broadcast-sync\]/),
152
+ 'Error:',
153
+ expect.stringContaining('action | cause: string-cause')
154
+ );
155
+ });
156
+
157
+ it('includes object cause in error logs (JSON stringified)', () => {
158
+ debug.error({ action: 'action', originalError: { reason: 'bad', code: 500 } });
159
+ expect(console.error).toHaveBeenCalledWith(
160
+ expect.stringMatching(/\[.*react-broadcast-sync\]/),
161
+ 'Error:',
162
+ expect.stringContaining('action | cause: {"reason":"bad","code":500}')
163
+ );
164
+ });
165
+
148
166
  it('logs info with no data', () => {
149
167
  debug.channel.created('test-channel');
150
168
  expect(console.log).toHaveBeenCalledWith(
@@ -164,7 +182,7 @@ describe('debug', () => {
164
182
  });
165
183
 
166
184
  it('logs error with no data', () => {
167
- debug.error('error!');
185
+ debug.error({ action: 'error!' });
168
186
  expect(console.error).toHaveBeenCalledWith(
169
187
  expect.stringMatching(/\[.*react-broadcast-sync\]/),
170
188
  'Error:',
@@ -213,7 +231,7 @@ describe('debug', () => {
213
231
  });
214
232
 
215
233
  it('logs error messages', () => {
216
- debug.error('Test error');
234
+ debug.error({ action: 'Test error' });
217
235
  expect(console.error).toHaveBeenCalledWith(
218
236
  expect.stringContaining('[react-broadcast-sync]'),
219
237
  'Error:',
@@ -233,7 +251,23 @@ describe('debug', () => {
233
251
  expect(console.log).toHaveBeenCalledWith(
234
252
  expect.stringContaining('[react-broadcast-sync]'),
235
253
  'Cleanup completed:',
236
- { removedCount: 2 }
254
+ 2
255
+ );
256
+ });
257
+
258
+ it('logs all-cleared messages', () => {
259
+ debug.message.allSentCleared();
260
+ expect(console.log).toHaveBeenCalledWith(
261
+ expect.stringContaining('[react-broadcast-sync]'),
262
+ 'All sent messages cleared',
263
+ ''
264
+ );
265
+
266
+ debug.message.allReceivedCleared();
267
+ expect(console.log).toHaveBeenCalledWith(
268
+ expect.stringContaining('[react-broadcast-sync]'),
269
+ 'All received messages cleared',
270
+ ''
237
271
  );
238
272
  });
239
273
  });
@@ -48,7 +48,33 @@ export const debug = {
48
48
  },
49
49
  cleanup: {
50
50
  started: () => log('info', 'Cleanup started'),
51
- completed: (removedCount: number) => log('info', 'Cleanup completed:', { removedCount }),
51
+ completed: (removedCount: number) => log('info', 'Cleanup completed:', removedCount),
52
+ },
53
+ error: (context: {
54
+ action: string;
55
+ channelName?: string;
56
+ type?: string;
57
+ source?: string;
58
+ originalError?: unknown;
59
+ }) => {
60
+ const { action, channelName, type, source, originalError } = context;
61
+
62
+ let message = `${action}`;
63
+ if (channelName) message += ` | channel: ${channelName}`;
64
+ if (type) message += ` | type: ${type}`;
65
+ if (source) message += ` | source: ${source}`;
66
+ if (originalError instanceof Error) {
67
+ message += ` | cause: ${originalError.message}`;
68
+ } else if (typeof originalError === 'string') {
69
+ message += ` | cause: ${originalError}`;
70
+ } else if (originalError != null) {
71
+ try {
72
+ message += ` | cause: ${JSON.stringify(originalError)}`;
73
+ } catch {
74
+ message += ' | cause: [unserializable]';
75
+ }
76
+ }
77
+
78
+ log('error', 'Error:', message);
52
79
  },
53
- error: (error: string) => log('error', 'Error:', error),
54
80
  };