@supabase/realtime-js 1.7.3 → 1.7.5

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.
Files changed (51) hide show
  1. package/dist/main/RealtimeClient.d.ts +4 -4
  2. package/dist/main/RealtimeClient.d.ts.map +1 -1
  3. package/dist/main/RealtimeClient.js +1 -40
  4. package/dist/main/RealtimeClient.js.map +1 -1
  5. package/dist/main/index.d.ts +1 -3
  6. package/dist/main/index.d.ts.map +1 -1
  7. package/dist/main/index.js +1 -5
  8. package/dist/main/index.js.map +1 -1
  9. package/dist/main/lib/push.d.ts +2 -3
  10. package/dist/main/lib/push.d.ts.map +1 -1
  11. package/dist/main/lib/push.js +3 -16
  12. package/dist/main/lib/push.js.map +1 -1
  13. package/dist/main/lib/version.d.ts +1 -1
  14. package/dist/main/lib/version.js +1 -1
  15. package/dist/module/RealtimeClient.d.ts +4 -4
  16. package/dist/module/RealtimeClient.d.ts.map +1 -1
  17. package/dist/module/RealtimeClient.js +1 -40
  18. package/dist/module/RealtimeClient.js.map +1 -1
  19. package/dist/module/index.d.ts +1 -3
  20. package/dist/module/index.d.ts.map +1 -1
  21. package/dist/module/index.js +1 -3
  22. package/dist/module/index.js.map +1 -1
  23. package/dist/module/lib/push.d.ts +2 -3
  24. package/dist/module/lib/push.d.ts.map +1 -1
  25. package/dist/module/lib/push.js +3 -13
  26. package/dist/module/lib/push.js.map +1 -1
  27. package/dist/module/lib/version.d.ts +1 -1
  28. package/dist/module/lib/version.js +1 -1
  29. package/package.json +5 -3
  30. package/src/RealtimeClient.ts +9 -48
  31. package/src/index.ts +0 -4
  32. package/src/lib/push.ts +4 -12
  33. package/src/lib/version.ts +1 -1
  34. package/dist/main/RealtimeChannel.d.ts +0 -81
  35. package/dist/main/RealtimeChannel.d.ts.map +0 -1
  36. package/dist/main/RealtimeChannel.js +0 -242
  37. package/dist/main/RealtimeChannel.js.map +0 -1
  38. package/dist/main/RealtimePresence.d.ts +0 -97
  39. package/dist/main/RealtimePresence.d.ts.map +0 -1
  40. package/dist/main/RealtimePresence.js +0 -201
  41. package/dist/main/RealtimePresence.js.map +0 -1
  42. package/dist/module/RealtimeChannel.d.ts +0 -81
  43. package/dist/module/RealtimeChannel.d.ts.map +0 -1
  44. package/dist/module/RealtimeChannel.js +0 -236
  45. package/dist/module/RealtimeChannel.js.map +0 -1
  46. package/dist/module/RealtimePresence.d.ts +0 -97
  47. package/dist/module/RealtimePresence.d.ts.map +0 -1
  48. package/dist/module/RealtimePresence.js +0 -198
  49. package/dist/module/RealtimePresence.js.map +0 -1
  50. package/src/RealtimeChannel.ts +0 -289
  51. package/src/RealtimePresence.ts +0 -326
