Skip to content

Commit 14f619e

Browse files
committed
fix: handle sessions in realtime service for web
1 parent d836725 commit 14f619e

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

templates/web/src/services/realtime.ts.twig

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2436
export 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

Comments
 (0)