Skip to content

Commit b66910c

Browse files
authored
Merge pull request #1231 from appwrite/handle-sessions-realtime-web
2 parents d836725 + 1c64a0e commit b66910c

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

templates/web/src/client.ts.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ class Client {
478478
this.realtime.lastMessage = message;
479479
switch (message.type) {
480480
case 'connected':
481-
let session = this.config.session;
481+
let session = this.config?.session;
482482
if (!session) {
483483
const cookie = JSON.parse(window.localStorage.getItem('cookieFallback') ?? '{}');
484484
session = cookie?.[`a_session_${this.config.project}`];

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

Lines changed: 43 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,33 @@ export class Realtime {
344360
}
345361
}
346362

363+
private handleResponseConnected(message: RealtimeResponse): void {
364+
if (!message.data) {
365+
return;
366+
}
367+
368+
const messageData = message.data as RealtimeResponseConnected;
369+
370+
let session = this.client.config?.session;
371+
if (!session) {
372+
try {
373+
const cookie = JSON.parse(window.localStorage.getItem('cookieFallback') ?? '{}');
374+
session = cookie?.[`a_session_${this.client.config.project}`];
375+
} catch (error) {
376+
console.error('Failed to parse cookie fallback:', error);
377+
}
378+
}
379+
380+
if (session && !messageData.user) {
381+
this.socket?.send(JSON.stringify(<RealtimeRequest>{
382+
type: 'authentication',
383+
data: {
384+
session
385+
}
386+
}));
387+
}
388+
}
389+
347390
private handleResponseError(message: RealtimeResponse): void {
348391
const error = new {{spec.title | caseUcfirst}}Exception(
349392
message.data?.message || 'Unknown error'

0 commit comments

Comments
 (0)