serve-socket 5.3.0 → 5.4.1
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.
- package/fesm2022/serve-socket.mjs +80 -63
- package/fesm2022/serve-socket.mjs.map +1 -1
- package/index.d.ts +29 -12
- package/package.json +1 -1
|
@@ -113,39 +113,33 @@ class SocketService {
|
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
115
|
this.socket = io(this.url, socketOptions);
|
|
116
|
+
// Single 'connect' handler: update status, reestablish listeners, and signal reconnect
|
|
117
|
+
// if this is not the very first connection (hasConnectedOnce persists across resetWithNewToken calls).
|
|
116
118
|
this.socket.on('connect', () => {
|
|
117
|
-
console.log('Socket connected');
|
|
119
|
+
console.log(this.hasConnectedOnce ? 'Socket reconnected' : 'Socket connected');
|
|
118
120
|
this.connectionStatusSubject.next(true);
|
|
119
121
|
this.reestablishListeners();
|
|
120
|
-
});
|
|
121
|
-
this.socket.on('disconnect', () => {
|
|
122
|
-
console.log('Socket disconnected');
|
|
123
|
-
this.connectionStatusSubject.next(false);
|
|
124
|
-
});
|
|
125
|
-
// In Socket.IO v4 the 'reconnect' event is on the Manager (socket.io), not the socket.
|
|
126
|
-
// hasConnectedOnce is an instance variable so it persists across resetWithNewToken() calls.
|
|
127
|
-
// Any connect after the very first one (regardless of socket recreation) triggers stores to reload.
|
|
128
|
-
this.socket.on('connect', () => {
|
|
129
122
|
if (this.hasConnectedOnce) {
|
|
130
|
-
console.log('Socket reconnected');
|
|
131
123
|
this.reconnectSubject.next();
|
|
132
124
|
}
|
|
133
125
|
this.hasConnectedOnce = true;
|
|
134
126
|
});
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
this.connectionStatusSubject.next(true);
|
|
139
|
-
this.reconnectSubject.next();
|
|
140
|
-
this.reestablishListeners();
|
|
127
|
+
this.socket.on('disconnect', () => {
|
|
128
|
+
console.log('Socket disconnected');
|
|
129
|
+
this.connectionStatusSubject.next(false);
|
|
141
130
|
});
|
|
131
|
+
// NOTE: Do NOT add socket.io.on('reconnect', ...) here — that event is on the shared
|
|
132
|
+
// Manager, not the socket, so it accumulates across resetWithNewToken() calls.
|
|
133
|
+
// The socket-level 'connect' handler above already covers all reconnect scenarios.
|
|
142
134
|
this.socket.on('connect_error', (err) => {
|
|
143
135
|
console.error('Connection error:', err.message);
|
|
144
136
|
});
|
|
145
137
|
this.socket.on('reconnect_error', (err) => {
|
|
146
138
|
console.error('Reconnection error:', err.message);
|
|
147
139
|
});
|
|
148
|
-
//
|
|
140
|
+
// Ping/pong for health monitoring. Remove before re-adding to prevent accumulation
|
|
141
|
+
// across resetWithNewToken() calls (socket.io is the shared Manager).
|
|
142
|
+
this.socket.io.off('ping');
|
|
149
143
|
this.socket.io.on('ping', () => {
|
|
150
144
|
this.lastPongTime = Date.now();
|
|
151
145
|
this.healthySubject.next(true);
|
|
@@ -198,10 +192,15 @@ class SocketService {
|
|
|
198
192
|
});
|
|
199
193
|
}
|
|
200
194
|
/**
|
|
201
|
-
* Set authentication token for socket connection
|
|
195
|
+
* Set authentication token for socket connection.
|
|
196
|
+
* Also updates socket.auth on the live socket so Socket.IO uses the new token
|
|
197
|
+
* on its next reconnection attempt without needing to recreate the socket.
|
|
202
198
|
*/
|
|
203
199
|
setAuthToken(token) {
|
|
204
200
|
this.authToken = token;
|
|
201
|
+
if (this.socket) {
|
|
202
|
+
this.socket.auth = { token };
|
|
203
|
+
}
|
|
205
204
|
}
|
|
206
205
|
/**
|
|
207
206
|
* Set connection key for socket connection
|
|
@@ -210,19 +209,24 @@ class SocketService {
|
|
|
210
209
|
this.connectionKey = key;
|
|
211
210
|
}
|
|
212
211
|
/**
|
|
213
|
-
* Reset connection with new token
|
|
212
|
+
* Reset connection with new token.
|
|
213
|
+
* Idempotent: if the socket is already active (connecting or connected) with the same
|
|
214
|
+
* token, this is a no-op. This prevents double-calls (e.g. from router navigation
|
|
215
|
+
* events on page refresh) from tearing down a healthy connection.
|
|
214
216
|
*/
|
|
215
217
|
resetWithNewToken(token) {
|
|
218
|
+
const tokenUnchanged = !token || token === this.authToken;
|
|
219
|
+
const socketIsActive = this.socket && !this.socket.disconnected;
|
|
220
|
+
if (tokenUnchanged && socketIsActive) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
216
223
|
if (token) {
|
|
217
224
|
this.authToken = token;
|
|
218
225
|
}
|
|
219
|
-
if (this.socket) {
|
|
220
|
-
this.socket.disconnect();
|
|
221
|
-
}
|
|
222
226
|
this.setupSocketConnection();
|
|
223
227
|
}
|
|
224
228
|
connect(timeoutMs = 15000) {
|
|
225
|
-
//
|
|
229
|
+
// Already connected — nothing to do.
|
|
226
230
|
if (this.socket?.connected) {
|
|
227
231
|
return Promise.resolve();
|
|
228
232
|
}
|
|
@@ -233,21 +237,24 @@ class SocketService {
|
|
|
233
237
|
console.warn('[Socket] Connection timeout — socket will keep retrying in background');
|
|
234
238
|
resolve();
|
|
235
239
|
}, timeoutMs);
|
|
236
|
-
|
|
240
|
+
// Only create a new socket if one does not exist yet.
|
|
241
|
+
// If a socket already exists but hasn't connected yet (e.g. this method was called
|
|
242
|
+
// twice in rapid succession), reuse it — do NOT call setupSocketConnection() again
|
|
243
|
+
// as that would destroy the in-progress attempt and cause a connect/disconnect loop.
|
|
244
|
+
if (!this.socket) {
|
|
245
|
+
this.setupSocketConnection();
|
|
246
|
+
}
|
|
237
247
|
if (this.socket.connected) {
|
|
238
248
|
clearTimeout(timeout);
|
|
239
249
|
resolve();
|
|
240
250
|
return;
|
|
241
251
|
}
|
|
242
|
-
// Wait for the connect event
|
|
252
|
+
// Wait for the connect event on the existing or newly created socket.
|
|
243
253
|
this.socket.once('connect', () => {
|
|
244
254
|
clearTimeout(timeout);
|
|
245
255
|
resolve();
|
|
246
256
|
});
|
|
247
|
-
|
|
248
|
-
// Log but don't reject — reconnection logic will keep retrying
|
|
249
|
-
console.warn('[Socket] connect_error:', err.message);
|
|
250
|
-
});
|
|
257
|
+
// Reconnect if the socket was previously explicitly disconnected.
|
|
251
258
|
if (!this.socket.connected) {
|
|
252
259
|
this.socket.connect();
|
|
253
260
|
}
|
|
@@ -453,6 +460,9 @@ class TableStore extends BaseStore {
|
|
|
453
460
|
// Store pending customer join requests
|
|
454
461
|
pendingJoinRequestsSubject = new BehaviorSubject([]);
|
|
455
462
|
pendingJoinRequests$ = this.pendingJoinRequestsSubject.asObservable();
|
|
463
|
+
// Emits when the current customer has been approved to join the table
|
|
464
|
+
approvedSubject = new Subject();
|
|
465
|
+
approved$ = this.approvedSubject.asObservable();
|
|
456
466
|
constructor(socketService) {
|
|
457
467
|
super(socketService);
|
|
458
468
|
this.socketService = socketService;
|
|
@@ -462,9 +472,7 @@ class TableStore extends BaseStore {
|
|
|
462
472
|
this.subscribeToEvent(SocketSuccessEventKeys.TABLE_RELEASED, (tableId) => this.removeItem(tableId));
|
|
463
473
|
this.subscribeToEvent(SocketSuccessEventKeys.HOST_JOIN_REQUEST_APPROVED_SUCCESS, (status) => {
|
|
464
474
|
if (status) {
|
|
465
|
-
|
|
466
|
-
window.location.reload();
|
|
467
|
-
// this.removeItem(tableId)
|
|
475
|
+
this.approvedSubject.next();
|
|
468
476
|
}
|
|
469
477
|
});
|
|
470
478
|
// Listen for customer join requests
|
|
@@ -784,42 +792,47 @@ function provideRealtimeStoreEnvironment(environment) {
|
|
|
784
792
|
|
|
785
793
|
/**
|
|
786
794
|
* Handles the socket connection lifecycle for the driver app.
|
|
787
|
-
*
|
|
795
|
+
*
|
|
796
|
+
* Pattern (mirrors customer-web's SocketConnectionService):
|
|
797
|
+
* - Use setAuthToken() + connect() instead of resetWithNewToken() so an in-progress
|
|
798
|
+
* connection is never torn down by a duplicate call (e.g. on page refresh).
|
|
799
|
+
* - reconnect$ is NOT used to recreate the socket — Socket.IO reconnects automatically
|
|
800
|
+
* using the auth token stored in socket.auth.
|
|
801
|
+
* - A 'online' event listener handles recovery when the network comes back.
|
|
788
802
|
*
|
|
789
803
|
* Usage:
|
|
790
|
-
* -
|
|
791
|
-
* -
|
|
804
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
805
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
792
806
|
*/
|
|
793
807
|
class DriverSocketConnectionService {
|
|
794
808
|
socketService;
|
|
795
809
|
TOKEN_KEY = 'driver_token';
|
|
796
|
-
|
|
810
|
+
networkListener;
|
|
797
811
|
constructor(socketService) {
|
|
798
812
|
this.socketService = socketService;
|
|
813
|
+
this.networkListener = () => this.connectFromStorage();
|
|
814
|
+
window.addEventListener('online', this.networkListener);
|
|
799
815
|
}
|
|
800
816
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
801
817
|
connect(token) {
|
|
802
818
|
localStorage.setItem(this.TOKEN_KEY, token);
|
|
803
|
-
this.socketService.
|
|
804
|
-
this.
|
|
819
|
+
this.socketService.setAuthToken(token);
|
|
820
|
+
this.socketService.connect();
|
|
805
821
|
}
|
|
806
822
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
807
823
|
connectFromStorage() {
|
|
808
824
|
const token = localStorage.getItem(this.TOKEN_KEY);
|
|
809
825
|
if (token) {
|
|
810
|
-
this.socketService.
|
|
811
|
-
this.
|
|
826
|
+
this.socketService.setAuthToken(token);
|
|
827
|
+
this.socketService.connect();
|
|
812
828
|
}
|
|
813
829
|
}
|
|
814
830
|
disconnect() {
|
|
815
|
-
this.reconnectSubscription?.unsubscribe();
|
|
816
831
|
this.socketService.disconnect();
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
this.socketService.resetWithNewToken(token);
|
|
822
|
-
});
|
|
832
|
+
if (this.networkListener) {
|
|
833
|
+
window.removeEventListener('online', this.networkListener);
|
|
834
|
+
this.networkListener = undefined;
|
|
835
|
+
}
|
|
823
836
|
}
|
|
824
837
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DriverSocketConnectionService, deps: [{ token: SocketService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
825
838
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DriverSocketConnectionService, providedIn: 'root' });
|
|
@@ -833,41 +846,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
833
846
|
|
|
834
847
|
/**
|
|
835
848
|
* Handles the socket connection lifecycle for the customer-food (online customer) app.
|
|
836
|
-
*
|
|
849
|
+
*
|
|
850
|
+
* Pattern (mirrors customer-web's SocketConnectionService):
|
|
851
|
+
* - Use setAuthToken() + connect() instead of resetWithNewToken() so an in-progress
|
|
852
|
+
* connection is never torn down by a duplicate call (e.g. on page refresh).
|
|
853
|
+
* - reconnect$ is NOT used to recreate the socket — Socket.IO reconnects automatically
|
|
854
|
+
* using the auth token stored in socket.auth.
|
|
855
|
+
* - A 'online' event listener handles recovery when the network comes back.
|
|
837
856
|
*
|
|
838
857
|
* Usage:
|
|
839
|
-
* -
|
|
840
|
-
* -
|
|
858
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
859
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
841
860
|
*/
|
|
842
861
|
class OnlineCustomerSocketConnectionService {
|
|
843
862
|
socketService;
|
|
844
863
|
TOKEN_KEY = 'online_customer_token';
|
|
845
|
-
|
|
864
|
+
networkListener;
|
|
846
865
|
constructor(socketService) {
|
|
847
866
|
this.socketService = socketService;
|
|
867
|
+
this.networkListener = () => this.connectFromStorage();
|
|
868
|
+
window.addEventListener('online', this.networkListener);
|
|
848
869
|
}
|
|
849
870
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
850
871
|
connect(token) {
|
|
851
|
-
this.socketService.
|
|
852
|
-
this.
|
|
872
|
+
this.socketService.setAuthToken(token);
|
|
873
|
+
this.socketService.connect();
|
|
853
874
|
}
|
|
854
875
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
855
876
|
connectFromStorage() {
|
|
856
877
|
const token = localStorage.getItem(this.TOKEN_KEY);
|
|
857
878
|
if (token) {
|
|
858
|
-
this.
|
|
859
|
-
this.subscribeToReconnect(token);
|
|
879
|
+
this.connect(token);
|
|
860
880
|
}
|
|
861
881
|
}
|
|
862
882
|
disconnect() {
|
|
863
|
-
this.reconnectSubscription?.unsubscribe();
|
|
864
883
|
this.socketService.disconnect();
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
this.socketService.resetWithNewToken(token);
|
|
870
|
-
});
|
|
884
|
+
if (this.networkListener) {
|
|
885
|
+
window.removeEventListener('online', this.networkListener);
|
|
886
|
+
this.networkListener = undefined;
|
|
887
|
+
}
|
|
871
888
|
}
|
|
872
889
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: OnlineCustomerSocketConnectionService, deps: [{ token: SocketService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
873
890
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: OnlineCustomerSocketConnectionService, providedIn: 'root' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-socket.mjs","sources":["../../../projects/serve-socket/src/lib/realtime-store.module.ts","../../../projects/serve-socket/src/lib/environment/realtime-store-environment.interface.ts","../../../projects/serve-socket/src/lib/environment/realtime-store-environment.token.ts","../../../projects/serve-socket/src/lib/socket.service.ts","../../../projects/serve-socket/src/lib/base-store.ts","../../../projects/serve-socket/src/lib/stores/table.store.ts","../../../projects/serve-socket/src/lib/stores/cart.store.ts","../../../projects/serve-socket/src/lib/stores/call-waiter.store.ts","../../../projects/serve-socket/src/lib/stores/notification.store.ts","../../../projects/serve-socket/src/lib/stores/delivery-order.store.ts","../../../projects/serve-socket/src/lib/stores/reservation.store.ts","../../../projects/serve-socket/src/lib/stores/inventory.store.ts","../../../projects/serve-socket/src/lib/providers.ts","../../../projects/serve-socket/src/lib/providers/realtime-store-environment.provider.ts","../../../projects/serve-socket/src/lib/driver-socket-connection.service.ts","../../../projects/serve-socket/src/lib/online-customer-socket-connection.service.ts","../../../projects/serve-socket/src/public-api.ts","../../../projects/serve-socket/src/serve-socket.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\n\n/**\n * @deprecated Use provideRealtimeStore() with standalone components instead\n */\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n HttpClientModule // Kept for backward compatibility with Angular <14\n ],\n exports: []\n})\nexport class RealtimeStoreModule { }\n","import { SocketSuccessEventKeys } from '../socket.service';\n\nexport interface RealtimeStoreEnvironment {\n apiUrl: string;\n}\n\nexport const defaultRealtimeStoreEnvironment: RealtimeStoreEnvironment = {\n apiUrl: `http://${window.location.hostname}:3030`,\n};","import { InjectionToken } from '@angular/core';\nimport { RealtimeStoreEnvironment } from './realtime-store-environment.interface';\n\nexport const REALTIME_STORE_ENVIRONMENT = new InjectionToken<RealtimeStoreEnvironment>('REALTIME_STORE_ENVIRONMENT');","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { io, Socket } from 'socket.io-client';\nimport { REALTIME_STORE_ENVIRONMENT, RealtimeStoreEnvironment, defaultRealtimeStoreEnvironment } from './environment';\n\nexport enum SocketSuccessEventKeys {\n CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS = 'CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS',\n CUSTOMER_REMOVE_FROM_CART_SUCCESS = 'CUSTOMER_REMOVE_FROM_CART_SUCCESS',\n TABLE_JOIN_REQUEST_SENT_SUCCESS = 'TABLE_JOIN_REQUEST_SENT_SUCCESS',\n TABLE_CREATED_OR_UPDATED = 'TABLE_CREATED_OR_UPDATED',\n TABLE_RELEASED = 'TABLE_RELEASED',\n HOST_JOIN_REQUEST_APPROVED_SUCCESS = 'HOST_JOIN_REQUEST_APPROVED_SUCCESS',\n HOST_JOIN_REQUEST_DECLINED = 'HOST_JOIN_REQUEST_DECLINED',\n WAITER_CALL_CREATED_SUCCESS = 'WAITER_CALL_CREATED_SUCCESS',\n WAITER_CALL_ACKNOWLEDGED_SUCCESS = 'WAITER_CALL_ACKNOWLEDGED_SUCCESS',\n ERROR_MESSAGE_SUCCESS = 'ERROR_MESSAGE_SUCCESS',\n SUCCESS_MESSAGE_SUCCESS = 'SUCCESS_MESSAGE_SUCCESS',\n WARNING_MESSAGE_SUCCESS = 'WARNING_MESSAGE_SUCCESS',\n // Delivery\n NEW_DELIVERY_ORDER = 'NEW_DELIVERY_ORDER',\n ORDER_STATUS_UPDATED = 'ORDER_STATUS_UPDATED',\n DRIVER_LOCATION_UPDATED = 'DRIVER_LOCATION_UPDATED',\n // Reservations\n RESERVATION_CREATE_OR_UPDATE_SUCCESS = 'RESERVATION_CREATE_OR_UPDATE_SUCCESS',\n RESERVATION_REMOVE_SUCCESS = 'RESERVATION_REMOVE_SUCCESS',\n // Inventory\n INVENTORY_STOCK_UPDATED = 'INVENTORY_STOCK_UPDATED',\n INVENTORY_LOW_STOCK_ALERT = 'INVENTORY_LOW_STOCK_ALERT',\n INVENTORY_PURCHASE_ORDER_UPDATED = 'INVENTORY_PURCHASE_ORDER_UPDATED',\n // Billing\n BILLING_SUBSCRIPTION_UPDATED = 'BILLING_SUBSCRIPTION_UPDATED',\n BILLING_INVOICE_ISSUED = 'BILLING_INVOICE_ISSUED',\n BILLING_PAYMENT_RECEIVED = 'BILLING_PAYMENT_RECEIVED',\n BILLING_TRIAL_EXPIRING = 'BILLING_TRIAL_EXPIRING',\n BILLING_INVOICE_OVERDUE = 'BILLING_INVOICE_OVERDUE',\n BILLING_SUBSCRIPTION_SUSPENDED = 'BILLING_SUBSCRIPTION_SUSPENDED',\n BILLING_CREDIT_NOTE_ISSUED = 'BILLING_CREDIT_NOTE_ISSUED',\n BILLING_REFUND_PROCESSED = 'BILLING_REFUND_PROCESSED',\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SocketService {\n private socket!: Socket;\n private readonly url: string;\n private authToken?: string;\n private connectionKey?: string;\n private readonly eventSubjects = new Map<string, Subject<any>>();\n\n private readonly connectionStatusSubject = new BehaviorSubject<boolean>(false);\n public connectionStatus$ = this.connectionStatusSubject.asObservable();\n\n private readonly reconnectSubject = new Subject<void>();\n public reconnect$ = this.reconnectSubject.asObservable();\n\n private hasConnectedOnce = false;\n\n private readonly healthySubject = new BehaviorSubject<boolean>(false);\n public healthy$ = this.healthySubject.asObservable();\n\n private healthCheckInterval?: ReturnType<typeof setInterval>;\n private lastPongTime = 0;\n\n constructor(\n @Inject(REALTIME_STORE_ENVIRONMENT) private readonly environment: RealtimeStoreEnvironment = defaultRealtimeStoreEnvironment\n ) {\n this.url = this.environment.apiUrl;\n }\n\n private setupSocketConnection(): void {\n // Cleanup existing socket to prevent memory leaks\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket.disconnect();\n }\n\n const socketOptions: any = {\n transports: ['websocket'],\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 10000\n };\n\n // Add auth if token is available\n if (this.authToken) {\n socketOptions.auth = {\n token: this.authToken\n };\n }\n\n this.socket = io(this.url, socketOptions);\n\n this.socket.on('connect', () => {\n console.log('Socket connected');\n this.connectionStatusSubject.next(true);\n this.reestablishListeners();\n });\n\n this.socket.on('disconnect', () => {\n console.log('Socket disconnected');\n this.connectionStatusSubject.next(false);\n });\n\n // In Socket.IO v4 the 'reconnect' event is on the Manager (socket.io), not the socket.\n // hasConnectedOnce is an instance variable so it persists across resetWithNewToken() calls.\n // Any connect after the very first one (regardless of socket recreation) triggers stores to reload.\n this.socket.on('connect', () => {\n if (this.hasConnectedOnce) {\n console.log('Socket reconnected');\n this.reconnectSubject.next();\n }\n this.hasConnectedOnce = true;\n });\n\n // Keep the manager-level listener as a fallback for older versions\n this.socket.io.on('reconnect', () => {\n console.log('Socket manager reconnected');\n this.connectionStatusSubject.next(true);\n this.reconnectSubject.next();\n this.reestablishListeners();\n });\n\n this.socket.on('connect_error', (err) => {\n console.error('Connection error:', err.message);\n });\n\n this.socket.on('reconnect_error', (err) => {\n console.error('Reconnection error:', err.message);\n });\n\n // Socket.IO built-in ping/pong for health monitoring\n this.socket.io.on('ping', () => {\n this.lastPongTime = Date.now();\n this.healthySubject.next(true);\n });\n\n // Start health check monitoring\n this.startHealthCheck();\n }\n\n /**\n * Monitor connection health via ping/pong timing\n */\n private startHealthCheck(): void {\n this.stopHealthCheck();\n\n this.lastPongTime = Date.now();\n\n // Check health every 30 seconds\n this.healthCheckInterval = setInterval(() => {\n if (!this.socket?.connected) {\n this.healthySubject.next(false);\n return;\n }\n\n const timeSinceLastPong = Date.now() - this.lastPongTime;\n // If no pong in last 60 seconds, connection may be stale\n if (timeSinceLastPong > 60000) {\n console.warn('[Socket] Connection appears stale, forcing reconnect');\n this.healthySubject.next(false);\n this.socket.disconnect();\n this.socket.connect();\n } else {\n this.healthySubject.next(true);\n }\n }, 30000);\n }\n\n private stopHealthCheck(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = undefined;\n }\n }\n\n private reestablishListeners(): void {\n console.log('Re-establishing listeners for', this.eventSubjects.size, 'events');\n this.eventSubjects.forEach((subject, eventName) => {\n // Remove any existing listener to avoid duplicates\n this.socket.off(eventName);\n // Add the listener\n console.log('registering', eventName);\n\n this.socket.on(eventName, (data) => {\n console.log(`[Socket] Event received: ${eventName}`, data);\n subject.next(data);\n });\n });\n }\n\n /**\n * Set authentication token for socket connection\n */\n public setAuthToken(token: string): void {\n this.authToken = token;\n }\n\n /**\n * Set connection key for socket connection\n */\n public setConnectionKey(key: string): void {\n this.connectionKey = key;\n }\n\n /**\n * Reset connection with new token\n */\n public resetWithNewToken(token?: string): void {\n if (token) {\n this.authToken = token;\n }\n\n if (this.socket) {\n this.socket.disconnect();\n }\n\n this.setupSocketConnection();\n }\n\n public connect(timeoutMs = 15000): Promise<void> {\n // Reuse existing connected socket\n if (this.socket?.connected) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n // Don't reject — the socket keeps reconnecting via reconnectionAttempts: Infinity.\n // Callers should rely on reconnect$ to re-authenticate once connected.\n console.warn('[Socket] Connection timeout — socket will keep retrying in background');\n resolve();\n }, timeoutMs);\n\n this.setupSocketConnection();\n\n if (this.socket.connected) {\n clearTimeout(timeout);\n resolve();\n return;\n }\n\n // Wait for the connect event\n this.socket.once('connect', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.socket.on('connect_error', (err) => {\n // Log but don't reject — reconnection logic will keep retrying\n console.warn('[Socket] connect_error:', err.message);\n });\n\n if (!this.socket.connected) {\n this.socket.connect();\n }\n });\n }\n\n public disconnect(): void {\n this.stopHealthCheck();\n if (this.socket?.connected) {\n this.socket.disconnect();\n }\n this.healthySubject.next(false);\n }\n\n /**\n * Emit event with optional authentication headers\n */\n public emit(event: string, data?: any): void {\n if (!this.socket || this.socket.disconnected) {\n console.warn('Socket not connected. Call connect() first.');\n return;\n }\n\n // If auth token or connection key exists, wrap data with headers\n if (this.authToken || this.connectionKey) {\n const payload = {\n payload: data || {},\n headers: {\n ...(this.authToken && { _authToken: this.authToken }),\n ...(this.connectionKey && { connectionKey: this.connectionKey })\n }\n };\n this.socket.emit(event, payload);\n } else {\n this.socket.emit(event, data);\n }\n }\n\n /**\n * Listen to events with persistent subjects that survive reconnections\n */\n public on<T>(event: string): Observable<T> {\n if (!this.eventSubjects.has(event)) {\n const subject = new Subject<T>();\n this.eventSubjects.set(event, subject);\n\n // Set up listener if socket exists and is connected\n if (this.socket?.connected) {\n console.log(`[Socket] Registering listener for event: ${event}`);\n this.socket.on(event, (data: T) => {\n console.log(`[Socket] Event received: ${event}`, data);\n subject.next(data);\n });\n } else {\n console.log(`[Socket] Event ${event} registered but socket not connected yet - will attach on connection`);\n }\n }\n\n return this.eventSubjects.get(event)!.asObservable();\n }\n\n /**\n * Listen to event once and return as Promise\n * @param event - Event name to listen for\n * @param timeoutMs - Timeout in ms (default 30s, 0 = no timeout)\n */\n public once<T>(event: string, timeoutMs = 30000): Promise<T> {\n if (!this.socket || this.socket.disconnected) {\n return Promise.reject(new Error('Socket not connected. Call connect() first.'));\n }\n\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const handler = (data: T) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve(data);\n };\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n this.socket.off(event, handler);\n reject(new Error(`Timeout waiting for event: ${event}`));\n }, timeoutMs);\n }\n\n this.socket.once(event, handler);\n });\n }\n}\n\n","import { BehaviorSubject, filter, map, Observable, Subject, Subscription, switchMap } from 'rxjs';\nimport { debounceTime, first, pairwise, takeUntil } from 'rxjs/operators';\nimport { SocketService } from './socket.service';\n\nexport interface Entity {\n id?: string;\n}\n\nexport abstract class BaseStore<T extends Entity> {\n protected dataSubject = new BehaviorSubject<T[]>([]);\n public data$: Observable<T[]> = this.dataSubject.asObservable();\n\n protected loadingSubject = new BehaviorSubject<boolean>(false);\n public loading$: Observable<boolean> = this.loadingSubject.asObservable();\n\n protected errorSubject = new BehaviorSubject<string | null>(null);\n public error$: Observable<string | null> = this.errorSubject.asObservable();\n\n private readonly destroy$ = new Subject<void>();\n private refreshInProgress = false;\n\n constructor(\n protected socketService: SocketService\n ) {\n // Defer initialization to allow child class constructor parameters to be assigned\n queueMicrotask(() => {\n this.initialize().then(() => { });\n });\n }\n\n private async initialize(): Promise<void> {\n this.setupSocketSubscriptions();\n this.refresh();\n\n // Reload data after a disconnect → reconnect cycle.\n // Listening to connectionStatus$ is more reliable than reconnect$ because\n // connectionStatus$ is driven directly by socket connect/disconnect events.\n this.socketService.connectionStatus$.pipe(\n pairwise(),\n filter(([prev, curr]) => prev === true && curr === false), // detect disconnect\n switchMap(() =>\n this.socketService.connectionStatus$.pipe(\n filter(connected => connected), // wait for next reconnect\n first()\n )\n ),\n debounceTime(1000), // give server time to be fully ready\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.refresh();\n });\n }\n\n public refresh() {\n // Prevent concurrent refresh calls\n if (this.refreshInProgress) {\n return;\n }\n this.refreshInProgress = true;\n this.setLoading(true);\n\n this.preload()\n .then(x => this.dataSubject.next(x))\n .catch(err => {\n console.error(`[${this.constructor.name}] Preload failed:`, err);\n this.setError(err.message || 'Failed to load data');\n })\n .finally(() => {\n this.refreshInProgress = false;\n this.setLoading(false);\n });\n }\n\n /**\n * Clean up subscriptions when store is destroyed\n */\n public destroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Abstract methods to be implemented by specific stores\n public abstract preload(): Promise<T[]>;\n\n protected abstract setupSocketSubscriptions(): void;\n\n // Helper methods for stores\n protected updateItems(items: T[]): void {\n console.log('setting', items);\n\n this.dataSubject.next(items);\n }\n\n protected updateItem(updatedItem: Partial<T> & Pick<T, 'id'>): void {\n console.log('upserting', updatedItem);\n\n const currentItems = this.dataSubject.value;\n const idField = 'id' as keyof T;\n\n const index = currentItems.findIndex(\n item => item[idField] === updatedItem[idField]\n );\n\n let updatedItems: T[];\n\n if (index > -1) {\n // 🔁 Update existing item\n updatedItems = currentItems.map((item, i) =>\n i === index ? { ...item, ...updatedItem } as T : item\n );\n } else {\n // ➕ Add new item\n updatedItems = [...currentItems, updatedItem as T];\n }\n\n this.dataSubject.next(updatedItems);\n }\n\n\n protected removeItem(id: string): void {\n console.log('removing', id);\n\n const currentItems = this.dataSubject.value;\n const idField = 'id' as keyof T;\n const filteredItems = currentItems.filter(item => item[idField] !== id);\n this.dataSubject.next(filteredItems);\n }\n\n protected setLoading(isLoading: boolean): void {\n this.loadingSubject.next(isLoading);\n }\n\n protected setError(error: string | null): void {\n this.errorSubject.next(error);\n }\n\n // Helper to subscribe to socket events with typesafety\n protected subscribeToEvent<R>(\n event: string,\n handler: (data: R) => void\n ): void {\n this.socketService.on<R>(event).subscribe(handler);\n }\n\n getAll(): T[] {\n return this.dataSubject.value;\n }\n\n getById(id: string): T | undefined {\n const field = 'id' as keyof T;\n return this.dataSubject.value.find(item => item[field] === id);\n }\n\n getById$(id: string): Observable<T | undefined> {\n const field = 'id' as keyof T;\n return this.data$.pipe(\n map(items => items.find(item => item[field] === id))\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\nexport interface PendingJoinRequest {\n id: string;\n name: string;\n tableId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class TableStore<T extends Entity> extends BaseStore<T> {\n // Store pending customer join requests\n private pendingJoinRequestsSubject = new BehaviorSubject<PendingJoinRequest[]>([]);\n public pendingJoinRequests$ = this.pendingJoinRequestsSubject.asObservable();\n\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.TABLE_CREATED_OR_UPDATED,\n (table) => this.updateItem(table)\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.TABLE_RELEASED,\n (tableId) => this.removeItem(tableId)\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.HOST_JOIN_REQUEST_APPROVED_SUCCESS,\n (status) => {\n if (status) {\n // Todo: improve this logic\n window.location.reload();\n // this.removeItem(tableId)\n }\n\n }\n );\n\n // Listen for customer join requests\n this.subscribeToEvent<PendingJoinRequest>(\n SocketSuccessEventKeys.TABLE_JOIN_REQUEST_SENT_SUCCESS,\n (request) => {\n console.log('[TableStore] Customer join request received:', request);\n const current = this.pendingJoinRequestsSubject.value;\n // Avoid duplicates\n if (!current.find(r => r.id === request.id)) {\n this.pendingJoinRequestsSubject.next([...current, request]);\n }\n }\n );\n }\n\n // Remove a pending join request (e.g., after approval/decline)\n public removePendingJoinRequest(customerId: string): void {\n const current = this.pendingJoinRequestsSubject.value;\n this.pendingJoinRequestsSubject.next(current.filter(r => r.id !== customerId));\n }\n\n // Clear all pending join requests\n public clearPendingJoinRequests(): void {\n this.pendingJoinRequestsSubject.next([]);\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { Injectable } from '@angular/core';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class CartStore<T extends Entity> extends BaseStore<T> {\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n console.log('[CartStore] Setting up socket subscriptions');\n console.log('[CartStore] CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS event:', SocketSuccessEventKeys.CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS);\n\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS,\n (cart) => {\n console.log('[CartStore] CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS handler called with:', cart);\n this.updateItem(cart);\n console.log(this.dataSubject.getValue());\n\n }\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.CUSTOMER_REMOVE_FROM_CART_SUCCESS,\n (cartId) => {\n console.log('[CartStore] CUSTOMER_REMOVE_FROM_CART_SUCCESS handler called with:', cartId);\n this.removeItem(cartId);\n console.log(this.dataSubject.getValue());\n }\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class CallWaiterStore<T extends Entity> extends BaseStore<T> {\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n console.log('[CallWaiterStore] Setting up socket subscriptions');\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.WAITER_CALL_CREATED_SUCCESS,\n (request) => this.updateItem(request)\n );\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\nimport { ToastrService } from 'ngx-toastr';\n\nexport interface CartEventData {\n id: string;\n tableId: string;\n menuItemId?: string;\n customerCarts?: Array<{\n id: string;\n status?: string;\n customer?: {\n name?: string;\n };\n }>;\n}\n\nexport interface ReadyOrderAlert {\n id: string;\n cartId: string;\n tableId: string;\n customerName: string;\n timestamp: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationStore {\n private readonly defaultOptions = {\n closeButton: true,\n progressBar: true\n };\n\n // Ready order alerts with dismiss functionality\n private readyOrderAlertsSubject = new BehaviorSubject<ReadyOrderAlert[]>([]);\n public readyOrderAlerts$ = this.readyOrderAlertsSubject.asObservable();\n\n constructor(\n protected socketService: SocketService,\n private readonly toastr: ToastrService\n ) {\n this.setupSocketSubscriptions();\n\n this.socketService.reconnect$.subscribe(() => {\n this.setupSocketSubscriptions();\n });\n }\n\n private setupSocketSubscriptions(): void {\n // Error messages\n this.socketService.on<{ message: string }>(SocketSuccessEventKeys.ERROR_MESSAGE_SUCCESS)\n .subscribe((data) => this.showError(data.message));\n\n // Success messages\n this.socketService.on<{ message: string }>(SocketSuccessEventKeys.SUCCESS_MESSAGE_SUCCESS)\n .subscribe((data) => this.showSuccess(data.message));\n\n // Warning messages\n this.socketService.on<{ message: string }>(SocketSuccessEventKeys.WARNING_MESSAGE_SUCCESS)\n .subscribe((data) => this.showWarning(data.message));\n\n // Cart update notifications - check for PREPARED status\n this.socketService.on<CartEventData>(SocketSuccessEventKeys.CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS)\n .subscribe((cart) => {\n console.log('[NotificationStore] Cart updated:', cart);\n\n // Check if any customer cart has PREPARED status\n const preparedCarts = cart.customerCarts?.filter(cc => cc.status === 'PREPARED') || [];\n\n if (preparedCarts.length > 0) {\n // This is a ready order - show special notification with vibration\n const customerName = preparedCarts[0]?.customer?.name || 'Customer';\n this.handleReadyOrder(cart, customerName);\n }\n // No toast for regular cart updates\n });\n\n // Cart removal notifications - just log, no toast\n this.socketService.on<string>(SocketSuccessEventKeys.CUSTOMER_REMOVE_FROM_CART_SUCCESS)\n .subscribe((cartId) => {\n console.log('[NotificationStore] Cart removed:', cartId);\n });\n }\n\n /**\n * Handle ready order notification with vibration and dismissable alert\n */\n private handleReadyOrder(cart: CartEventData, customerName: string): void {\n console.log('[NotificationStore] Ready order detected!', cart);\n\n // Vibrate device if supported\n this.vibrateDevice();\n\n // Add to ready order alerts\n const alert: ReadyOrderAlert = {\n id: `${cart.id}-${Date.now()}`,\n cartId: cart.id,\n tableId: cart.tableId,\n customerName,\n timestamp: new Date()\n };\n\n const currentAlerts = this.readyOrderAlertsSubject.value;\n this.readyOrderAlertsSubject.next([alert, ...currentAlerts]);\n\n // Also show toast with longer duration\n this.toastr.success(\n `Order ready for ${customerName}`,\n '🍽️ Order Ready!',\n {\n ...this.defaultOptions,\n timeOut: 0, // No auto-dismiss\n extendedTimeOut: 0,\n tapToDismiss: true\n }\n );\n }\n\n /**\n * Vibrate the device if supported\n */\n private vibrateDevice(): void {\n try {\n if ('vibrate' in navigator) {\n // Vibrate pattern: 200ms on, 100ms off, 200ms on\n navigator.vibrate([200, 100, 200, 100, 200]);\n }\n } catch (e) {\n console.warn('[NotificationStore] Vibration not supported', e);\n }\n }\n\n /**\n * Dismiss a ready order alert\n */\n public dismissReadyOrderAlert(alertId: string): void {\n const currentAlerts = this.readyOrderAlertsSubject.value;\n this.readyOrderAlertsSubject.next(currentAlerts.filter(a => a.id !== alertId));\n }\n\n /**\n * Dismiss all ready order alerts\n */\n public dismissAllReadyOrderAlerts(): void {\n this.readyOrderAlertsSubject.next([]);\n }\n\n // Manual notification methods\n public showError(message: string, title: string = 'Error', timeOut: number = 5000): void {\n this.toastr.error(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n public showSuccess(message: string, title: string = 'Success', timeOut: number = 3000): void {\n this.toastr.success(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n public showWarning(message: string, title: string = 'Warning', timeOut: number = 4000): void {\n this.toastr.warning(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n public showInfo(message: string, title: string = 'Info', timeOut: number = 3000): void {\n this.toastr.info(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n // Clear all toasts\n public clearAll(): void {\n this.toastr.clear();\n }\n\n // Remove a specific toast by id\n public remove(toastId: number): void {\n this.toastr.remove(toastId);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\nexport interface DeliveryLocation {\n driverId: string;\n lat: number;\n lng: number;\n orderId: string;\n timestamp?: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class DeliveryOrderStore<T extends Entity> extends BaseStore<T> {\n private driverLocationSubject = new BehaviorSubject<DeliveryLocation | null>(null);\n public driverLocation$ = this.driverLocationSubject.asObservable();\n\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.NEW_DELIVERY_ORDER,\n (order) => this.updateItem(order)\n );\n\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.ORDER_STATUS_UPDATED,\n (order) => this.updateItem(order)\n );\n\n this.subscribeToEvent<DeliveryLocation>(\n SocketSuccessEventKeys.DRIVER_LOCATION_UPDATED,\n (location) => this.driverLocationSubject.next(location)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class ReservationStore<T extends Entity> extends BaseStore<T> {\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.RESERVATION_CREATE_OR_UPDATE_SUCCESS,\n (reservation) => this.updateItem(reservation)\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.RESERVATION_REMOVE_SUCCESS,\n (reservationId) => this.removeItem(reservationId)\n );\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\nexport interface InventoryLowStockAlert {\n stockItemId: string;\n name: string;\n currentStock: number;\n threshold: number;\n branchId: string;\n}\n\nexport interface InventoryPurchaseOrderUpdate {\n purchaseOrderId: string;\n status: string;\n branchId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class InventoryStore<T extends Entity> extends BaseStore<T> {\n private readonly lowStockAlertSubject = new BehaviorSubject<InventoryLowStockAlert | null>(null);\n public lowStockAlert$ = this.lowStockAlertSubject.asObservable();\n\n private readonly purchaseOrderUpdateSubject = new BehaviorSubject<InventoryPurchaseOrderUpdate | null>(null);\n public purchaseOrderUpdate$ = this.purchaseOrderUpdateSubject.asObservable();\n\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.INVENTORY_STOCK_UPDATED,\n (item) => this.updateItem(item)\n );\n\n this.subscribeToEvent<InventoryLowStockAlert>(\n SocketSuccessEventKeys.INVENTORY_LOW_STOCK_ALERT,\n (alert) => this.lowStockAlertSubject.next(alert)\n );\n\n this.subscribeToEvent<InventoryPurchaseOrderUpdate>(\n SocketSuccessEventKeys.INVENTORY_PURCHASE_ORDER_UPDATED,\n (update) => this.purchaseOrderUpdateSubject.next(update)\n );\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { EnvironmentProviders, importProvidersFrom } from '@angular/core';\nimport { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\n\n/**\n * Provides all services needed for the realtime store to function.\n * Use this function in your standalone application's bootstrapApplication providers array.\n * \n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRealtimeStore()\n * ]\n * });\n * ```\n */\nexport function provideRealtimeStore(): EnvironmentProviders[] {\n return [\n provideHttpClient(withInterceptorsFromDi())\n ];\n}\n","import { Provider } from '@angular/core';\nimport { REALTIME_STORE_ENVIRONMENT, RealtimeStoreEnvironment } from '../environment';\n\nexport function provideRealtimeStoreEnvironment(environment: RealtimeStoreEnvironment): Provider {\n return {\n provide: REALTIME_STORE_ENVIRONMENT,\n useValue: environment\n };\n}","import { Injectable } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { SocketService } from './socket.service';\n\n/**\n * Handles the socket connection lifecycle for the driver app.\n * Reads the driver token from localStorage and connects/reconnects with it.\n *\n * Usage:\n * - `AppComponent.ngOnInit`: call `connectFromStorage()` to restore session on app start.\n * - `LoginPage` success handler: call `connect(token)` after receiving a new token.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class DriverSocketConnectionService {\n private readonly TOKEN_KEY = 'driver_token';\n private reconnectSubscription?: Subscription;\n\n constructor(private readonly socketService: SocketService) {}\n\n /** Connect using a freshly obtained token (e.g. after login). */\n connect(token: string): void {\n localStorage.setItem(this.TOKEN_KEY, token);\n this.socketService.resetWithNewToken(token);\n this.subscribeToReconnect(token);\n }\n\n /** Restore the socket connection from a persisted token (e.g. on app start). */\n connectFromStorage(): void {\n const token = localStorage.getItem(this.TOKEN_KEY);\n if (token) {\n this.socketService.resetWithNewToken(token);\n this.subscribeToReconnect(token);\n }\n }\n\n disconnect(): void {\n this.reconnectSubscription?.unsubscribe();\n this.socketService.disconnect();\n }\n\n private subscribeToReconnect(token: string): void {\n this.reconnectSubscription?.unsubscribe();\n this.reconnectSubscription = this.socketService.reconnect$.subscribe(() => {\n this.socketService.resetWithNewToken(token);\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { SocketService } from './socket.service';\n\n/**\n * Handles the socket connection lifecycle for the customer-food (online customer) app.\n * Reads the online customer token from localStorage and connects/reconnects with it.\n *\n * Usage:\n * - `AppComponent.ngOnInit`: call `connectFromStorage()` to restore session on app start.\n * - `LoginPage` success handler: call `connect(token)` after receiving a new token.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class OnlineCustomerSocketConnectionService {\n private readonly TOKEN_KEY = 'online_customer_token';\n private reconnectSubscription?: Subscription;\n\n constructor(private readonly socketService: SocketService) {}\n\n /** Connect using a freshly obtained token (e.g. after login). */\n connect(token: string): void {\n this.socketService.resetWithNewToken(token);\n this.subscribeToReconnect(token);\n }\n\n /** Restore the socket connection from a persisted token (e.g. on app start). */\n connectFromStorage(): void {\n const token = localStorage.getItem(this.TOKEN_KEY);\n if (token) {\n this.socketService.resetWithNewToken(token);\n this.subscribeToReconnect(token);\n }\n }\n\n disconnect(): void {\n this.reconnectSubscription?.unsubscribe();\n this.socketService.disconnect();\n }\n\n private subscribeToReconnect(token: string): void {\n this.reconnectSubscription?.unsubscribe();\n this.reconnectSubscription = this.socketService.reconnect$.subscribe(() => {\n this.socketService.resetWithNewToken(token);\n });\n }\n}\n","/*\n * Public API Surface of realtime-store\n */\n\nexport * from './lib/realtime-store.module';\nexport * from './lib/socket.service';\nexport * from './lib/base-store';\nexport * from './lib/stores/table.store';\nexport * from './lib/stores/cart.store';\nexport * from './lib/stores/call-waiter.store';\nexport * from './lib/stores/notification.store';\nexport * from './lib/stores/delivery-order.store';\nexport * from './lib/stores/reservation.store';\nexport * from './lib/stores/inventory.store';\nexport * from './lib/providers';\nexport * from './lib/environment';\nexport * from './lib/providers/realtime-store-environment.provider';\nexport * from './lib/driver-socket-connection.service';\nexport * from './lib/online-customer-socket-connection.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SocketService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serve-socket.mjs","sources":["../../../projects/serve-socket/src/lib/realtime-store.module.ts","../../../projects/serve-socket/src/lib/environment/realtime-store-environment.interface.ts","../../../projects/serve-socket/src/lib/environment/realtime-store-environment.token.ts","../../../projects/serve-socket/src/lib/socket.service.ts","../../../projects/serve-socket/src/lib/base-store.ts","../../../projects/serve-socket/src/lib/stores/table.store.ts","../../../projects/serve-socket/src/lib/stores/cart.store.ts","../../../projects/serve-socket/src/lib/stores/call-waiter.store.ts","../../../projects/serve-socket/src/lib/stores/notification.store.ts","../../../projects/serve-socket/src/lib/stores/delivery-order.store.ts","../../../projects/serve-socket/src/lib/stores/reservation.store.ts","../../../projects/serve-socket/src/lib/stores/inventory.store.ts","../../../projects/serve-socket/src/lib/providers.ts","../../../projects/serve-socket/src/lib/providers/realtime-store-environment.provider.ts","../../../projects/serve-socket/src/lib/driver-socket-connection.service.ts","../../../projects/serve-socket/src/lib/online-customer-socket-connection.service.ts","../../../projects/serve-socket/src/public-api.ts","../../../projects/serve-socket/src/serve-socket.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\n\n/**\n * @deprecated Use provideRealtimeStore() with standalone components instead\n */\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n HttpClientModule // Kept for backward compatibility with Angular <14\n ],\n exports: []\n})\nexport class RealtimeStoreModule { }\n","import { SocketSuccessEventKeys } from '../socket.service';\n\nexport interface RealtimeStoreEnvironment {\n apiUrl: string;\n}\n\nexport const defaultRealtimeStoreEnvironment: RealtimeStoreEnvironment = {\n apiUrl: `http://${window.location.hostname}:3030`,\n};","import { InjectionToken } from '@angular/core';\nimport { RealtimeStoreEnvironment } from './realtime-store-environment.interface';\n\nexport const REALTIME_STORE_ENVIRONMENT = new InjectionToken<RealtimeStoreEnvironment>('REALTIME_STORE_ENVIRONMENT');","import { Injectable, Inject } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { io, Socket } from 'socket.io-client';\nimport { REALTIME_STORE_ENVIRONMENT, RealtimeStoreEnvironment, defaultRealtimeStoreEnvironment } from './environment';\n\nexport enum SocketSuccessEventKeys {\n CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS = 'CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS',\n CUSTOMER_REMOVE_FROM_CART_SUCCESS = 'CUSTOMER_REMOVE_FROM_CART_SUCCESS',\n TABLE_JOIN_REQUEST_SENT_SUCCESS = 'TABLE_JOIN_REQUEST_SENT_SUCCESS',\n TABLE_CREATED_OR_UPDATED = 'TABLE_CREATED_OR_UPDATED',\n TABLE_RELEASED = 'TABLE_RELEASED',\n HOST_JOIN_REQUEST_APPROVED_SUCCESS = 'HOST_JOIN_REQUEST_APPROVED_SUCCESS',\n HOST_JOIN_REQUEST_DECLINED = 'HOST_JOIN_REQUEST_DECLINED',\n WAITER_CALL_CREATED_SUCCESS = 'WAITER_CALL_CREATED_SUCCESS',\n WAITER_CALL_ACKNOWLEDGED_SUCCESS = 'WAITER_CALL_ACKNOWLEDGED_SUCCESS',\n ERROR_MESSAGE_SUCCESS = 'ERROR_MESSAGE_SUCCESS',\n SUCCESS_MESSAGE_SUCCESS = 'SUCCESS_MESSAGE_SUCCESS',\n WARNING_MESSAGE_SUCCESS = 'WARNING_MESSAGE_SUCCESS',\n // Delivery\n NEW_DELIVERY_ORDER = 'NEW_DELIVERY_ORDER',\n ORDER_STATUS_UPDATED = 'ORDER_STATUS_UPDATED',\n DRIVER_LOCATION_UPDATED = 'DRIVER_LOCATION_UPDATED',\n // Reservations\n RESERVATION_CREATE_OR_UPDATE_SUCCESS = 'RESERVATION_CREATE_OR_UPDATE_SUCCESS',\n RESERVATION_REMOVE_SUCCESS = 'RESERVATION_REMOVE_SUCCESS',\n // Inventory\n INVENTORY_STOCK_UPDATED = 'INVENTORY_STOCK_UPDATED',\n INVENTORY_LOW_STOCK_ALERT = 'INVENTORY_LOW_STOCK_ALERT',\n INVENTORY_PURCHASE_ORDER_UPDATED = 'INVENTORY_PURCHASE_ORDER_UPDATED',\n // Billing\n BILLING_SUBSCRIPTION_UPDATED = 'BILLING_SUBSCRIPTION_UPDATED',\n BILLING_INVOICE_ISSUED = 'BILLING_INVOICE_ISSUED',\n BILLING_PAYMENT_RECEIVED = 'BILLING_PAYMENT_RECEIVED',\n BILLING_TRIAL_EXPIRING = 'BILLING_TRIAL_EXPIRING',\n BILLING_INVOICE_OVERDUE = 'BILLING_INVOICE_OVERDUE',\n BILLING_SUBSCRIPTION_SUSPENDED = 'BILLING_SUBSCRIPTION_SUSPENDED',\n BILLING_CREDIT_NOTE_ISSUED = 'BILLING_CREDIT_NOTE_ISSUED',\n BILLING_REFUND_PROCESSED = 'BILLING_REFUND_PROCESSED',\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SocketService {\n private socket!: Socket;\n private readonly url: string;\n private authToken?: string;\n private connectionKey?: string;\n private readonly eventSubjects = new Map<string, Subject<any>>();\n\n private readonly connectionStatusSubject = new BehaviorSubject<boolean>(false);\n public connectionStatus$ = this.connectionStatusSubject.asObservable();\n\n private readonly reconnectSubject = new Subject<void>();\n public reconnect$ = this.reconnectSubject.asObservable();\n\n private hasConnectedOnce = false;\n\n private readonly healthySubject = new BehaviorSubject<boolean>(false);\n public healthy$ = this.healthySubject.asObservable();\n\n private healthCheckInterval?: ReturnType<typeof setInterval>;\n private lastPongTime = 0;\n\n constructor(\n @Inject(REALTIME_STORE_ENVIRONMENT) private readonly environment: RealtimeStoreEnvironment = defaultRealtimeStoreEnvironment\n ) {\n this.url = this.environment.apiUrl;\n }\n\n private setupSocketConnection(): void {\n // Cleanup existing socket to prevent memory leaks\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket.disconnect();\n }\n\n const socketOptions: any = {\n transports: ['websocket'],\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 10000\n };\n\n // Add auth if token is available\n if (this.authToken) {\n socketOptions.auth = {\n token: this.authToken\n };\n }\n\n this.socket = io(this.url, socketOptions);\n\n // Single 'connect' handler: update status, reestablish listeners, and signal reconnect\n // if this is not the very first connection (hasConnectedOnce persists across resetWithNewToken calls).\n this.socket.on('connect', () => {\n console.log(this.hasConnectedOnce ? 'Socket reconnected' : 'Socket connected');\n this.connectionStatusSubject.next(true);\n this.reestablishListeners();\n if (this.hasConnectedOnce) {\n this.reconnectSubject.next();\n }\n this.hasConnectedOnce = true;\n });\n\n this.socket.on('disconnect', () => {\n console.log('Socket disconnected');\n this.connectionStatusSubject.next(false);\n });\n\n // NOTE: Do NOT add socket.io.on('reconnect', ...) here — that event is on the shared\n // Manager, not the socket, so it accumulates across resetWithNewToken() calls.\n // The socket-level 'connect' handler above already covers all reconnect scenarios.\n\n this.socket.on('connect_error', (err) => {\n console.error('Connection error:', err.message);\n });\n\n this.socket.on('reconnect_error', (err) => {\n console.error('Reconnection error:', err.message);\n });\n\n // Ping/pong for health monitoring. Remove before re-adding to prevent accumulation\n // across resetWithNewToken() calls (socket.io is the shared Manager).\n this.socket.io.off('ping');\n this.socket.io.on('ping', () => {\n this.lastPongTime = Date.now();\n this.healthySubject.next(true);\n });\n\n // Start health check monitoring\n this.startHealthCheck();\n }\n\n /**\n * Monitor connection health via ping/pong timing\n */\n private startHealthCheck(): void {\n this.stopHealthCheck();\n\n this.lastPongTime = Date.now();\n\n // Check health every 30 seconds\n this.healthCheckInterval = setInterval(() => {\n if (!this.socket?.connected) {\n this.healthySubject.next(false);\n return;\n }\n\n const timeSinceLastPong = Date.now() - this.lastPongTime;\n // If no pong in last 60 seconds, connection may be stale\n if (timeSinceLastPong > 60000) {\n console.warn('[Socket] Connection appears stale, forcing reconnect');\n this.healthySubject.next(false);\n this.socket.disconnect();\n this.socket.connect();\n } else {\n this.healthySubject.next(true);\n }\n }, 30000);\n }\n\n private stopHealthCheck(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = undefined;\n }\n }\n\n private reestablishListeners(): void {\n console.log('Re-establishing listeners for', this.eventSubjects.size, 'events');\n this.eventSubjects.forEach((subject, eventName) => {\n // Remove any existing listener to avoid duplicates\n this.socket.off(eventName);\n // Add the listener\n console.log('registering', eventName);\n\n this.socket.on(eventName, (data) => {\n console.log(`[Socket] Event received: ${eventName}`, data);\n subject.next(data);\n });\n });\n }\n\n /**\n * Set authentication token for socket connection.\n * Also updates socket.auth on the live socket so Socket.IO uses the new token\n * on its next reconnection attempt without needing to recreate the socket.\n */\n public setAuthToken(token: string): void {\n this.authToken = token;\n if (this.socket) {\n this.socket.auth = { token };\n }\n }\n\n /**\n * Set connection key for socket connection\n */\n public setConnectionKey(key: string): void {\n this.connectionKey = key;\n }\n\n /**\n * Reset connection with new token.\n * Idempotent: if the socket is already active (connecting or connected) with the same\n * token, this is a no-op. This prevents double-calls (e.g. from router navigation\n * events on page refresh) from tearing down a healthy connection.\n */\n public resetWithNewToken(token?: string): void {\n const tokenUnchanged = !token || token === this.authToken;\n const socketIsActive = this.socket && !this.socket.disconnected;\n if (tokenUnchanged && socketIsActive) {\n return;\n }\n\n if (token) {\n this.authToken = token;\n }\n\n this.setupSocketConnection();\n }\n\n public connect(timeoutMs = 15000): Promise<void> {\n // Already connected — nothing to do.\n if (this.socket?.connected) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n // Don't reject — the socket keeps reconnecting via reconnectionAttempts: Infinity.\n // Callers should rely on reconnect$ to re-authenticate once connected.\n console.warn('[Socket] Connection timeout — socket will keep retrying in background');\n resolve();\n }, timeoutMs);\n\n // Only create a new socket if one does not exist yet.\n // If a socket already exists but hasn't connected yet (e.g. this method was called\n // twice in rapid succession), reuse it — do NOT call setupSocketConnection() again\n // as that would destroy the in-progress attempt and cause a connect/disconnect loop.\n if (!this.socket) {\n this.setupSocketConnection();\n }\n\n if (this.socket.connected) {\n clearTimeout(timeout);\n resolve();\n return;\n }\n\n // Wait for the connect event on the existing or newly created socket.\n this.socket.once('connect', () => {\n clearTimeout(timeout);\n resolve();\n });\n\n // Reconnect if the socket was previously explicitly disconnected.\n if (!this.socket.connected) {\n this.socket.connect();\n }\n });\n }\n\n public disconnect(): void {\n this.stopHealthCheck();\n if (this.socket?.connected) {\n this.socket.disconnect();\n }\n this.healthySubject.next(false);\n }\n\n /**\n * Emit event with optional authentication headers\n */\n public emit(event: string, data?: any): void {\n if (!this.socket || this.socket.disconnected) {\n console.warn('Socket not connected. Call connect() first.');\n return;\n }\n\n // If auth token or connection key exists, wrap data with headers\n if (this.authToken || this.connectionKey) {\n const payload = {\n payload: data || {},\n headers: {\n ...(this.authToken && { _authToken: this.authToken }),\n ...(this.connectionKey && { connectionKey: this.connectionKey })\n }\n };\n this.socket.emit(event, payload);\n } else {\n this.socket.emit(event, data);\n }\n }\n\n /**\n * Listen to events with persistent subjects that survive reconnections\n */\n public on<T>(event: string): Observable<T> {\n if (!this.eventSubjects.has(event)) {\n const subject = new Subject<T>();\n this.eventSubjects.set(event, subject);\n\n // Set up listener if socket exists and is connected\n if (this.socket?.connected) {\n console.log(`[Socket] Registering listener for event: ${event}`);\n this.socket.on(event, (data: T) => {\n console.log(`[Socket] Event received: ${event}`, data);\n subject.next(data);\n });\n } else {\n console.log(`[Socket] Event ${event} registered but socket not connected yet - will attach on connection`);\n }\n }\n\n return this.eventSubjects.get(event)!.asObservable();\n }\n\n /**\n * Listen to event once and return as Promise\n * @param event - Event name to listen for\n * @param timeoutMs - Timeout in ms (default 30s, 0 = no timeout)\n */\n public once<T>(event: string, timeoutMs = 30000): Promise<T> {\n if (!this.socket || this.socket.disconnected) {\n return Promise.reject(new Error('Socket not connected. Call connect() first.'));\n }\n\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const handler = (data: T) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve(data);\n };\n\n if (timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n this.socket.off(event, handler);\n reject(new Error(`Timeout waiting for event: ${event}`));\n }, timeoutMs);\n }\n\n this.socket.once(event, handler);\n });\n }\n}\n\n","import { BehaviorSubject, filter, map, Observable, Subject, Subscription, switchMap } from 'rxjs';\nimport { debounceTime, first, pairwise, takeUntil } from 'rxjs/operators';\nimport { SocketService } from './socket.service';\n\nexport interface Entity {\n id?: string;\n}\n\nexport abstract class BaseStore<T extends Entity> {\n protected dataSubject = new BehaviorSubject<T[]>([]);\n public data$: Observable<T[]> = this.dataSubject.asObservable();\n\n protected loadingSubject = new BehaviorSubject<boolean>(false);\n public loading$: Observable<boolean> = this.loadingSubject.asObservable();\n\n protected errorSubject = new BehaviorSubject<string | null>(null);\n public error$: Observable<string | null> = this.errorSubject.asObservable();\n\n private readonly destroy$ = new Subject<void>();\n private refreshInProgress = false;\n\n constructor(\n protected socketService: SocketService\n ) {\n // Defer initialization to allow child class constructor parameters to be assigned\n queueMicrotask(() => {\n this.initialize().then(() => { });\n });\n }\n\n private async initialize(): Promise<void> {\n this.setupSocketSubscriptions();\n this.refresh();\n\n // Reload data after a disconnect → reconnect cycle.\n // Listening to connectionStatus$ is more reliable than reconnect$ because\n // connectionStatus$ is driven directly by socket connect/disconnect events.\n this.socketService.connectionStatus$.pipe(\n pairwise(),\n filter(([prev, curr]) => prev === true && curr === false), // detect disconnect\n switchMap(() =>\n this.socketService.connectionStatus$.pipe(\n filter(connected => connected), // wait for next reconnect\n first()\n )\n ),\n debounceTime(1000), // give server time to be fully ready\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.refresh();\n });\n }\n\n public refresh() {\n // Prevent concurrent refresh calls\n if (this.refreshInProgress) {\n return;\n }\n this.refreshInProgress = true;\n this.setLoading(true);\n\n this.preload()\n .then(x => this.dataSubject.next(x))\n .catch(err => {\n console.error(`[${this.constructor.name}] Preload failed:`, err);\n this.setError(err.message || 'Failed to load data');\n })\n .finally(() => {\n this.refreshInProgress = false;\n this.setLoading(false);\n });\n }\n\n /**\n * Clean up subscriptions when store is destroyed\n */\n public destroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Abstract methods to be implemented by specific stores\n public abstract preload(): Promise<T[]>;\n\n protected abstract setupSocketSubscriptions(): void;\n\n // Helper methods for stores\n protected updateItems(items: T[]): void {\n console.log('setting', items);\n\n this.dataSubject.next(items);\n }\n\n protected updateItem(updatedItem: Partial<T> & Pick<T, 'id'>): void {\n console.log('upserting', updatedItem);\n\n const currentItems = this.dataSubject.value;\n const idField = 'id' as keyof T;\n\n const index = currentItems.findIndex(\n item => item[idField] === updatedItem[idField]\n );\n\n let updatedItems: T[];\n\n if (index > -1) {\n // 🔁 Update existing item\n updatedItems = currentItems.map((item, i) =>\n i === index ? { ...item, ...updatedItem } as T : item\n );\n } else {\n // ➕ Add new item\n updatedItems = [...currentItems, updatedItem as T];\n }\n\n this.dataSubject.next(updatedItems);\n }\n\n\n protected removeItem(id: string): void {\n console.log('removing', id);\n\n const currentItems = this.dataSubject.value;\n const idField = 'id' as keyof T;\n const filteredItems = currentItems.filter(item => item[idField] !== id);\n this.dataSubject.next(filteredItems);\n }\n\n protected setLoading(isLoading: boolean): void {\n this.loadingSubject.next(isLoading);\n }\n\n protected setError(error: string | null): void {\n this.errorSubject.next(error);\n }\n\n // Helper to subscribe to socket events with typesafety\n protected subscribeToEvent<R>(\n event: string,\n handler: (data: R) => void\n ): void {\n this.socketService.on<R>(event).subscribe(handler);\n }\n\n getAll(): T[] {\n return this.dataSubject.value;\n }\n\n getById(id: string): T | undefined {\n const field = 'id' as keyof T;\n return this.dataSubject.value.find(item => item[field] === id);\n }\n\n getById$(id: string): Observable<T | undefined> {\n const field = 'id' as keyof T;\n return this.data$.pipe(\n map(items => items.find(item => item[field] === id))\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\nexport interface PendingJoinRequest {\n id: string;\n name: string;\n tableId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class TableStore<T extends Entity> extends BaseStore<T> {\n // Store pending customer join requests\n private pendingJoinRequestsSubject = new BehaviorSubject<PendingJoinRequest[]>([]);\n public pendingJoinRequests$ = this.pendingJoinRequestsSubject.asObservable();\n\n // Emits when the current customer has been approved to join the table\n private approvedSubject = new Subject<void>();\n public approved$ = this.approvedSubject.asObservable();\n\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.TABLE_CREATED_OR_UPDATED,\n (table) => this.updateItem(table)\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.TABLE_RELEASED,\n (tableId) => this.removeItem(tableId)\n );\n\n this.subscribeToEvent<boolean>(\n SocketSuccessEventKeys.HOST_JOIN_REQUEST_APPROVED_SUCCESS,\n (status) => {\n if (status) {\n this.approvedSubject.next();\n }\n }\n );\n\n // Listen for customer join requests\n this.subscribeToEvent<PendingJoinRequest>(\n SocketSuccessEventKeys.TABLE_JOIN_REQUEST_SENT_SUCCESS,\n (request) => {\n console.log('[TableStore] Customer join request received:', request);\n const current = this.pendingJoinRequestsSubject.value;\n // Avoid duplicates\n if (!current.find(r => r.id === request.id)) {\n this.pendingJoinRequestsSubject.next([...current, request]);\n }\n }\n );\n }\n\n // Remove a pending join request (e.g., after approval/decline)\n public removePendingJoinRequest(customerId: string): void {\n const current = this.pendingJoinRequestsSubject.value;\n this.pendingJoinRequestsSubject.next(current.filter(r => r.id !== customerId));\n }\n\n // Clear all pending join requests\n public clearPendingJoinRequests(): void {\n this.pendingJoinRequestsSubject.next([]);\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { Injectable } from '@angular/core';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class CartStore<T extends Entity> extends BaseStore<T> {\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n console.log('[CartStore] Setting up socket subscriptions');\n console.log('[CartStore] CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS event:', SocketSuccessEventKeys.CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS);\n\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS,\n (cart) => {\n console.log('[CartStore] CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS handler called with:', cart);\n this.updateItem(cart);\n console.log(this.dataSubject.getValue());\n\n }\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.CUSTOMER_REMOVE_FROM_CART_SUCCESS,\n (cartId) => {\n console.log('[CartStore] CUSTOMER_REMOVE_FROM_CART_SUCCESS handler called with:', cartId);\n this.removeItem(cartId);\n console.log(this.dataSubject.getValue());\n }\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class CallWaiterStore<T extends Entity> extends BaseStore<T> {\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n console.log('[CallWaiterStore] Setting up socket subscriptions');\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.WAITER_CALL_CREATED_SUCCESS,\n (request) => this.updateItem(request)\n );\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\nimport { ToastrService } from 'ngx-toastr';\n\nexport interface CartEventData {\n id: string;\n tableId: string;\n menuItemId?: string;\n customerCarts?: Array<{\n id: string;\n status?: string;\n customer?: {\n name?: string;\n };\n }>;\n}\n\nexport interface ReadyOrderAlert {\n id: string;\n cartId: string;\n tableId: string;\n customerName: string;\n timestamp: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationStore {\n private readonly defaultOptions = {\n closeButton: true,\n progressBar: true\n };\n\n // Ready order alerts with dismiss functionality\n private readyOrderAlertsSubject = new BehaviorSubject<ReadyOrderAlert[]>([]);\n public readyOrderAlerts$ = this.readyOrderAlertsSubject.asObservable();\n\n constructor(\n protected socketService: SocketService,\n private readonly toastr: ToastrService\n ) {\n this.setupSocketSubscriptions();\n\n this.socketService.reconnect$.subscribe(() => {\n this.setupSocketSubscriptions();\n });\n }\n\n private setupSocketSubscriptions(): void {\n // Error messages\n this.socketService.on<{ message: string }>(SocketSuccessEventKeys.ERROR_MESSAGE_SUCCESS)\n .subscribe((data) => this.showError(data.message));\n\n // Success messages\n this.socketService.on<{ message: string }>(SocketSuccessEventKeys.SUCCESS_MESSAGE_SUCCESS)\n .subscribe((data) => this.showSuccess(data.message));\n\n // Warning messages\n this.socketService.on<{ message: string }>(SocketSuccessEventKeys.WARNING_MESSAGE_SUCCESS)\n .subscribe((data) => this.showWarning(data.message));\n\n // Cart update notifications - check for PREPARED status\n this.socketService.on<CartEventData>(SocketSuccessEventKeys.CUSTOMER_CREATE_OR_UPDATE_CART_SUCCESS)\n .subscribe((cart) => {\n console.log('[NotificationStore] Cart updated:', cart);\n\n // Check if any customer cart has PREPARED status\n const preparedCarts = cart.customerCarts?.filter(cc => cc.status === 'PREPARED') || [];\n\n if (preparedCarts.length > 0) {\n // This is a ready order - show special notification with vibration\n const customerName = preparedCarts[0]?.customer?.name || 'Customer';\n this.handleReadyOrder(cart, customerName);\n }\n // No toast for regular cart updates\n });\n\n // Cart removal notifications - just log, no toast\n this.socketService.on<string>(SocketSuccessEventKeys.CUSTOMER_REMOVE_FROM_CART_SUCCESS)\n .subscribe((cartId) => {\n console.log('[NotificationStore] Cart removed:', cartId);\n });\n }\n\n /**\n * Handle ready order notification with vibration and dismissable alert\n */\n private handleReadyOrder(cart: CartEventData, customerName: string): void {\n console.log('[NotificationStore] Ready order detected!', cart);\n\n // Vibrate device if supported\n this.vibrateDevice();\n\n // Add to ready order alerts\n const alert: ReadyOrderAlert = {\n id: `${cart.id}-${Date.now()}`,\n cartId: cart.id,\n tableId: cart.tableId,\n customerName,\n timestamp: new Date()\n };\n\n const currentAlerts = this.readyOrderAlertsSubject.value;\n this.readyOrderAlertsSubject.next([alert, ...currentAlerts]);\n\n // Also show toast with longer duration\n this.toastr.success(\n `Order ready for ${customerName}`,\n '🍽️ Order Ready!',\n {\n ...this.defaultOptions,\n timeOut: 0, // No auto-dismiss\n extendedTimeOut: 0,\n tapToDismiss: true\n }\n );\n }\n\n /**\n * Vibrate the device if supported\n */\n private vibrateDevice(): void {\n try {\n if ('vibrate' in navigator) {\n // Vibrate pattern: 200ms on, 100ms off, 200ms on\n navigator.vibrate([200, 100, 200, 100, 200]);\n }\n } catch (e) {\n console.warn('[NotificationStore] Vibration not supported', e);\n }\n }\n\n /**\n * Dismiss a ready order alert\n */\n public dismissReadyOrderAlert(alertId: string): void {\n const currentAlerts = this.readyOrderAlertsSubject.value;\n this.readyOrderAlertsSubject.next(currentAlerts.filter(a => a.id !== alertId));\n }\n\n /**\n * Dismiss all ready order alerts\n */\n public dismissAllReadyOrderAlerts(): void {\n this.readyOrderAlertsSubject.next([]);\n }\n\n // Manual notification methods\n public showError(message: string, title: string = 'Error', timeOut: number = 5000): void {\n this.toastr.error(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n public showSuccess(message: string, title: string = 'Success', timeOut: number = 3000): void {\n this.toastr.success(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n public showWarning(message: string, title: string = 'Warning', timeOut: number = 4000): void {\n this.toastr.warning(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n public showInfo(message: string, title: string = 'Info', timeOut: number = 3000): void {\n this.toastr.info(message, title, {\n ...this.defaultOptions,\n timeOut\n });\n }\n\n // Clear all toasts\n public clearAll(): void {\n this.toastr.clear();\n }\n\n // Remove a specific toast by id\n public remove(toastId: number): void {\n this.toastr.remove(toastId);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\nexport interface DeliveryLocation {\n driverId: string;\n lat: number;\n lng: number;\n orderId: string;\n timestamp?: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class DeliveryOrderStore<T extends Entity> extends BaseStore<T> {\n private driverLocationSubject = new BehaviorSubject<DeliveryLocation | null>(null);\n public driverLocation$ = this.driverLocationSubject.asObservable();\n\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.NEW_DELIVERY_ORDER,\n (order) => this.updateItem(order)\n );\n\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.ORDER_STATUS_UPDATED,\n (order) => this.updateItem(order)\n );\n\n this.subscribeToEvent<DeliveryLocation>(\n SocketSuccessEventKeys.DRIVER_LOCATION_UPDATED,\n (location) => this.driverLocationSubject.next(location)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class ReservationStore<T extends Entity> extends BaseStore<T> {\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.RESERVATION_CREATE_OR_UPDATE_SUCCESS,\n (reservation) => this.updateItem(reservation)\n );\n\n this.subscribeToEvent<string>(\n SocketSuccessEventKeys.RESERVATION_REMOVE_SUCCESS,\n (reservationId) => this.removeItem(reservationId)\n );\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BaseStore, Entity } from '../base-store';\nimport { SocketService, SocketSuccessEventKeys } from '../socket.service';\n\nexport interface InventoryLowStockAlert {\n stockItemId: string;\n name: string;\n currentStock: number;\n threshold: number;\n branchId: string;\n}\n\nexport interface InventoryPurchaseOrderUpdate {\n purchaseOrderId: string;\n status: string;\n branchId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class InventoryStore<T extends Entity> extends BaseStore<T> {\n private readonly lowStockAlertSubject = new BehaviorSubject<InventoryLowStockAlert | null>(null);\n public lowStockAlert$ = this.lowStockAlertSubject.asObservable();\n\n private readonly purchaseOrderUpdateSubject = new BehaviorSubject<InventoryPurchaseOrderUpdate | null>(null);\n public purchaseOrderUpdate$ = this.purchaseOrderUpdateSubject.asObservable();\n\n constructor(\n protected override socketService: SocketService\n ) {\n super(socketService);\n }\n\n protected override setupSocketSubscriptions(): void {\n this.subscribeToEvent<T>(\n SocketSuccessEventKeys.INVENTORY_STOCK_UPDATED,\n (item) => this.updateItem(item)\n );\n\n this.subscribeToEvent<InventoryLowStockAlert>(\n SocketSuccessEventKeys.INVENTORY_LOW_STOCK_ALERT,\n (alert) => this.lowStockAlertSubject.next(alert)\n );\n\n this.subscribeToEvent<InventoryPurchaseOrderUpdate>(\n SocketSuccessEventKeys.INVENTORY_PURCHASE_ORDER_UPDATED,\n (update) => this.purchaseOrderUpdateSubject.next(update)\n );\n }\n\n public abstract override preload(): Promise<T[]>;\n}\n","import { EnvironmentProviders, importProvidersFrom } from '@angular/core';\nimport { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\n\n/**\n * Provides all services needed for the realtime store to function.\n * Use this function in your standalone application's bootstrapApplication providers array.\n * \n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideRealtimeStore()\n * ]\n * });\n * ```\n */\nexport function provideRealtimeStore(): EnvironmentProviders[] {\n return [\n provideHttpClient(withInterceptorsFromDi())\n ];\n}\n","import { Provider } from '@angular/core';\nimport { REALTIME_STORE_ENVIRONMENT, RealtimeStoreEnvironment } from '../environment';\n\nexport function provideRealtimeStoreEnvironment(environment: RealtimeStoreEnvironment): Provider {\n return {\n provide: REALTIME_STORE_ENVIRONMENT,\n useValue: environment\n };\n}","import { Injectable } from '@angular/core';\nimport { SocketService } from './socket.service';\n\n/**\n * Handles the socket connection lifecycle for the driver app.\n *\n * Pattern (mirrors customer-web's SocketConnectionService):\n * - Use setAuthToken() + connect() instead of resetWithNewToken() so an in-progress\n * connection is never torn down by a duplicate call (e.g. on page refresh).\n * - reconnect$ is NOT used to recreate the socket — Socket.IO reconnects automatically\n * using the auth token stored in socket.auth.\n * - A 'online' event listener handles recovery when the network comes back.\n *\n * Usage:\n * - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.\n * - LoginPage success handler: call connect(token) after receiving a new token.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class DriverSocketConnectionService {\n private readonly TOKEN_KEY = 'driver_token';\n private networkListener?: () => void;\n\n constructor(private readonly socketService: SocketService) {\n this.networkListener = () => this.connectFromStorage();\n window.addEventListener('online', this.networkListener);\n }\n\n /** Connect using a freshly obtained token (e.g. after login). */\n connect(token: string): void {\n localStorage.setItem(this.TOKEN_KEY, token);\n this.socketService.setAuthToken(token);\n this.socketService.connect();\n }\n\n /** Restore the socket connection from a persisted token (e.g. on app start). */\n connectFromStorage(): void {\n const token = localStorage.getItem(this.TOKEN_KEY);\n if (token) {\n this.socketService.setAuthToken(token);\n this.socketService.connect();\n }\n }\n\n disconnect(): void {\n this.socketService.disconnect();\n if (this.networkListener) {\n window.removeEventListener('online', this.networkListener);\n this.networkListener = undefined;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SocketService } from './socket.service';\n\n/**\n * Handles the socket connection lifecycle for the customer-food (online customer) app.\n *\n * Pattern (mirrors customer-web's SocketConnectionService):\n * - Use setAuthToken() + connect() instead of resetWithNewToken() so an in-progress\n * connection is never torn down by a duplicate call (e.g. on page refresh).\n * - reconnect$ is NOT used to recreate the socket — Socket.IO reconnects automatically\n * using the auth token stored in socket.auth.\n * - A 'online' event listener handles recovery when the network comes back.\n *\n * Usage:\n * - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.\n * - LoginPage success handler: call connect(token) after receiving a new token.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class OnlineCustomerSocketConnectionService {\n private readonly TOKEN_KEY = 'online_customer_token';\n private networkListener?: () => void;\n\n constructor(private readonly socketService: SocketService) {\n this.networkListener = () => this.connectFromStorage();\n window.addEventListener('online', this.networkListener);\n }\n\n /** Connect using a freshly obtained token (e.g. after login). */\n connect(token: string): void {\n this.socketService.setAuthToken(token);\n this.socketService.connect();\n }\n\n /** Restore the socket connection from a persisted token (e.g. on app start). */\n connectFromStorage(): void {\n const token = localStorage.getItem(this.TOKEN_KEY);\n if (token) {\n this.connect(token);\n }\n }\n\n disconnect(): void {\n this.socketService.disconnect();\n if (this.networkListener) {\n window.removeEventListener('online', this.networkListener);\n this.networkListener = undefined;\n }\n }\n}\n","/*\n * Public API Surface of realtime-store\n */\n\nexport * from './lib/realtime-store.module';\nexport * from './lib/socket.service';\nexport * from './lib/base-store';\nexport * from './lib/stores/table.store';\nexport * from './lib/stores/cart.store';\nexport * from './lib/stores/call-waiter.store';\nexport * from './lib/stores/notification.store';\nexport * from './lib/stores/delivery-order.store';\nexport * from './lib/stores/reservation.store';\nexport * from './lib/stores/inventory.store';\nexport * from './lib/providers';\nexport * from './lib/environment';\nexport * from './lib/providers/realtime-store-environment.provider';\nexport * from './lib/driver-socket-connection.service';\nexport * from './lib/online-customer-socket-connection.service';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SocketService"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -77,7 +77,9 @@ declare class SocketService {
|
|
|
77
77
|
private stopHealthCheck;
|
|
78
78
|
private reestablishListeners;
|
|
79
79
|
/**
|
|
80
|
-
* Set authentication token for socket connection
|
|
80
|
+
* Set authentication token for socket connection.
|
|
81
|
+
* Also updates socket.auth on the live socket so Socket.IO uses the new token
|
|
82
|
+
* on its next reconnection attempt without needing to recreate the socket.
|
|
81
83
|
*/
|
|
82
84
|
setAuthToken(token: string): void;
|
|
83
85
|
/**
|
|
@@ -85,7 +87,10 @@ declare class SocketService {
|
|
|
85
87
|
*/
|
|
86
88
|
setConnectionKey(key: string): void;
|
|
87
89
|
/**
|
|
88
|
-
* Reset connection with new token
|
|
90
|
+
* Reset connection with new token.
|
|
91
|
+
* Idempotent: if the socket is already active (connecting or connected) with the same
|
|
92
|
+
* token, this is a no-op. This prevents double-calls (e.g. from router navigation
|
|
93
|
+
* events on page refresh) from tearing down a healthy connection.
|
|
89
94
|
*/
|
|
90
95
|
resetWithNewToken(token?: string): void;
|
|
91
96
|
connect(timeoutMs?: number): Promise<void>;
|
|
@@ -150,6 +155,8 @@ declare abstract class TableStore<T extends Entity> extends BaseStore<T> {
|
|
|
150
155
|
protected socketService: SocketService;
|
|
151
156
|
private pendingJoinRequestsSubject;
|
|
152
157
|
pendingJoinRequests$: rxjs.Observable<PendingJoinRequest[]>;
|
|
158
|
+
private approvedSubject;
|
|
159
|
+
approved$: rxjs.Observable<void>;
|
|
153
160
|
constructor(socketService: SocketService);
|
|
154
161
|
protected setupSocketSubscriptions(): void;
|
|
155
162
|
removePendingJoinRequest(customerId: string): void;
|
|
@@ -299,46 +306,56 @@ declare function provideRealtimeStoreEnvironment(environment: RealtimeStoreEnvir
|
|
|
299
306
|
|
|
300
307
|
/**
|
|
301
308
|
* Handles the socket connection lifecycle for the driver app.
|
|
302
|
-
*
|
|
309
|
+
*
|
|
310
|
+
* Pattern (mirrors customer-web's SocketConnectionService):
|
|
311
|
+
* - Use setAuthToken() + connect() instead of resetWithNewToken() so an in-progress
|
|
312
|
+
* connection is never torn down by a duplicate call (e.g. on page refresh).
|
|
313
|
+
* - reconnect$ is NOT used to recreate the socket — Socket.IO reconnects automatically
|
|
314
|
+
* using the auth token stored in socket.auth.
|
|
315
|
+
* - A 'online' event listener handles recovery when the network comes back.
|
|
303
316
|
*
|
|
304
317
|
* Usage:
|
|
305
|
-
* -
|
|
306
|
-
* -
|
|
318
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
319
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
307
320
|
*/
|
|
308
321
|
declare class DriverSocketConnectionService {
|
|
309
322
|
private readonly socketService;
|
|
310
323
|
private readonly TOKEN_KEY;
|
|
311
|
-
private
|
|
324
|
+
private networkListener?;
|
|
312
325
|
constructor(socketService: SocketService);
|
|
313
326
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
314
327
|
connect(token: string): void;
|
|
315
328
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
316
329
|
connectFromStorage(): void;
|
|
317
330
|
disconnect(): void;
|
|
318
|
-
private subscribeToReconnect;
|
|
319
331
|
static ɵfac: i0.ɵɵFactoryDeclaration<DriverSocketConnectionService, never>;
|
|
320
332
|
static ɵprov: i0.ɵɵInjectableDeclaration<DriverSocketConnectionService>;
|
|
321
333
|
}
|
|
322
334
|
|
|
323
335
|
/**
|
|
324
336
|
* Handles the socket connection lifecycle for the customer-food (online customer) app.
|
|
325
|
-
*
|
|
337
|
+
*
|
|
338
|
+
* Pattern (mirrors customer-web's SocketConnectionService):
|
|
339
|
+
* - Use setAuthToken() + connect() instead of resetWithNewToken() so an in-progress
|
|
340
|
+
* connection is never torn down by a duplicate call (e.g. on page refresh).
|
|
341
|
+
* - reconnect$ is NOT used to recreate the socket — Socket.IO reconnects automatically
|
|
342
|
+
* using the auth token stored in socket.auth.
|
|
343
|
+
* - A 'online' event listener handles recovery when the network comes back.
|
|
326
344
|
*
|
|
327
345
|
* Usage:
|
|
328
|
-
* -
|
|
329
|
-
* -
|
|
346
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
347
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
330
348
|
*/
|
|
331
349
|
declare class OnlineCustomerSocketConnectionService {
|
|
332
350
|
private readonly socketService;
|
|
333
351
|
private readonly TOKEN_KEY;
|
|
334
|
-
private
|
|
352
|
+
private networkListener?;
|
|
335
353
|
constructor(socketService: SocketService);
|
|
336
354
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
337
355
|
connect(token: string): void;
|
|
338
356
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
339
357
|
connectFromStorage(): void;
|
|
340
358
|
disconnect(): void;
|
|
341
|
-
private subscribeToReconnect;
|
|
342
359
|
static ɵfac: i0.ɵɵFactoryDeclaration<OnlineCustomerSocketConnectionService, never>;
|
|
343
360
|
static ɵprov: i0.ɵɵInjectableDeclaration<OnlineCustomerSocketConnectionService>;
|
|
344
361
|
}
|