serve-socket 5.4.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 +76 -60
- package/fesm2022/serve-socket.mjs.map +1 -1
- package/index.d.ts +27 -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
|
}
|
|
@@ -785,42 +792,47 @@ function provideRealtimeStoreEnvironment(environment) {
|
|
|
785
792
|
|
|
786
793
|
/**
|
|
787
794
|
* Handles the socket connection lifecycle for the driver app.
|
|
788
|
-
*
|
|
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.
|
|
789
802
|
*
|
|
790
803
|
* Usage:
|
|
791
|
-
* -
|
|
792
|
-
* -
|
|
804
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
805
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
793
806
|
*/
|
|
794
807
|
class DriverSocketConnectionService {
|
|
795
808
|
socketService;
|
|
796
809
|
TOKEN_KEY = 'driver_token';
|
|
797
|
-
|
|
810
|
+
networkListener;
|
|
798
811
|
constructor(socketService) {
|
|
799
812
|
this.socketService = socketService;
|
|
813
|
+
this.networkListener = () => this.connectFromStorage();
|
|
814
|
+
window.addEventListener('online', this.networkListener);
|
|
800
815
|
}
|
|
801
816
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
802
817
|
connect(token) {
|
|
803
818
|
localStorage.setItem(this.TOKEN_KEY, token);
|
|
804
|
-
this.socketService.
|
|
805
|
-
this.
|
|
819
|
+
this.socketService.setAuthToken(token);
|
|
820
|
+
this.socketService.connect();
|
|
806
821
|
}
|
|
807
822
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
808
823
|
connectFromStorage() {
|
|
809
824
|
const token = localStorage.getItem(this.TOKEN_KEY);
|
|
810
825
|
if (token) {
|
|
811
|
-
this.socketService.
|
|
812
|
-
this.
|
|
826
|
+
this.socketService.setAuthToken(token);
|
|
827
|
+
this.socketService.connect();
|
|
813
828
|
}
|
|
814
829
|
}
|
|
815
830
|
disconnect() {
|
|
816
|
-
this.reconnectSubscription?.unsubscribe();
|
|
817
831
|
this.socketService.disconnect();
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
this.socketService.resetWithNewToken(token);
|
|
823
|
-
});
|
|
832
|
+
if (this.networkListener) {
|
|
833
|
+
window.removeEventListener('online', this.networkListener);
|
|
834
|
+
this.networkListener = undefined;
|
|
835
|
+
}
|
|
824
836
|
}
|
|
825
837
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DriverSocketConnectionService, deps: [{ token: SocketService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
826
838
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DriverSocketConnectionService, providedIn: 'root' });
|
|
@@ -834,41 +846,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
834
846
|
|
|
835
847
|
/**
|
|
836
848
|
* Handles the socket connection lifecycle for the customer-food (online customer) app.
|
|
837
|
-
*
|
|
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.
|
|
838
856
|
*
|
|
839
857
|
* Usage:
|
|
840
|
-
* -
|
|
841
|
-
* -
|
|
858
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
859
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
842
860
|
*/
|
|
843
861
|
class OnlineCustomerSocketConnectionService {
|
|
844
862
|
socketService;
|
|
845
863
|
TOKEN_KEY = 'online_customer_token';
|
|
846
|
-
|
|
864
|
+
networkListener;
|
|
847
865
|
constructor(socketService) {
|
|
848
866
|
this.socketService = socketService;
|
|
867
|
+
this.networkListener = () => this.connectFromStorage();
|
|
868
|
+
window.addEventListener('online', this.networkListener);
|
|
849
869
|
}
|
|
850
870
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
851
871
|
connect(token) {
|
|
852
|
-
this.socketService.
|
|
853
|
-
this.
|
|
872
|
+
this.socketService.setAuthToken(token);
|
|
873
|
+
this.socketService.connect();
|
|
854
874
|
}
|
|
855
875
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
856
876
|
connectFromStorage() {
|
|
857
877
|
const token = localStorage.getItem(this.TOKEN_KEY);
|
|
858
878
|
if (token) {
|
|
859
|
-
this.
|
|
860
|
-
this.subscribeToReconnect(token);
|
|
879
|
+
this.connect(token);
|
|
861
880
|
}
|
|
862
881
|
}
|
|
863
882
|
disconnect() {
|
|
864
|
-
this.reconnectSubscription?.unsubscribe();
|
|
865
883
|
this.socketService.disconnect();
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
this.socketService.resetWithNewToken(token);
|
|
871
|
-
});
|
|
884
|
+
if (this.networkListener) {
|
|
885
|
+
window.removeEventListener('online', this.networkListener);
|
|
886
|
+
this.networkListener = undefined;
|
|
887
|
+
}
|
|
872
888
|
}
|
|
873
889
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: OnlineCustomerSocketConnectionService, deps: [{ token: SocketService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
874
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, 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 { 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>;
|
|
@@ -301,46 +306,56 @@ declare function provideRealtimeStoreEnvironment(environment: RealtimeStoreEnvir
|
|
|
301
306
|
|
|
302
307
|
/**
|
|
303
308
|
* Handles the socket connection lifecycle for the driver app.
|
|
304
|
-
*
|
|
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.
|
|
305
316
|
*
|
|
306
317
|
* Usage:
|
|
307
|
-
* -
|
|
308
|
-
* -
|
|
318
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
319
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
309
320
|
*/
|
|
310
321
|
declare class DriverSocketConnectionService {
|
|
311
322
|
private readonly socketService;
|
|
312
323
|
private readonly TOKEN_KEY;
|
|
313
|
-
private
|
|
324
|
+
private networkListener?;
|
|
314
325
|
constructor(socketService: SocketService);
|
|
315
326
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
316
327
|
connect(token: string): void;
|
|
317
328
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
318
329
|
connectFromStorage(): void;
|
|
319
330
|
disconnect(): void;
|
|
320
|
-
private subscribeToReconnect;
|
|
321
331
|
static ɵfac: i0.ɵɵFactoryDeclaration<DriverSocketConnectionService, never>;
|
|
322
332
|
static ɵprov: i0.ɵɵInjectableDeclaration<DriverSocketConnectionService>;
|
|
323
333
|
}
|
|
324
334
|
|
|
325
335
|
/**
|
|
326
336
|
* Handles the socket connection lifecycle for the customer-food (online customer) app.
|
|
327
|
-
*
|
|
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.
|
|
328
344
|
*
|
|
329
345
|
* Usage:
|
|
330
|
-
* -
|
|
331
|
-
* -
|
|
346
|
+
* - AppComponent.ngOnInit: call connectFromStorage() ONCE to restore session.
|
|
347
|
+
* - LoginPage success handler: call connect(token) after receiving a new token.
|
|
332
348
|
*/
|
|
333
349
|
declare class OnlineCustomerSocketConnectionService {
|
|
334
350
|
private readonly socketService;
|
|
335
351
|
private readonly TOKEN_KEY;
|
|
336
|
-
private
|
|
352
|
+
private networkListener?;
|
|
337
353
|
constructor(socketService: SocketService);
|
|
338
354
|
/** Connect using a freshly obtained token (e.g. after login). */
|
|
339
355
|
connect(token: string): void;
|
|
340
356
|
/** Restore the socket connection from a persisted token (e.g. on app start). */
|
|
341
357
|
connectFromStorage(): void;
|
|
342
358
|
disconnect(): void;
|
|
343
|
-
private subscribeToReconnect;
|
|
344
359
|
static ɵfac: i0.ɵɵFactoryDeclaration<OnlineCustomerSocketConnectionService, never>;
|
|
345
360
|
static ɵprov: i0.ɵɵInjectableDeclaration<OnlineCustomerSocketConnectionService>;
|
|
346
361
|
}
|