react-broadcast-sync 1.3.0 → 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 +7 -0
- package/README.md +26 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/types/types.d.ts +5 -0
- package/dist/utils/debug.d.ts +3 -0
- package/dist/utils/messageUtils.d.ts +2 -2
- package/package.json +1 -1
- package/src/hooks/useBroadcastChannel.ts +76 -4
- package/src/tests/useBroadcastChannel.test.tsx +902 -691
- package/src/types/types.ts +8 -0
- package/src/utils/debug.ts +3 -0
- package/src/utils/messageUtils.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
|
|
1
8
|
# [1.3.0](https://github.com/IdanShalem/react-broadcast-sync/compare/v1.2.1...v1.3.0) (2025-06-16)
|
|
2
9
|
|
|
3
10
|
|
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
|
|
|
@@ -271,6 +272,8 @@ Returns an object with:
|
|
|
271
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. |
|
|
272
273
|
| `clearSentMessages()` | `function` | Clear messages this tab sent (same matching rules). Pass `sync: true` to broadcast the clear to other tabs. |
|
|
273
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`. |
|
|
274
277
|
| `closeChannel()` | `function` | Explicitly closes the broadcast channel and removes event listeners. Safe to call multiple times. |
|
|
275
278
|
| `error` | `string \| null` | Any runtime error from the channel |
|
|
276
279
|
|
|
@@ -351,6 +354,29 @@ if (getLatestMessage({ type: 'notification' })) {
|
|
|
351
354
|
- If no message matches the filter, returns `null`.
|
|
352
355
|
- If multiple messages match, returns the most recently received one.
|
|
353
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
|
+
|
|
354
380
|
#### Closing the Channel Explicitly
|
|
355
381
|
|
|
356
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.
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react"),
|
|
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
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","channel","useRef","receivedMessageIds","Map","useMemo","internalTypes","CLEAR_SENT_MESSAGES","resolvedChannelName","stableRegisteredTypes","JSON","stringify","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","postMessage","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","interval","setInterval","before","clearInterval","call","entries","delete","BroadcastChannelContext","createContext","ErrorBoundary","React","Component","constructor","this","state","hasError","getDerivedStateFromError","componentDidCatch","render","_jsx","props","children","BroadcastProvider","hookError","value","Provider","useBroadcastProvider","context","useContext","Error"],"mappings":"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"}
|
|
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
|
|
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
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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","started","completed","removedCount","INTERNAL_MESSAGE_TYPES","useBroadcastChannel","sourceName","cleaningInterval","keepLatestMessage","registeredTypes","deduplicationTTL","cleanupDebounceMs","messages","setMessages","useState","sentMessages","setSentMessages","setError","channel","useRef","receivedMessageIds","Map","useMemo","internalTypes","CLEAR_SENT_MESSAGES","resolvedChannelName","stableRegisteredTypes","JSON","stringify","performCleanup","useCallback","prev","filter","msg","debouncedCleanup","debounce","fn","wait","result","timeoutId","lastArgs","debounced","args","clearTimeout","setTimeout","cancel","flush","Object","assign","current","setErrorMessage","postMessage","messageContent","channelCurrent","e","clearReceivedMessages","hasFilters","Boolean","ids","length","types","sources","includes","clearSentMessages","sync","idMatches","typeMatches","_b","_c","getLatestMessage","i","sourceMatches","handleMessage","event","isValidMessage","receivedAt","get","set","closeChannel","bc","close","removeEventListener","useEffect","BroadcastChannel","addEventListener","interval","setInterval","before","clearInterval","call","entries","delete","BroadcastChannelContext","createContext","ErrorBoundary","React","Component","constructor","this","state","hasError","getDerivedStateFromError","componentDidCatch","render","_jsx","props","children","BroadcastProvider","hookError","value","Provider","useBroadcastProvider","context","useContext","Error"],"mappings":"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"}
|
|
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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"}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -67,6 +67,10 @@ export interface BroadcastActions {
|
|
|
67
67
|
messages: BroadcastMessage[];
|
|
68
68
|
/** Array of sent messages */
|
|
69
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[]>;
|
|
70
74
|
/** Function to send a message */
|
|
71
75
|
postMessage: (messageType: string, messageContent: any, options?: SendMessageOptions) => void;
|
|
72
76
|
/** Function to clear received messages */
|
|
@@ -81,3 +85,4 @@ export interface BroadcastActions {
|
|
|
81
85
|
error: string | null;
|
|
82
86
|
}
|
|
83
87
|
export type ClearMessage = 'CLEAR_SENT_MESSAGES';
|
|
88
|
+
export type InternalMessage = ClearMessage | 'PING' | 'PONG';
|
package/dist/utils/debug.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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:
|
|
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
|
@@ -3,10 +3,10 @@ import {
|
|
|
3
3
|
BroadcastActions,
|
|
4
4
|
BroadcastMessage,
|
|
5
5
|
BroadcastOptions,
|
|
6
|
-
ClearMessage,
|
|
7
6
|
ClearReceivedMessagesOptions,
|
|
8
7
|
ClearSentMessagesOptions,
|
|
9
8
|
GetLatestMessageOptions,
|
|
9
|
+
InternalMessage,
|
|
10
10
|
SendMessageOptions,
|
|
11
11
|
} from '../types/types';
|
|
12
12
|
import {
|
|
@@ -20,10 +20,22 @@ import {
|
|
|
20
20
|
} from '../utils/messageUtils';
|
|
21
21
|
import { debug } from '../utils/debug';
|
|
22
22
|
|
|
23
|
-
const INTERNAL_MESSAGE_TYPES: Record<string,
|
|
23
|
+
const INTERNAL_MESSAGE_TYPES: Record<string, InternalMessage> = {
|
|
24
24
|
CLEAR_SENT_MESSAGES: 'CLEAR_SENT_MESSAGES',
|
|
25
|
+
PING: 'PING',
|
|
26
|
+
PONG: 'PONG',
|
|
25
27
|
} as const;
|
|
26
28
|
|
|
29
|
+
let flushSyncFn: undefined | ((cb: () => void) => void) = undefined;
|
|
30
|
+
if (process.env.NODE_ENV === 'test') {
|
|
31
|
+
try {
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
33
|
+
flushSyncFn = require('react-dom').flushSync;
|
|
34
|
+
} catch {
|
|
35
|
+
// ignore error in test env
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
27
39
|
export const useBroadcastChannel = (
|
|
28
40
|
channelName: string,
|
|
29
41
|
options: BroadcastOptions = {}
|
|
@@ -42,10 +54,14 @@ export const useBroadcastChannel = (
|
|
|
42
54
|
const [messages, setMessages] = useState<BroadcastMessage[]>([]);
|
|
43
55
|
const [sentMessages, setSentMessages] = useState<BroadcastMessage[]>([]);
|
|
44
56
|
const [error, setError] = useState<string | null>(null);
|
|
57
|
+
const [isPingInProgress, setIsPingInProgress] = useState(false);
|
|
45
58
|
|
|
46
59
|
// Refs
|
|
47
60
|
const channel = useRef<BroadcastChannel | null>(null);
|
|
48
61
|
const receivedMessageIds = useRef(new Map<string, number>());
|
|
62
|
+
const activeSourcesCollector = useRef<Set<string> | null>(null);
|
|
63
|
+
|
|
64
|
+
// Memoized values
|
|
49
65
|
const source = useMemo(() => sourceName || generateSourceName(), [sourceName]);
|
|
50
66
|
const internalTypes = useMemo(
|
|
51
67
|
() => ({
|
|
@@ -54,6 +70,8 @@ export const useBroadcastChannel = (
|
|
|
54
70
|
channelName,
|
|
55
71
|
namespace
|
|
56
72
|
),
|
|
73
|
+
PING: getInternalMessageType(INTERNAL_MESSAGE_TYPES.PING, channelName, namespace),
|
|
74
|
+
PONG: getInternalMessageType(INTERNAL_MESSAGE_TYPES.PONG, channelName, namespace),
|
|
57
75
|
}),
|
|
58
76
|
[channelName, namespace]
|
|
59
77
|
);
|
|
@@ -82,6 +100,45 @@ export const useBroadcastChannel = (
|
|
|
82
100
|
setTimeout(() => setError(null), 3000);
|
|
83
101
|
}, []);
|
|
84
102
|
|
|
103
|
+
const ping = useCallback(
|
|
104
|
+
(timeoutMs: number = 300): Promise<string[]> => {
|
|
105
|
+
if (isPingInProgress) {
|
|
106
|
+
debug.ping.inProgress();
|
|
107
|
+
return Promise.resolve([]);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!channel.current) {
|
|
111
|
+
const error =
|
|
112
|
+
'BroadcastChannel is not supported in this browser. Please check browser compatibility.';
|
|
113
|
+
debug.error(error);
|
|
114
|
+
setErrorMessage(error);
|
|
115
|
+
return Promise.resolve([]);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Set synchronously before returning the promise
|
|
119
|
+
if (flushSyncFn) {
|
|
120
|
+
flushSyncFn(() => setIsPingInProgress(true));
|
|
121
|
+
} else {
|
|
122
|
+
setIsPingInProgress(true);
|
|
123
|
+
}
|
|
124
|
+
const collector = new Set<string>();
|
|
125
|
+
activeSourcesCollector.current = collector;
|
|
126
|
+
|
|
127
|
+
channel.current.postMessage(createMessage(internalTypes.PING, null, source));
|
|
128
|
+
|
|
129
|
+
return new Promise(resolve => {
|
|
130
|
+
setTimeout(() => {
|
|
131
|
+
setIsPingInProgress(false);
|
|
132
|
+
if (activeSourcesCollector.current === collector) {
|
|
133
|
+
activeSourcesCollector.current = null;
|
|
134
|
+
}
|
|
135
|
+
resolve(Array.from(collector));
|
|
136
|
+
}, timeoutMs);
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
[internalTypes.PING, source, setErrorMessage, isPingInProgress, flushSyncFn]
|
|
140
|
+
);
|
|
141
|
+
|
|
85
142
|
const postMessage = useCallback(
|
|
86
143
|
(messageType: string, messageContent: any, options: SendMessageOptions = {}) => {
|
|
87
144
|
const channelCurrent = channel.current;
|
|
@@ -197,12 +254,25 @@ export const useBroadcastChannel = (
|
|
|
197
254
|
const idMatches = ids.length === 0 || ids.includes(msg.id);
|
|
198
255
|
const typeMatches = types.length === 0 || types.includes(msg.type);
|
|
199
256
|
|
|
200
|
-
// Remove when BOTH criteria match (wildcards included)
|
|
201
257
|
return !(idMatches && typeMatches);
|
|
202
258
|
}),
|
|
203
259
|
]);
|
|
204
260
|
|
|
205
|
-
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (message.type === internalTypes.PING) {
|
|
264
|
+
channel.current?.postMessage(createMessage(internalTypes.PONG, null, source));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (message.type === internalTypes.PONG) {
|
|
269
|
+
const pongSource = message.source;
|
|
270
|
+
const collector = activeSourcesCollector.current;
|
|
271
|
+
|
|
272
|
+
if (collector && collector.has(pongSource) === false) {
|
|
273
|
+
collector.add(pongSource);
|
|
274
|
+
}
|
|
275
|
+
|
|
206
276
|
return;
|
|
207
277
|
}
|
|
208
278
|
}
|
|
@@ -305,6 +375,8 @@ export const useBroadcastChannel = (
|
|
|
305
375
|
channelName: resolvedChannelName,
|
|
306
376
|
messages,
|
|
307
377
|
sentMessages,
|
|
378
|
+
isPingInProgress,
|
|
379
|
+
ping,
|
|
308
380
|
postMessage,
|
|
309
381
|
clearReceivedMessages,
|
|
310
382
|
clearSentMessages,
|