@@ -1,326 +0,0 @@
1
- /*
2
- This file draws heavily from https://github.com/phoenixframework/phoenix/blob/d344ec0a732ab4ee204215b31de69cf4be72e3bf/assets/js/phoenix/presence.js
3
- License: https://github.com/phoenixframework/phoenix/blob/d344ec0a732ab4ee204215b31de69cf4be72e3bf/LICENSE.md
4
- */
5
-
6
- import {
7
- PresenceOpts,
8
- PresenceOnJoinCallback,
9
- PresenceOnLeaveCallback,
10
- } from 'phoenix'
11
- import RealtimeChannel from './RealtimeChannel'
12
-
13
- type Presence = {
14
- presence_id: string
15
- [key: string]: any
16
- }
17
-
18
- type PresenceState = { [key: string]: Presence[] }
19
-
20
- type PresenceDiff = {
21
- joins: PresenceState
22
- leaves: PresenceState
23
- }
24
-
25
- type RawPresenceState = {
26
- [key: string]: Record<
27
- 'metas',
28
- {
29
- phx_ref?: string
30
- phx_ref_prev?: string
31
- [key: string]: any
32
- }[]
33
- >
34
- }
35
-
36
- type RawPresenceDiff = {
37
- joins: RawPresenceState
38
- leaves: RawPresenceState
39
- }
40
-
41
- type PresenceChooser<T> = (key: string, presences: any) => T
42
-
43
- export default class RealtimePresence {
44
- state: PresenceState = {}
45
- pendingDiffs: RawPresenceDiff[] = []
46
- joinRef: string | null = null
47
- caller: {
48
- onJoin: PresenceOnJoinCallback
49
- onLeave: PresenceOnLeaveCallback
50
- onSync: () => void
51
- } = {
52
- onJoin: () => {},
53
- onLeave: () => {},
54
- onSync: () => {},
55
- }
56
-
57
- /**
58
- * Initializes the Presence.
59
- *
60
- * @param channel - The RealtimeSubscription
61
- * @param opts - The options,
62
- * for example `{events: {state: 'state', diff: 'diff'}}`
63
- */
64
- constructor(public channel: RealtimeChannel, opts?: PresenceOpts) {
65
- const events = opts?.events || {
66
- state: 'presence_state',
67
- diff: 'presence_diff',
68
- }
69
-
70
- this.channel.on(events.state, {}, (newState: RawPresenceState) => {
71
- const { onJoin, onLeave, onSync } = this.caller
72
-
73
- this.joinRef = this.channel.joinRef()
74
-
75
- this.state = RealtimePresence.syncState(
76
- this.state,
77
- newState,
78
- onJoin,
79
- onLeave
80
- )
81
-
82
- this.pendingDiffs.forEach((diff) => {
83
- this.state = RealtimePresence.syncDiff(
84
- this.state,
85
- diff,
86
- onJoin,
87
- onLeave
88
- )
89
- })
90
-
91
- this.pendingDiffs = []
92
-
93
- onSync()
94
- })
95
-
96
- this.channel.on(events.diff, {}, (diff: RawPresenceDiff) => {
97
- const { onJoin, onLeave, onSync } = this.caller
98
-
99
- if (this.inPendingSyncState()) {
100
- this.pendingDiffs.push(diff)
101
- } else {
102
- this.state = RealtimePresence.syncDiff(
103
- this.state,
104
- diff,
105
- onJoin,
106
- onLeave
107
- )
108
-
109
- onSync()
110
- }
111
- })
112
- }
113
-
114
- /**
115
- * Used to sync the list of presences on the server with the
116
- * client's state.
117
- *
118
- * An optional `onJoin` and `onLeave` callback can be provided to
119
- * react to changes in the client's local presences across
120
- * disconnects and reconnects with the server.
121
- */
122
- static syncState(
123
- currentState: PresenceState,
124
- newState: RawPresenceState | PresenceState,
125
- onJoin: PresenceOnJoinCallback,
126
- onLeave: PresenceOnLeaveCallback
127
- ): PresenceState {
128
- const state = this.cloneDeep(currentState)
129
- const transformedState = this.transformState(newState)
130
- const joins: PresenceState = {}
131
- const leaves: PresenceState = {}
132
-
133
- this.map(state, (key: string, presences: Presence[]) => {
134
- if (!transformedState[key]) {
135
- leaves[key] = presences
136
- }
137
- })
138
-
139
- this.map(transformedState, (key, newPresences: Presence[]) => {
140
- const currentPresences: Presence[] = state[key]
141
-
142
- if (currentPresences) {
143
- const newPresenceIds = newPresences.map((m: Presence) => m.presence_id)
144
- const curPresenceIds = currentPresences.map(
145
- (m: Presence) => m.presence_id
146
- )
147
- const joinedPresences: Presence[] = newPresences.filter(
148
- (m: Presence) => curPresenceIds.indexOf(m.presence_id) < 0
149
- )
150
- const leftPresences: Presence[] = currentPresences.filter(
151
- (m: Presence) => newPresenceIds.indexOf(m.presence_id) < 0
152
- )
153
-
154
- if (joinedPresences.length > 0) {
155
- joins[key] = joinedPresences
156
- }
157
-
158
- if (leftPresences.length > 0) {
159
- leaves[key] = leftPresences
160
- }
161
- } else {
162
- joins[key] = newPresences
163
- }
164
- })
165
-
166
- return this.syncDiff(state, { joins, leaves }, onJoin, onLeave)
167
- }
168
-
169
- /**
170
- * Used to sync a diff of presence join and leave events from the
171
- * server, as they happen.
172
- *
173
- * Like `syncState`, `syncDiff` accepts optional `onJoin` and
174
- * `onLeave` callbacks to react to a user joining or leaving from a
175
- * device.
176
- */
177
- static syncDiff(
178
- state: PresenceState,
179
- diff: RawPresenceDiff | PresenceDiff,
180
- onJoin: PresenceOnJoinCallback,
181
- onLeave: PresenceOnLeaveCallback
182
- ): PresenceState {
183
- const { joins, leaves } = {
184
- joins: this.transformState(diff.joins),
185
- leaves: this.transformState(diff.leaves),
186
- }
187
-
188
- if (!onJoin) {
189
- onJoin = () => {}
190
- }
191
-
192
- if (!onLeave) {
193
- onLeave = () => {}
194
- }
195
-
196
- this.map(joins, (key, newPresences: Presence[]) => {
197
- const currentPresences: Presence[] = state[key]
198
- state[key] = this.cloneDeep(newPresences)
199
-
200
- if (currentPresences) {
201
- const joinedPresenceIds = state[key].map((m: Presence) => m.presence_id)
202
- const curPresences: Presence[] = currentPresences.filter(
203
- (m: Presence) => joinedPresenceIds.indexOf(m.presence_id) < 0
204
- )
205
-
206
- state[key].unshift(...curPresences)
207
- }
208
-
209
- onJoin(key, currentPresences, newPresences)
210
- })
211
-
212
- this.map(leaves, (key, leftPresences: Presence[]) => {
213
- let currentPresences: Presence[] = state[key]
214
-
215
- if (!currentPresences) return
216
-
217
- const presenceIdsToRemove = leftPresences.map(
218
- (m: Presence) => m.presence_id
219
- )
220
- currentPresences = currentPresences.filter(
221
- (m: Presence) => presenceIdsToRemove.indexOf(m.presence_id) < 0
222
- )
223
-
224
- state[key] = currentPresences
225
-
226
- onLeave(key, currentPresences, leftPresences)
227
-
228
- if (currentPresences.length === 0) delete state[key]
229
- })
230
-
231
- return state
232
- }
233
-
234
- /**
235
- * Returns the array of presences, with selected metadata.
236
- */
237
- static list<T = any>(
238
- presences: PresenceState,
239
- chooser: PresenceChooser<T> | undefined
240
- ): T[] {
241
- if (!chooser) {
242
- chooser = (_key, pres) => pres
243
- }
244
-
245
- return this.map(presences, (key, presences: Presence[]) =>
246
- chooser!(key, presences)
247
- )
248
- }
249
-
250
- private static map<T = any>(
251
- obj: PresenceState,
252
- func: PresenceChooser<T>
253
- ): T[] {
254
- return Object.getOwnPropertyNames(obj).map((key) => func(key, obj[key]))
255
- }
256
-
257
- /**
258
- * Remove 'metas' key
259
- * Change 'phx_ref' to 'presence_id'
260
- * Remove 'phx_ref' and 'phx_ref_prev'
261
- *
262
- * @example
263
- * // returns {
264
- * abc123: [
265
- * { presence_id: '2', user_id: 1 },
266
- * { presence_id: '3', user_id: 2 }
267
- * ]
268
- * }
269
- * RealtimePresence.transformState({
270
- * abc123: {
271
- * metas: [
272
- * { phx_ref: '2', phx_ref_prev: '1' user_id: 1 },
273
- * { phx_ref: '3', user_id: 2 }
274
- * ]
275
- * }
276
- * })
277
- */
278
- private static transformState(
279
- state: RawPresenceState | PresenceState
280
- ): PresenceState {
281
- state = this.cloneDeep(state)
282
-
283
- return Object.getOwnPropertyNames(state).reduce((newState, key) => {
284
- const presences = state[key]
285
-
286
- if ('metas' in presences) {
287
- newState[key] = presences.metas.map((presence) => {
288
- presence['presence_id'] = presence['phx_ref']
289
-
290
- delete presence['phx_ref']
291
- delete presence['phx_ref_prev']
292
-
293
- return presence
294
- }) as Presence[]
295
- } else {
296
- newState[key] = presences
297
- }
298
-
299
- return newState
300
- }, {} as PresenceState)
301
- }
302
-
303
- private static cloneDeep(obj: object) {
304
- return JSON.parse(JSON.stringify(obj))
305
- }
306
-
307
- onJoin(callback: PresenceOnJoinCallback): void {
308
- this.caller.onJoin = callback
309
- }
310
-
311
- onLeave(callback: PresenceOnLeaveCallback): void {
312
- this.caller.onLeave = callback
313
- }
314
-
315
- onSync(callback: () => void): void {
316
- this.caller.onSync = callback
317
- }
318
-
319
- list<T = any>(by?: PresenceChooser<T>): T[] {
320
- return RealtimePresence.list<T>(this.state, by)
321
- }
322
-
323
- private inPendingSyncState(): boolean {
324
- return !this.joinRef || this.joinRef !== this.channel.joinRef()
325
- }
326
- }