@@ -21,6 +21,18 @@ export type RealtimeResponseEvent<T = any> = {
2121 payload: T;
2222}
2323
24+ export type RealtimeResponseConnected = {
25+ channels: string[];
26+ user?: object;
27+ }
28+
29+ export type RealtimeRequest = {
30+ type: 'authentication';
31+ data: {
32+ session: string;
33+ };
34+ }
35+
2436export enum RealtimeCode {
2537 NORMAL_CLOSURE = 1000,
2638 POLICY_VIOLATION = 1008,
@@ -31,6 +43,7 @@ export class Realtime {
3143 private readonly TYPE_ERROR = 'error';
3244 private readonly TYPE_EVENT = 'event';
3345 private readonly TYPE_PONG = 'pong';
46+ private readonly TYPE_CONNECTED = 'connected';
3447 private readonly DEBOUNCE_MS = 1;
3548 private readonly HEARTBEAT_INTERVAL = 20000; // 20 seconds in milliseconds
3649
@@ -332,6 +345,9 @@ export class Realtime {
332345 }
333346
334347 switch (message.type) {
348+ case this.TYPE_CONNECTED:
349+ this.handleResponseConnected(message);
350+ break;
335351 case this.TYPE_ERROR:
336352 this.handleResponseError(message);
337353 break;
@@ -344,6 +360,25 @@ export class Realtime {
344360 }
345361 }
346362
363+ private handleResponseConnected(message: RealtimeResponse): void {
364+ let session = this.client.config.session;
365+ if (!session) {
366+ const cookie = JSON.parse(window.localStorage.getItem('cookieFallback') ?? '{}');
367+ session = cookie?.[`a_session_${this.client.config.project}`];
368+ }
369+
370+ const messageData = <RealtimeResponseConnected >message.data;
371+
372+ if (session && !messageData.user) {
373+ this.socket?.send(JSON.stringify(<RealtimeRequest >{
374+ type: 'authentication',
375+ data: {
376+ session
377+ }
378+ }));
379+ }
380+ }
381+
347382 private handleResponseError(message: RealtimeResponse): void {
348383 const error = new {{spec .title | caseUcfirst }}Exception(
349384 message.data?.message || 'Unknown error'
0 commit comments