react-broadcast-sync 1.1.4 → 1.2.1

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.
@@ -1,5 +1,6 @@
1
1
  import { renderHook, act } from '@testing-library/react';
2
2
  import { useBroadcastChannel } from '../hooks/useBroadcastChannel';
3
+ import { getInternalMessageType } from '../utils/messageUtils';
3
4
 
4
5
  let mockChannels: any[] = [];
5
6
 
@@ -118,7 +119,7 @@ describe('useBroadcastChannel', () => {
118
119
  expect(result.current.messages.length).toBe(1);
119
120
 
120
121
  act(() => {
121
- result.current.clearMessage('123');
122
+ result.current.clearReceivedMessages({ ids: ['123'] });
122
123
  });
123
124
 
124
125
  expect(result.current.messages.length).toBe(0);
@@ -149,7 +150,7 @@ describe('useBroadcastChannel', () => {
149
150
  expect(result.current.messages.length).toBe(2);
150
151
 
151
152
  act(() => {
152
- result.current.clearAllMessages();
153
+ result.current.clearReceivedMessages();
153
154
  });
154
155
 
155
156
  expect(result.current.messages.length).toBe(0);
@@ -167,7 +168,7 @@ describe('useBroadcastChannel', () => {
167
168
  expect(result.current.sentMessages.length).toBe(1);
168
169
 
169
170
  act(() => {
170
- result.current.clearSentMessage(sentId);
171
+ result.current.clearSentMessages({ ids: [sentId] });
171
172
  });
172
173
 
173
174
  expect(result.current.sentMessages.length).toBe(0);
@@ -262,7 +263,7 @@ describe('useBroadcastChannel', () => {
262
263
  expect(result.current.messages.length).toBe(1);
263
264
  });
264
265
 
265
- it('handles internal clear message from other source', async () => {
266
+ it('handles internal clear message (single id) from other source', async () => {
266
267
  const { result } = renderHook(() => useBroadcastChannel('test-channel'));
267
268
  await waitForChannel();
268
269
  const channel = mockChannels[0];
@@ -279,11 +280,12 @@ describe('useBroadcastChannel', () => {
279
280
 
280
281
  expect(result.current.messages.length).toBe(1);
281
282
 
283
+ const internalType = getInternalMessageType('CLEAR_SENT_MESSAGES', 'test-channel');
282
284
  act(() => {
283
285
  channel.simulateMessage({
284
- id: 'to-clear',
285
- type:
286
- '__INTERNAL__:CLEAR_MESSAGE:' + btoa('react-broadcast-sync:CLEAR_MESSAGE:test-channel-'),
286
+ id: 'internal-1',
287
+ type: internalType,
288
+ message: { ids: ['to-clear'], types: [] },
287
289
  source: 'another-tab',
288
290
  timestamp: Date.now(),
289
291
  });
@@ -292,7 +294,7 @@ describe('useBroadcastChannel', () => {
292
294
  expect(result.current.messages.length).toBe(0);
293
295
  });
294
296
 
295
- it('handles internal clear all messages from other source', async () => {
297
+ it('handles internal clear all messages (wildcard) from other source', async () => {
296
298
  const { result } = renderHook(() => useBroadcastChannel('test-channel'));
297
299
  await waitForChannel();
298
300
  const channel = mockChannels[0];
@@ -316,14 +318,12 @@ describe('useBroadcastChannel', () => {
316
318
 
317
319
  expect(result.current.messages.length).toBe(2);
318
320
 
321
+ const internalTypeAll = getInternalMessageType('CLEAR_SENT_MESSAGES', 'test-channel');
319
322
  act(() => {
320
323
  channel.simulateMessage({
321
- id:
322
- '__INTERNAL__:CLEAR_ALL_MESSAGES:' +
323
- btoa('react-broadcast-sync:CLEAR_ALL_MESSAGES:test-channel-'),
324
- type:
325
- '__INTERNAL__:CLEAR_ALL_MESSAGES:' +
326
- btoa('react-broadcast-sync:CLEAR_ALL_MESSAGES:test-channel-'),
324
+ id: 'internal-2',
325
+ type: internalTypeAll,
326
+ message: { ids: [], types: [] },
327
327
  source: 'another-tab',
328
328
  timestamp: Date.now(),
329
329
  });
@@ -57,6 +57,18 @@ export interface BroadcastMessage {
57
57
  /** Optional expiration timestamp */
58
58
  expirationDate?: number;
59
59
  }
60
+ export interface ClearOptions {
61
+ ids?: string[];
62
+ types?: string[];
63
+ }
64
+
65
+ export interface ClearReceivedMessagesOptions extends ClearOptions {
66
+ sources?: string[];
67
+ }
68
+
69
+ export interface ClearSentMessagesOptions extends ClearOptions {
70
+ sync?: boolean;
71
+ }
60
72
 
61
73
  /**
62
74
  * Actions and state provided by the broadcast channel hook
@@ -74,15 +86,14 @@ export interface BroadcastActions {
74
86
  /** Function to send a message */
75
87
  postMessage: (messageType: string, messageContent: any, options?: SendMessageOptions) => void;
76
88
 
77
- /** Function to clear a specific message */
78
- clearMessage: (id: string) => void;
79
-
80
- /** Function to clear all messages */
81
- clearAllMessages: () => void;
89
+ /** Function to clear received messages */
90
+ clearReceivedMessages: (options?: ClearReceivedMessagesOptions) => void;
82
91
 
83
- /** Function to clear a specific sent message */
84
- clearSentMessage: (id: string) => void;
92
+ /** Function to clear sent messages */
93
+ clearSentMessages: (options?: ClearSentMessagesOptions) => void;
85
94
 
86
95
  /** Current error state */
87
96
  error: string | null;
88
97
  }
98
+
99
+ export type ClearMessage = 'CLEAR_SENT_MESSAGES';
@@ -29,8 +29,8 @@ const log = (level: LogLevel, message: string, data?: any) => {
29
29
 
30
30
  export const debug = {
31
31
  channel: {
32
- created: (channelName: string) => log('info', 'Channel created:', channelName),
33
- closed: (channelName: string) => log('info', 'Channel closed:', channelName),
32
+ created: (name: string) => log('info', 'Channel created:', name),
33
+ closed: (name: string) => log('info', 'Channel closed:', name),
34
34
  },
35
35
  message: {
36
36
  sent: (message: any) => log('info', 'Message sent:', message),
@@ -38,6 +38,8 @@ export const debug = {
38
38
  cleared: (messageId: string) => log('info', 'Message cleared:', messageId),
39
39
  expired: (messageId: string) => log('info', 'Message expired:', messageId),
40
40
  duplicate: (messageId: string) => log('warn', 'Duplicate message ignored:', messageId),
41
+ allSentCleared: () => log('info', 'All sent messages cleared'),
42
+ allReceivedCleared: () => log('info', 'All received messages cleared'),
41
43
  },
42
44
  cleanup: {
43
45
  started: () => log('info', 'Cleanup started'),
@@ -1,3 +1,5 @@
1
+ import { ClearMessage } from '../types/types';
2
+
1
3
  const INTERNAL_PREFIX = '__INTERNAL__';
2
4
  const SECRET = 'react-broadcast-sync';
3
5
 
@@ -44,7 +46,7 @@ export const createMessage = (
44
46
  };
45
47
 
46
48
  export const getInternalMessageType = (
47
- baseType: 'CLEAR_MESSAGE' | 'CLEAR_ALL_MESSAGES',
49
+ baseType: ClearMessage,
48
50
  channelName: string,
49
51
  namespace = ''
50
52
  ): string => {
@@ -58,16 +60,13 @@ export const isInternalType = (type: string): boolean => {
58
60
  return type.startsWith(`${INTERNAL_PREFIX}:`);
59
61
  };
60
62
 
61
- export const isValidInternalClearMessage = (
62
- message: any
63
- ): message is { id: string; type: string; source: string } => {
63
+ export const isValidInternalClearMessage = (message: any): boolean => {
64
64
  return (
65
65
  message &&
66
66
  typeof message === 'object' &&
67
- typeof message.id === 'string' &&
68
- typeof message.source === 'string' &&
69
67
  typeof message.type === 'string' &&
70
- isInternalType(message.type)
68
+ isInternalType(message.type) &&
69
+ typeof message.source === 'string'
71
70
  );
72
71
  };
73
72