Skip to content

Commit d03f033

Browse files
committed
fix(realtime): transform paylaod on join and leave, fix tests
1 parent e63f3d3 commit d03f033

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

packages/core/realtime-js/src/phoenix/presenceAdapter.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Presence } from '@supabase/phoenix'
22
import type { PresenceState, PresenceStates } from './types'
33
import type {
4+
RealtimePresenceJoinPayload,
45
RealtimePresenceOptions,
56
RealtimePresenceState,
67
Presence as RealtimePresenceType,
@@ -61,23 +62,15 @@ export default class PresenceAdapter {
6162

6263
return Object.getOwnPropertyNames(state).reduce((newState, key) => {
6364
const presences = state[key]
64-
65-
newState[key] = presences.metas.map((presence) => {
66-
presence['presence_ref'] = presence['phx_ref']
67-
68-
delete presence['phx_ref']
69-
delete presence['phx_ref_prev']
70-
71-
return presence
72-
}) as RealtimePresenceType[]
65+
newState[key] = transformState(presences)
7366

7467
return newState
7568
}, {} as RealtimePresenceState)
7669
}
7770

7871
static onJoinPayload(key: string, currentPresence: PresenceState, newPresence: PresenceState) {
7972
const currentPresences = parseCurrentPresences(currentPresence)
80-
const newPresences = newPresence['metas']
73+
const newPresences = transformState(newPresence)
8174

8275
return {
8376
event: 'join',
@@ -89,7 +82,7 @@ export default class PresenceAdapter {
8982

9083
static onLeavePayload(key: string, currentPresence: PresenceState, leftPresence: PresenceState) {
9184
const currentPresences = parseCurrentPresences(currentPresence)
92-
const leftPresences = leftPresence['metas']
85+
const leftPresences = transformState(leftPresence)
9386

9487
return {
9588
event: 'leave',
@@ -100,6 +93,17 @@ export default class PresenceAdapter {
10093
}
10194
}
10295

96+
function transformState(presences: PresenceState) {
97+
return presences.metas.map((presence) => {
98+
presence['presence_ref'] = presence['phx_ref']
99+
100+
delete presence['phx_ref']
101+
delete presence['phx_ref_prev']
102+
103+
return presence
104+
}) as RealtimePresenceType[]
105+
}
106+
103107
function cloneState(state: PresenceStates): PresenceStates {
104108
return JSON.parse(JSON.stringify(state))
105109
}
@@ -109,5 +113,5 @@ function phoenixPresenceOptions(opts?: RealtimePresenceOptions) {
109113
}
110114

111115
function parseCurrentPresences(currentPresences?: PresenceState) {
112-
return currentPresences?.metas || []
116+
return currentPresences?.metas ? transformState(currentPresences) : []
113117
}

packages/core/realtime-js/test/RealtimeChannel.presence.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe('Presence state management', () => {
7979
currentPresences: [],
8080
event: 'join',
8181
key: 'user-123',
82-
newPresences: [{ phx_ref: 'phoenix_ref', name: 'John', user_id: 'user-123' }],
82+
newPresences: [{ presence_ref: 'phoenix_ref', name: 'John', user_id: 'user-123' }],
8383
})
8484
)
8585
})
@@ -127,7 +127,7 @@ describe('Presence state management', () => {
127127
currentPresences: [],
128128
event: 'leave',
129129
key: 'user-123',
130-
leftPresences: [{ phx_ref: 'phoenix_ref', name: 'John', user_id: 'user-123' }],
130+
leftPresences: [{ presence_ref: 'phoenix_ref', name: 'John', user_id: 'user-123' }],
131131
})
132132
)
133133
})
@@ -200,7 +200,7 @@ describe('Presence state management', () => {
200200
currentPresences: [],
201201
event: 'join',
202202
key: 'user-123',
203-
newPresences: [{ phx_ref: 'phoenix_ref', name: 'John', user_id: 'user-123' }],
203+
newPresences: [{ presence_ref: 'phoenix_ref', name: 'John', user_id: 'user-123' }],
204204
})
205205
)
206206
})

0 commit comments

Comments
 (0)