udp-stencil-component-library 25.18.2-beta.6 → 25.18.2-beta.8
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/dist/cjs/index.cjs.js +138 -0
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/stencil-library.cjs.js +1 -1
- package/dist/cjs/udp-forms-renderer.cjs.entry.js +591 -603
- package/dist/cjs/udp-forms-renderer.entry.cjs.js.map +1 -1
- package/dist/cjs/udp-forms-ui.cjs.entry.js +1 -4
- package/dist/cjs/udp-forms-ui.entry.cjs.js.map +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-ui/udp-forms-ui.js +1 -4
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-ui/udp-forms-ui.js.map +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/comments-crud-utils.js +153 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/comments-crud-utils.js.map +1 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/repeated-section-utils.js +104 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/repeated-section-utils.js.map +1 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/{udp-forms-renderer-utils.js → udp-forms-renderer-utils/utils.js} +48 -2
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/utils.js.map +1 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer.js +187 -310
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer.js.map +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-handler/UdpFormHandler.js +13 -13
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-handler/UdpFormHandler.js.map +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/FormSubmissionHandler.js +142 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/FormSubmissionHandler.js.map +1 -0
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/FormSubmissionHandlerFactory.js +3 -10
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/FormSubmissionHandlerFactory.js.map +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/IFormSubmissionHandler.js.map +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/types.js.map +1 -1
- package/dist/collection/index.js +1 -0
- package/dist/collection/index.js.map +1 -1
- package/dist/collection/udp-utilities/udp-websocket-client/udp-websocket-client.js +137 -0
- package/dist/collection/udp-utilities/udp-websocket-client/udp-websocket-client.js.map +1 -0
- package/dist/components/index.js +138 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/udp-forms-renderer.js +593 -608
- package/dist/components/udp-forms-renderer.js.map +1 -1
- package/dist/components/udp-forms-ui2.js +1 -4
- package/dist/components/udp-forms-ui2.js.map +1 -1
- package/dist/docs.json +1 -1
- package/dist/esm/index.js +138 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/stencil-library.js +1 -1
- package/dist/esm/udp-forms-renderer.entry.js +592 -604
- package/dist/esm/udp-forms-renderer.entry.js.map +1 -1
- package/dist/esm/udp-forms-ui.entry.js +1 -4
- package/dist/esm/udp-forms-ui.entry.js.map +1 -1
- package/dist/stencil-library/index.esm.js +1 -1
- package/dist/stencil-library/index.esm.js.map +1 -1
- package/dist/stencil-library/stencil-library.esm.js +1 -1
- package/dist/stencil-library/udp-forms-renderer.entry.esm.js.map +1 -1
- package/dist/stencil-library/udp-forms-renderer.entry.js +1 -1
- package/dist/stencil-library/udp-forms-renderer.entry.js.map +1 -1
- package/dist/stencil-library/udp-forms-ui.entry.esm.js.map +1 -1
- package/dist/stencil-library/udp-forms-ui.entry.js +1 -1
- package/dist/stencil-library/udp-forms-ui.entry.js.map +1 -1
- package/dist/types/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/comments-crud-utils.d.ts +31 -0
- package/dist/types/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils/repeated-section-utils.d.ts +17 -0
- package/dist/types/components/forms/udp-forms/udp-forms-renderer/{udp-forms-renderer-utils.d.ts → udp-forms-renderer-utils/utils.d.ts} +4 -0
- package/dist/types/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer.d.ts +6 -10
- package/dist/types/components/forms/udp-forms/udp-forms-utils/form-handler/UdpFormHandler.d.ts +5 -6
- package/dist/types/components/forms/udp-forms/udp-forms-utils/form-submission-handler/FormSubmissionHandler.d.ts +42 -0
- package/dist/types/components/forms/udp-forms/udp-forms-utils/form-submission-handler/FormSubmissionHandlerFactory.d.ts +1 -1
- package/dist/types/components/forms/udp-forms/udp-forms-utils/form-submission-handler/IFormSubmissionHandler.d.ts +44 -5
- package/dist/types/components/forms/udp-forms/udp-forms-utils/types.d.ts +16 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/udp-utilities/udp-websocket-client/udp-websocket-client.d.ts +34 -0
- package/package.json +1 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-renderer/udp-forms-renderer-utils.js.map +0 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/PrivateFormSubmissionHandler.js +0 -264
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/PrivateFormSubmissionHandler.js.map +0 -1
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/PublicFormSubmissionHandler.js +0 -63
- package/dist/collection/components/forms/udp-forms/udp-forms-utils/form-submission-handler/PublicFormSubmissionHandler.js.map +0 -1
- package/dist/types/components/forms/udp-forms/udp-forms-utils/form-submission-handler/PrivateFormSubmissionHandler.d.ts +0 -131
- package/dist/types/components/forms/udp-forms/udp-forms-utils/form-submission-handler/PublicFormSubmissionHandler.d.ts +0 -15
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
export class UdpWebSocketClient {
|
|
2
|
+
get isConnected() {
|
|
3
|
+
var _a;
|
|
4
|
+
return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN;
|
|
5
|
+
}
|
|
6
|
+
async connect(url, getAccessToken, keepAliveIntervalMs = 0, keepAliveTimeoutMs = 0) {
|
|
7
|
+
var _a;
|
|
8
|
+
if (!this.isWssUrl(url)) {
|
|
9
|
+
throw new Error("Invalid WebSocket URL. Only ws and wss protocols are supported.");
|
|
10
|
+
}
|
|
11
|
+
const accessToken = await getAccessToken();
|
|
12
|
+
if (accessToken) {
|
|
13
|
+
// Browsers don't support setting headers manually, they only allow setting the `Sec-WebSocket-Protocol` header (secondary protocol header)
|
|
14
|
+
this.socket = new WebSocket(url, accessToken);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
this.socket = new WebSocket(url);
|
|
18
|
+
}
|
|
19
|
+
// Wait for the socket to open or error
|
|
20
|
+
await new Promise((resolve, reject) => {
|
|
21
|
+
const onOpen = () => {
|
|
22
|
+
this.socket.removeEventListener('open', onOpen);
|
|
23
|
+
this.socket.removeEventListener('error', onError);
|
|
24
|
+
resolve();
|
|
25
|
+
};
|
|
26
|
+
const onError = (e) => {
|
|
27
|
+
this.socket.removeEventListener('open', onOpen);
|
|
28
|
+
this.socket.removeEventListener('error', onError);
|
|
29
|
+
reject(e);
|
|
30
|
+
};
|
|
31
|
+
this.socket.addEventListener('open', onOpen);
|
|
32
|
+
this.socket.addEventListener('error', onError);
|
|
33
|
+
});
|
|
34
|
+
// Socket is now open, call the openHandler
|
|
35
|
+
(_a = this.openHandler) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
36
|
+
// Assign socket events
|
|
37
|
+
this.socket.onmessage = (e) => this.handleMessage(e);
|
|
38
|
+
this.socket.onclose = (e) => this.handleClose(e);
|
|
39
|
+
this.socket.onerror = (e) => this.handleError(e);
|
|
40
|
+
// Start keepAliveTimer if configured
|
|
41
|
+
if (keepAliveIntervalMs && keepAliveTimeoutMs) {
|
|
42
|
+
this.startKeepAliveTimer(keepAliveIntervalMs, keepAliveTimeoutMs);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
onMessageReceived(handler) {
|
|
46
|
+
this.messageReceivedHandler = handler;
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
onOpen(handler) {
|
|
50
|
+
this.openHandler = handler;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
onClose(handler) {
|
|
54
|
+
this.closeHandler = handler;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
onError(handler) {
|
|
58
|
+
this.errorHandler = handler;
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
send(message) {
|
|
62
|
+
if (!this.isConnected) {
|
|
63
|
+
throw new Error("WebSocket is not connected.");
|
|
64
|
+
}
|
|
65
|
+
const json = JSON.stringify(message);
|
|
66
|
+
this.socket.send(json);
|
|
67
|
+
}
|
|
68
|
+
close() {
|
|
69
|
+
if (this.socket) {
|
|
70
|
+
this.socket.close();
|
|
71
|
+
this.stopKeepAliveTimer();
|
|
72
|
+
this.socket = undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Event handlers
|
|
76
|
+
handleMessage(event) {
|
|
77
|
+
var _a;
|
|
78
|
+
try {
|
|
79
|
+
const msg = JSON.parse(event.data);
|
|
80
|
+
(_a = this.messageReceivedHandler) === null || _a === void 0 ? void 0 : _a.call(this, msg);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error("Invalid UdpWebSocketMessage received:", err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
handleClose(event) {
|
|
87
|
+
var _a;
|
|
88
|
+
(_a = this.closeHandler) === null || _a === void 0 ? void 0 : _a.call(this, event);
|
|
89
|
+
this.close();
|
|
90
|
+
}
|
|
91
|
+
handleError(event) {
|
|
92
|
+
var _a;
|
|
93
|
+
(_a = this.errorHandler) === null || _a === void 0 ? void 0 : _a.call(this, event);
|
|
94
|
+
console.error("UdpWebSocket error:", event);
|
|
95
|
+
}
|
|
96
|
+
// KeepAlive functions
|
|
97
|
+
startKeepAliveTimer(intervalMs, timeoutMs) {
|
|
98
|
+
this.stopKeepAliveTimer();
|
|
99
|
+
// TODO: Check that this is interval not timeout param
|
|
100
|
+
this.keepAliveIntervalId = window.setInterval(() => {
|
|
101
|
+
this.sendKeepAlivePing();
|
|
102
|
+
}, intervalMs);
|
|
103
|
+
// Autoclose after timeout reached
|
|
104
|
+
this.keepAliveTimeoutId = window.setTimeout(() => {
|
|
105
|
+
this.close();
|
|
106
|
+
}, timeoutMs);
|
|
107
|
+
}
|
|
108
|
+
stopKeepAliveTimer() {
|
|
109
|
+
if (this.keepAliveIntervalId)
|
|
110
|
+
clearInterval(this.keepAliveIntervalId);
|
|
111
|
+
if (this.keepAliveTimeoutId)
|
|
112
|
+
clearTimeout(this.keepAliveTimeoutId);
|
|
113
|
+
this.keepAliveIntervalId = undefined;
|
|
114
|
+
this.keepAliveTimeoutId = undefined;
|
|
115
|
+
}
|
|
116
|
+
sendKeepAlivePing() {
|
|
117
|
+
const pingPacket = {
|
|
118
|
+
headers: {
|
|
119
|
+
type: "KeepAlive",
|
|
120
|
+
timestamp: Date.now()
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
try {
|
|
124
|
+
this.send(pingPacket);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.error("KeepAlive ping failed to send:", err);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Util functions
|
|
131
|
+
isWssUrl(url) {
|
|
132
|
+
return /^wss?:\/\//.test(url);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
UdpWebSocketClient.DEFAULT_KEEPALIVE_INTERVAL_MS = 30000; // 30 sec
|
|
136
|
+
UdpWebSocketClient.DEFAULT_KEEPALIVE_TIMEOUT_MS = 60 * 60 * 1000; // 60 min
|
|
137
|
+
//# sourceMappingURL=udp-websocket-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"udp-websocket-client.js","sourceRoot":"","sources":["../../../src/udp-utilities/udp-websocket-client/udp-websocket-client.ts"],"names":[],"mappings":"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","sourcesContent":["export interface UdpWebSocketMessage {\n headers?: Record<string, any>;\n body?: any;\n}\n\nexport type UdpWsReceiveHandler = (msg: UdpWebSocketMessage) => void | Promise<void>;\nexport type UdpWsCloseHandler = (e: CloseEvent) => void | Promise<void>;\nexport type UdpWsErrorHandler = (e: Event) => void | Promise<void>;\nexport type UdpWsOpenHandler = () => void | Promise<void>;\n\nexport class UdpWebSocketClient {\n public static readonly DEFAULT_KEEPALIVE_INTERVAL_MS = 30_000; // 30 sec\n public static readonly DEFAULT_KEEPALIVE_TIMEOUT_MS = 60 * 60 * 1000; // 60 min\n\n private socket?: WebSocket;\n private keepAliveIntervalId?: number;\n private keepAliveTimeoutId?: number;\n\n private messageReceivedHandler?: UdpWsReceiveHandler;\n private closeHandler?: UdpWsCloseHandler\n private errorHandler?: UdpWsErrorHandler;\n private openHandler?: UdpWsOpenHandler;\n\n public get isConnected(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n\n public async connect(\n url: string,\n getAccessToken: () => Promise<string | void>,\n keepAliveIntervalMs: number = 0,\n keepAliveTimeoutMs: number = 0\n ) {\n if (!this.isWssUrl(url)) {\n throw new Error(\"Invalid WebSocket URL. Only ws and wss protocols are supported.\");\n }\n\n const accessToken = await getAccessToken();\n\n if (accessToken) {\n // Browsers don't support setting headers manually, they only allow setting the `Sec-WebSocket-Protocol` header (secondary protocol header)\n this.socket = new WebSocket(url, accessToken);\n } else {\n this.socket = new WebSocket(url);\n }\n\n // Wait for the socket to open or error\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n this.socket!.removeEventListener('open', onOpen);\n this.socket!.removeEventListener('error', onError);\n resolve();\n };\n\n const onError = (e: Event) => {\n this.socket!.removeEventListener('open', onOpen);\n this.socket!.removeEventListener('error', onError);\n reject(e);\n };\n\n this.socket!.addEventListener('open', onOpen);\n this.socket!.addEventListener('error', onError);\n });\n\n // Socket is now open, call the openHandler\n this.openHandler?.();\n\n // Assign socket events\n this.socket.onmessage = (e) => this.handleMessage(e);\n this.socket.onclose = (e) => this.handleClose(e);\n this.socket.onerror = (e) => this.handleError(e);\n\n // Start keepAliveTimer if configured\n if (keepAliveIntervalMs && keepAliveTimeoutMs) {\n this.startKeepAliveTimer(keepAliveIntervalMs, keepAliveTimeoutMs);\n }\n }\n\n public onMessageReceived(handler: UdpWsReceiveHandler) {\n this.messageReceivedHandler = handler;\n return this;\n }\n\n public onOpen(handler: UdpWsOpenHandler) {\n this.openHandler = handler;\n return this;\n }\n\n public onClose(handler: UdpWsCloseHandler) {\n this.closeHandler = handler;\n return this;\n }\n\n public onError(handler: UdpWsErrorHandler) {\n this.errorHandler = handler;\n return this;\n }\n\n public send(message: UdpWebSocketMessage) {\n if (!this.isConnected) {\n throw new Error(\"WebSocket is not connected.\");\n }\n\n const json = JSON.stringify(message);\n this.socket!.send(json);\n }\n\n public close() {\n if (this.socket) {\n this.socket.close();\n this.stopKeepAliveTimer();\n this.socket = undefined;\n }\n }\n\n // Event handlers\n protected handleMessage(event: MessageEvent) {\n try {\n const msg = JSON.parse(event.data) as UdpWebSocketMessage;\n this.messageReceivedHandler?.(msg);\n } catch (err) {\n console.error(\"Invalid UdpWebSocketMessage received:\", err)\n }\n }\n\n protected handleClose(event: CloseEvent) {\n this.closeHandler?.(event);\n this.close();\n }\n\n protected handleError(event: Event) {\n this.errorHandler?.(event);\n console.error(\"UdpWebSocket error:\", event);\n }\n\n // KeepAlive functions\n protected startKeepAliveTimer(intervalMs: number, timeoutMs: number) {\n this.stopKeepAliveTimer();\n\n // TODO: Check that this is interval not timeout param\n this.keepAliveIntervalId = window.setInterval(() => {\n this.sendKeepAlivePing();\n }, intervalMs);\n\n // Autoclose after timeout reached\n this.keepAliveTimeoutId = window.setTimeout(() => {\n this.close();\n }, timeoutMs);\n }\n\n protected stopKeepAliveTimer() {\n if (this.keepAliveIntervalId) clearInterval(this.keepAliveIntervalId);\n if (this.keepAliveTimeoutId) clearTimeout(this.keepAliveTimeoutId);\n\n this.keepAliveIntervalId = undefined;\n this.keepAliveTimeoutId = undefined;\n }\n\n protected sendKeepAlivePing() {\n const pingPacket: UdpWebSocketMessage = {\n headers: {\n type: \"KeepAlive\",\n timestamp: Date.now()\n },\n };\n\n try {\n this.send(pingPacket);\n } catch (err) {\n console.error(\"KeepAlive ping failed to send:\", err);\n }\n }\n\n // Util functions\n protected isWssUrl(url: string): boolean {\n return /^wss?:\\/\\//.test(url);\n }\n}\n"]}
|
package/dist/components/index.js
CHANGED
|
@@ -68,7 +68,144 @@ function useMatchBreakpoint(breakpointKey) {
|
|
|
68
68
|
return mediaQueryList.matches;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
class UdpWebSocketClient {
|
|
72
|
+
get isConnected() {
|
|
73
|
+
var _a;
|
|
74
|
+
return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN;
|
|
75
|
+
}
|
|
76
|
+
async connect(url, getAccessToken, keepAliveIntervalMs = 0, keepAliveTimeoutMs = 0) {
|
|
77
|
+
var _a;
|
|
78
|
+
if (!this.isWssUrl(url)) {
|
|
79
|
+
throw new Error("Invalid WebSocket URL. Only ws and wss protocols are supported.");
|
|
80
|
+
}
|
|
81
|
+
const accessToken = await getAccessToken();
|
|
82
|
+
if (accessToken) {
|
|
83
|
+
// Browsers don't support setting headers manually, they only allow setting the `Sec-WebSocket-Protocol` header (secondary protocol header)
|
|
84
|
+
this.socket = new WebSocket(url, accessToken);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.socket = new WebSocket(url);
|
|
88
|
+
}
|
|
89
|
+
// Wait for the socket to open or error
|
|
90
|
+
await new Promise((resolve, reject) => {
|
|
91
|
+
const onOpen = () => {
|
|
92
|
+
this.socket.removeEventListener('open', onOpen);
|
|
93
|
+
this.socket.removeEventListener('error', onError);
|
|
94
|
+
resolve();
|
|
95
|
+
};
|
|
96
|
+
const onError = (e) => {
|
|
97
|
+
this.socket.removeEventListener('open', onOpen);
|
|
98
|
+
this.socket.removeEventListener('error', onError);
|
|
99
|
+
reject(e);
|
|
100
|
+
};
|
|
101
|
+
this.socket.addEventListener('open', onOpen);
|
|
102
|
+
this.socket.addEventListener('error', onError);
|
|
103
|
+
});
|
|
104
|
+
// Socket is now open, call the openHandler
|
|
105
|
+
(_a = this.openHandler) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
106
|
+
// Assign socket events
|
|
107
|
+
this.socket.onmessage = (e) => this.handleMessage(e);
|
|
108
|
+
this.socket.onclose = (e) => this.handleClose(e);
|
|
109
|
+
this.socket.onerror = (e) => this.handleError(e);
|
|
110
|
+
// Start keepAliveTimer if configured
|
|
111
|
+
if (keepAliveIntervalMs && keepAliveTimeoutMs) {
|
|
112
|
+
this.startKeepAliveTimer(keepAliveIntervalMs, keepAliveTimeoutMs);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
onMessageReceived(handler) {
|
|
116
|
+
this.messageReceivedHandler = handler;
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
onOpen(handler) {
|
|
120
|
+
this.openHandler = handler;
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
onClose(handler) {
|
|
124
|
+
this.closeHandler = handler;
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
onError(handler) {
|
|
128
|
+
this.errorHandler = handler;
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
send(message) {
|
|
132
|
+
if (!this.isConnected) {
|
|
133
|
+
throw new Error("WebSocket is not connected.");
|
|
134
|
+
}
|
|
135
|
+
const json = JSON.stringify(message);
|
|
136
|
+
this.socket.send(json);
|
|
137
|
+
}
|
|
138
|
+
close() {
|
|
139
|
+
if (this.socket) {
|
|
140
|
+
this.socket.close();
|
|
141
|
+
this.stopKeepAliveTimer();
|
|
142
|
+
this.socket = undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Event handlers
|
|
146
|
+
handleMessage(event) {
|
|
147
|
+
var _a;
|
|
148
|
+
try {
|
|
149
|
+
const msg = JSON.parse(event.data);
|
|
150
|
+
(_a = this.messageReceivedHandler) === null || _a === void 0 ? void 0 : _a.call(this, msg);
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
console.error("Invalid UdpWebSocketMessage received:", err);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
handleClose(event) {
|
|
157
|
+
var _a;
|
|
158
|
+
(_a = this.closeHandler) === null || _a === void 0 ? void 0 : _a.call(this, event);
|
|
159
|
+
this.close();
|
|
160
|
+
}
|
|
161
|
+
handleError(event) {
|
|
162
|
+
var _a;
|
|
163
|
+
(_a = this.errorHandler) === null || _a === void 0 ? void 0 : _a.call(this, event);
|
|
164
|
+
console.error("UdpWebSocket error:", event);
|
|
165
|
+
}
|
|
166
|
+
// KeepAlive functions
|
|
167
|
+
startKeepAliveTimer(intervalMs, timeoutMs) {
|
|
168
|
+
this.stopKeepAliveTimer();
|
|
169
|
+
// TODO: Check that this is interval not timeout param
|
|
170
|
+
this.keepAliveIntervalId = window.setInterval(() => {
|
|
171
|
+
this.sendKeepAlivePing();
|
|
172
|
+
}, intervalMs);
|
|
173
|
+
// Autoclose after timeout reached
|
|
174
|
+
this.keepAliveTimeoutId = window.setTimeout(() => {
|
|
175
|
+
this.close();
|
|
176
|
+
}, timeoutMs);
|
|
177
|
+
}
|
|
178
|
+
stopKeepAliveTimer() {
|
|
179
|
+
if (this.keepAliveIntervalId)
|
|
180
|
+
clearInterval(this.keepAliveIntervalId);
|
|
181
|
+
if (this.keepAliveTimeoutId)
|
|
182
|
+
clearTimeout(this.keepAliveTimeoutId);
|
|
183
|
+
this.keepAliveIntervalId = undefined;
|
|
184
|
+
this.keepAliveTimeoutId = undefined;
|
|
185
|
+
}
|
|
186
|
+
sendKeepAlivePing() {
|
|
187
|
+
const pingPacket = {
|
|
188
|
+
headers: {
|
|
189
|
+
type: "KeepAlive",
|
|
190
|
+
timestamp: Date.now()
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
try {
|
|
194
|
+
this.send(pingPacket);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
console.error("KeepAlive ping failed to send:", err);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Util functions
|
|
201
|
+
isWssUrl(url) {
|
|
202
|
+
return /^wss?:\/\//.test(url);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
UdpWebSocketClient.DEFAULT_KEEPALIVE_INTERVAL_MS = 30000; // 30 sec
|
|
206
|
+
UdpWebSocketClient.DEFAULT_KEEPALIVE_TIMEOUT_MS = 60 * 60 * 1000; // 60 min
|
|
207
|
+
|
|
208
|
+
export { UdpWebSocketClient, apiMutate, getMergedConfig, useMatchBreakpoint };
|
|
72
209
|
//# sourceMappingURL=index.js.map
|
|
73
210
|
|
|
74
211
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"index.js","mappings":";;;;;;;AAgBA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAGa,eAAe,GAAG,CAAC,QAAgB,EAAE,MAAe,KAAY;AAC3E,IAAA,MAAM,OAAO,GAAG,CAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,OAAO,IAAE,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,MAAM,CAAC,OAAO,IAAK,EAAE;AAC5D,IAAA,OAAO,CAAC,eAAe,GAAG,QAAQ;;AAGlC,IAAA,OAAY,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,MAAM,CAAE,EAAA,EAAA,OAAO,EAAG,CAAA;AAChC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEO,MAAM,SAAS,GAAG,OACvB,OAAe,EACf,GAAW,EACX,MAAc,EACd,IAAS,KACP;IACF,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,CAAG,EAAA,OAAO,CAAI,CAAA,EAAA,GAAG,CAAE,CAAA,EAAE;IAC5C,OAAOA,KAAK,+CAAM,OAAO,CAAA,EAAK,MAAM,CAAK,EAAA,IAAI,EAAG;AAClD;;ACxEA;AACA,SAAS,mBAAmB,CAAC,QAAQ,EAAA;IACnC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC9E;AAEO,MAAM,WAAW,GAAG;AACzB,IAAA,EAAE,EAAE,CAAe,YAAA,EAAA,mBAAmB,CAAC,qBAAqB,CAAC,CAAK,GAAA,CAAA;IAClE,EAAE,EAAE,CAAe,YAAA,EAAA,mBAAmB,CAAC,qBAAqB,CAAC,CAAA,oBAAA,EAAuB,mBAAmB,CAAC,qBAAqB,CAAC,CAAK,GAAA,CAAA;IACnI,EAAE,EAAE,CAAe,YAAA,EAAA,mBAAmB,CAAC,qBAAqB,CAAC,CAAA,oBAAA,EAAuB,mBAAmB,CAAC,qBAAqB,CAAC,CAAK,GAAA,CAAA;IACnI,EAAE,EAAE,CAAe,YAAA,EAAA,mBAAmB,CAAC,qBAAqB,CAAC,CAAA,oBAAA,EAAuB,mBAAmB,CAAC,qBAAqB,CAAC,CAAK,GAAA,CAAA;AACnI,IAAA,EAAE,EAAE,CAAe,YAAA,EAAA,mBAAmB,CAAC,qBAAqB,CAAC,CAAK,GAAA,CAAA;CACnE;;ACTK,SAAU,kBAAkB,CAAC,aAAuC,EAAA;IACxE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;AAEhD,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC;IACxC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;IAC/C,OAAO,cAAc,CAAC,OAAO;AAC/B;;;;","names":["Axios"],"sources":["src/udp-utilities/api-udp/apiMutate.ts","src/udp-utilities/layout/breakpoints/breakpoints.ts","src/udp-utilities/layout/breakpoints/useMatchBreakpoint.ts"],"sourcesContent":["\nimport Axios from 'axios';\n\n/**\n * @deprecated This component is deprecated and will be removed in a future version.\n * Use 'makeApiCall' instead\n */\n\ninterface Config {\n headers?: {\n [key: string]: string;\n };\n [key: string]: any;\n }\n\n\n// export const getAccessToken = async () => {\n// return 'eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1Bc2V1MXplcmJDaVA0cW5UNUtkRlFjaFNpTHpiVDJieFdCVVBVXzYtNGMiLCJ0eXAiOiJKV1QifQ.eyJzdWIiOiI5YzI0MTNiZS1hNTZiLTQ5NzAtOWVmMC0wZTNmMDI4Y2E1YWEiLCJlbWFpbCI6ImdyZWdvcnlAcmVkd2Vya3Mub3JnIiwibmFtZSI6IkdyZWdvcnkgVGhvbWFzIiwiZ2l2ZW5fbmFtZSI6IkdyZWdvcnkiLCJmYW1pbHlfbmFtZSI6IlRob21hcyIsInVuaXR5VXNlcklkIjoiOGZlM2I1Y2UtNmE5NC00ZmY0LWIzNWMtYmUyNTk2ZWExMzgwIiwidGVuYW50c0xpc3QiOiJbe1wiVGVuYW50SWRcIjpcImY4NmE5YjdjLWJhYjAtNDI4MS04OWEyLTUyYjRjYWY4OWZhYlwiLFwiVGVuYW50TmFtZVwiOlwiVW5pdmVydXMgU29mdHdhcmUgSW5jXCIsXCJQcm9kdWN0c1wiOlszNiwzNywzNCwzNSwxLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMiw0MSw1Ml0sXCJSb2xlc1wiOltcIjYyMzRiNzQwLWIyNmYtNDE4MS05Yjk1LTRjNDA2MzQ1MzhjMVwiXX0se1wiVGVuYW50SWRcIjpcIjk4ZjUwYTUxLTdjNjEtNDMxMC1iNWI0LTNhOWZlMDJjODEyM1wiLFwiVGVuYW50TmFtZVwiOlwiU21hcnRHcmlkQ0lTXCIsXCJQcm9kdWN0c1wiOlsxLDMsNCw1LDQxLDYsOCw3LDksMTEsMTAsMTUsMTYsMTQsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMTMsMTIsMjgsMjksMjcsMzBdLFwiUm9sZXNcIjpbXCI2MjM0Yjc0MC1iMjZmLTQxODEtOWI5NS00YzQwNjM0NTM4YzFcIl19XSIsInRpZCI6IjIxODg2NTI4LTM2MDItNGJmMi1hMzZiLTI5YjFkMTUyZTExYiIsImlzRm9yZ290UGFzc3dvcmQiOmZhbHNlLCJub25jZSI6IjQ3NDdkMTJhLWEzMGItNDRlMC1iNDllLTVmYmY0YjZhOTdmNiIsInNjcCI6ImFwaV9hY2Nlc3MiLCJhenAiOiJmYzUxNGZkOC01NGIzLTRmYWItYmRjOC1hZTdkY2Q4YzY1NzUiLCJ2ZXIiOiIxLjAiLCJpYXQiOjE2OTYzNTMzMTMsImF1ZCI6IjNmOTY2NDFmLTk0NDItNDUzMi1iNWJiLTdkYmM5Y2EzZjNhNSIsImV4cCI6MTY5NjM1NjkxMywiaXNzIjoiaHR0cHM6Ly91bml2ZXJ1c3VuaXR5ZGV2LmIyY2xvZ2luLmNvbS8yMTg4NjUyOC0zNjAyLTRiZjItYTM2Yi0yOWIxZDE1MmUxMWIvdjIuMC8iLCJuYmYiOjE2OTYzNTMzMTN9.Xcp8JSrF9mT3O3DSdqYmGRSAjo5Km4-XkLUDEuk3fXJnAPPF7vKtApSvA65iAlhqtyB4JY6idDrzWG5zgpyEvpTvc6Kvj6RjHXEkqMmsY6H1nFxAsIvfL72Sl8U4lBD9c4MOO1r5itfjsPkdZhV7ZtQi9xbFO0KTZmtLpET0hC0e8DA61uKAq2R5olfXi8pJThJGRRWleWFXwyatyjXIOfRpvuTfE5ls1zYSo62_7_FXOVAyAf-CrDLZFga8QYd4y5oncUAkbP4Lja0jDkHvvJhBRz67FePcWhJWo_6ofqGLRFBpFneduwgVgDMf6RY5mJa-5dlwDWE8YTqcuNMmlg'\n// };\n\n// export const getMergedConfig = (accessToken: string | null, config?: Config): Config => {\n// const headers = config?.headers ? { ...config.headers } : {};\n\n// headers.currentTenantId = headers.currentTenantId || \"f86a9b7c-bab0-4281-89a2-52b4caf89fab\"; // Your currentTenantId\n// if (accessToken) headers.Authorization = headers.Authorization || `Bearer ${accessToken}`;\n\n// return { ...config, headers };\n// };\n\n\n// export const apiMutate = async (\n// baseURL: string,\n// url: string,\n// config: Config,\n// data: any,\n// accessToken: string | null\n// ) => {\n// const fullURL = { url: `${baseURL}/${url}` };\n// const mergedConfig = getMergedConfig(accessToken, config);\n// return Axios({ ...fullURL, ...mergedConfig, ...data });\n// };\n\n\nexport const getMergedConfig = (tenantId: string, config?: Config): Config => {\n const headers = config?.headers ? { ...config.headers } : {};\n headers.currentTenantId = tenantId;\n //if (accessToken) headers.Authorization = headers.Authorization || `Bearer ${accessToken}`;\n\n return { ...config, headers };\n};\n\n// export const apiMutate = async (\n// baseURL: string,\n// url: string,\n// config: Config,\n// data: any,\n// accessToken: string | null,\n// tenantId: string // New tenantId parameter\n// ) => {\n// const fullURL = { url: `${baseURL}/${url}` };\n// const mergedConfig = getMergedConfig(tenantId, accessToken, config); // Pass the tenantId\n// return Axios({ ...fullURL, ...mergedConfig, ...data });\n// };\n\nexport const apiMutate = async (\n baseURL: string,\n url: string,\n config: Config,\n data: any\n) => {\n const fullURL = { url: `${baseURL}/${url}` };\n return Axios({ ...fullURL, ...config, ...data });\n};\n\n\n","// Helper function to get the value of a CSS variable from the :root\nfunction getCssVariableValue(variable) {\n return getComputedStyle(document.documentElement).getPropertyValue(variable);\n}\n\nexport const breakpoints = {\n xs: `(max-width: ${getCssVariableValue('--breakpoint-xs-max')}px)`,\n sm: `(min-width: ${getCssVariableValue('--breakpoint-sm-min')}px) and (max-width: ${getCssVariableValue('--breakpoint-sm-max')}px)`,\n md: `(min-width: ${getCssVariableValue('--breakpoint-md-min')}px) and (max-width: ${getCssVariableValue('--breakpoint-md-max')}px)`,\n lg: `(min-width: ${getCssVariableValue('--breakpoint-lg-min')}px) and (max-width: ${getCssVariableValue('--breakpoint-lg-max')}px)`,\n xl: `(min-width: ${getCssVariableValue('--breakpoint-xl-min')}px)`,\n};\n\n\n\n\n// export const breakpoints = {\n// xs: '(max-width: 599px)',\n// sm: '(min-width: 600px) and (max-width: 959px)',\n// md: '(min-width: 960px) and (max-width: 1279px)',\n// lg: '(min-width: 1280px) and (max-width: 1919px)',\n// xl: '(min-width: 1920px)',\n// };\n ","import { breakpoints } from './breakpoints';\n\nexport function useMatchBreakpoint(breakpointKey: keyof typeof breakpoints): boolean {\n if (typeof window === 'undefined') return false; // SSR or build-time rendering\n\n const query = breakpoints[breakpointKey];\n const mediaQueryList = window.matchMedia(query);\n return mediaQueryList.matches;\n}\n"],"version":3}
|
|
1
|
+
{"file":"index.js","mappings":"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","names":["Axios"],"sources":["src/udp-utilities/api-udp/apiMutate.ts","src/udp-utilities/layout/breakpoints/breakpoints.ts","src/udp-utilities/layout/breakpoints/useMatchBreakpoint.ts","src/udp-utilities/udp-websocket-client/udp-websocket-client.ts"],"sourcesContent":["\nimport Axios from 'axios';\n\n/**\n * @deprecated This component is deprecated and will be removed in a future version.\n * Use 'makeApiCall' instead\n */\n\ninterface Config {\n headers?: {\n [key: string]: string;\n };\n [key: string]: any;\n }\n\n\n// export const getAccessToken = async () => {\n// return 'eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1Bc2V1MXplcmJDaVA0cW5UNUtkRlFjaFNpTHpiVDJieFdCVVBVXzYtNGMiLCJ0eXAiOiJKV1QifQ.eyJzdWIiOiI5YzI0MTNiZS1hNTZiLTQ5NzAtOWVmMC0wZTNmMDI4Y2E1YWEiLCJlbWFpbCI6ImdyZWdvcnlAcmVkd2Vya3Mub3JnIiwibmFtZSI6IkdyZWdvcnkgVGhvbWFzIiwiZ2l2ZW5fbmFtZSI6IkdyZWdvcnkiLCJmYW1pbHlfbmFtZSI6IlRob21hcyIsInVuaXR5VXNlcklkIjoiOGZlM2I1Y2UtNmE5NC00ZmY0LWIzNWMtYmUyNTk2ZWExMzgwIiwidGVuYW50c0xpc3QiOiJbe1wiVGVuYW50SWRcIjpcImY4NmE5YjdjLWJhYjAtNDI4MS04OWEyLTUyYjRjYWY4OWZhYlwiLFwiVGVuYW50TmFtZVwiOlwiVW5pdmVydXMgU29mdHdhcmUgSW5jXCIsXCJQcm9kdWN0c1wiOlszNiwzNywzNCwzNSwxLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMiw0MSw1Ml0sXCJSb2xlc1wiOltcIjYyMzRiNzQwLWIyNmYtNDE4MS05Yjk1LTRjNDA2MzQ1MzhjMVwiXX0se1wiVGVuYW50SWRcIjpcIjk4ZjUwYTUxLTdjNjEtNDMxMC1iNWI0LTNhOWZlMDJjODEyM1wiLFwiVGVuYW50TmFtZVwiOlwiU21hcnRHcmlkQ0lTXCIsXCJQcm9kdWN0c1wiOlsxLDMsNCw1LDQxLDYsOCw3LDksMTEsMTAsMTUsMTYsMTQsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMTMsMTIsMjgsMjksMjcsMzBdLFwiUm9sZXNcIjpbXCI2MjM0Yjc0MC1iMjZmLTQxODEtOWI5NS00YzQwNjM0NTM4YzFcIl19XSIsInRpZCI6IjIxODg2NTI4LTM2MDItNGJmMi1hMzZiLTI5YjFkMTUyZTExYiIsImlzRm9yZ290UGFzc3dvcmQiOmZhbHNlLCJub25jZSI6IjQ3NDdkMTJhLWEzMGItNDRlMC1iNDllLTVmYmY0YjZhOTdmNiIsInNjcCI6ImFwaV9hY2Nlc3MiLCJhenAiOiJmYzUxNGZkOC01NGIzLTRmYWItYmRjOC1hZTdkY2Q4YzY1NzUiLCJ2ZXIiOiIxLjAiLCJpYXQiOjE2OTYzNTMzMTMsImF1ZCI6IjNmOTY2NDFmLTk0NDItNDUzMi1iNWJiLTdkYmM5Y2EzZjNhNSIsImV4cCI6MTY5NjM1NjkxMywiaXNzIjoiaHR0cHM6Ly91bml2ZXJ1c3VuaXR5ZGV2LmIyY2xvZ2luLmNvbS8yMTg4NjUyOC0zNjAyLTRiZjItYTM2Yi0yOWIxZDE1MmUxMWIvdjIuMC8iLCJuYmYiOjE2OTYzNTMzMTN9.Xcp8JSrF9mT3O3DSdqYmGRSAjo5Km4-XkLUDEuk3fXJnAPPF7vKtApSvA65iAlhqtyB4JY6idDrzWG5zgpyEvpTvc6Kvj6RjHXEkqMmsY6H1nFxAsIvfL72Sl8U4lBD9c4MOO1r5itfjsPkdZhV7ZtQi9xbFO0KTZmtLpET0hC0e8DA61uKAq2R5olfXi8pJThJGRRWleWFXwyatyjXIOfRpvuTfE5ls1zYSo62_7_FXOVAyAf-CrDLZFga8QYd4y5oncUAkbP4Lja0jDkHvvJhBRz67FePcWhJWo_6ofqGLRFBpFneduwgVgDMf6RY5mJa-5dlwDWE8YTqcuNMmlg'\n// };\n\n// export const getMergedConfig = (accessToken: string | null, config?: Config): Config => {\n// const headers = config?.headers ? { ...config.headers } : {};\n\n// headers.currentTenantId = headers.currentTenantId || \"f86a9b7c-bab0-4281-89a2-52b4caf89fab\"; // Your currentTenantId\n// if (accessToken) headers.Authorization = headers.Authorization || `Bearer ${accessToken}`;\n\n// return { ...config, headers };\n// };\n\n\n// export const apiMutate = async (\n// baseURL: string,\n// url: string,\n// config: Config,\n// data: any,\n// accessToken: string | null\n// ) => {\n// const fullURL = { url: `${baseURL}/${url}` };\n// const mergedConfig = getMergedConfig(accessToken, config);\n// return Axios({ ...fullURL, ...mergedConfig, ...data });\n// };\n\n\nexport const getMergedConfig = (tenantId: string, config?: Config): Config => {\n const headers = config?.headers ? { ...config.headers } : {};\n headers.currentTenantId = tenantId;\n //if (accessToken) headers.Authorization = headers.Authorization || `Bearer ${accessToken}`;\n\n return { ...config, headers };\n};\n\n// export const apiMutate = async (\n// baseURL: string,\n// url: string,\n// config: Config,\n// data: any,\n// accessToken: string | null,\n// tenantId: string // New tenantId parameter\n// ) => {\n// const fullURL = { url: `${baseURL}/${url}` };\n// const mergedConfig = getMergedConfig(tenantId, accessToken, config); // Pass the tenantId\n// return Axios({ ...fullURL, ...mergedConfig, ...data });\n// };\n\nexport const apiMutate = async (\n baseURL: string,\n url: string,\n config: Config,\n data: any\n) => {\n const fullURL = { url: `${baseURL}/${url}` };\n return Axios({ ...fullURL, ...config, ...data });\n};\n\n\n","// Helper function to get the value of a CSS variable from the :root\nfunction getCssVariableValue(variable) {\n return getComputedStyle(document.documentElement).getPropertyValue(variable);\n}\n\nexport const breakpoints = {\n xs: `(max-width: ${getCssVariableValue('--breakpoint-xs-max')}px)`,\n sm: `(min-width: ${getCssVariableValue('--breakpoint-sm-min')}px) and (max-width: ${getCssVariableValue('--breakpoint-sm-max')}px)`,\n md: `(min-width: ${getCssVariableValue('--breakpoint-md-min')}px) and (max-width: ${getCssVariableValue('--breakpoint-md-max')}px)`,\n lg: `(min-width: ${getCssVariableValue('--breakpoint-lg-min')}px) and (max-width: ${getCssVariableValue('--breakpoint-lg-max')}px)`,\n xl: `(min-width: ${getCssVariableValue('--breakpoint-xl-min')}px)`,\n};\n\n\n\n\n// export const breakpoints = {\n// xs: '(max-width: 599px)',\n// sm: '(min-width: 600px) and (max-width: 959px)',\n// md: '(min-width: 960px) and (max-width: 1279px)',\n// lg: '(min-width: 1280px) and (max-width: 1919px)',\n// xl: '(min-width: 1920px)',\n// };\n ","import { breakpoints } from './breakpoints';\n\nexport function useMatchBreakpoint(breakpointKey: keyof typeof breakpoints): boolean {\n if (typeof window === 'undefined') return false; // SSR or build-time rendering\n\n const query = breakpoints[breakpointKey];\n const mediaQueryList = window.matchMedia(query);\n return mediaQueryList.matches;\n}\n","export interface UdpWebSocketMessage {\n headers?: Record<string, any>;\n body?: any;\n}\n\nexport type UdpWsReceiveHandler = (msg: UdpWebSocketMessage) => void | Promise<void>;\nexport type UdpWsCloseHandler = (e: CloseEvent) => void | Promise<void>;\nexport type UdpWsErrorHandler = (e: Event) => void | Promise<void>;\nexport type UdpWsOpenHandler = () => void | Promise<void>;\n\nexport class UdpWebSocketClient {\n public static readonly DEFAULT_KEEPALIVE_INTERVAL_MS = 30_000; // 30 sec\n public static readonly DEFAULT_KEEPALIVE_TIMEOUT_MS = 60 * 60 * 1000; // 60 min\n\n private socket?: WebSocket;\n private keepAliveIntervalId?: number;\n private keepAliveTimeoutId?: number;\n\n private messageReceivedHandler?: UdpWsReceiveHandler;\n private closeHandler?: UdpWsCloseHandler\n private errorHandler?: UdpWsErrorHandler;\n private openHandler?: UdpWsOpenHandler;\n\n public get isConnected(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n\n public async connect(\n url: string,\n getAccessToken: () => Promise<string | void>,\n keepAliveIntervalMs: number = 0,\n keepAliveTimeoutMs: number = 0\n ) {\n if (!this.isWssUrl(url)) {\n throw new Error(\"Invalid WebSocket URL. Only ws and wss protocols are supported.\");\n }\n\n const accessToken = await getAccessToken();\n\n if (accessToken) {\n // Browsers don't support setting headers manually, they only allow setting the `Sec-WebSocket-Protocol` header (secondary protocol header)\n this.socket = new WebSocket(url, accessToken);\n } else {\n this.socket = new WebSocket(url);\n }\n\n // Wait for the socket to open or error\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n this.socket!.removeEventListener('open', onOpen);\n this.socket!.removeEventListener('error', onError);\n resolve();\n };\n\n const onError = (e: Event) => {\n this.socket!.removeEventListener('open', onOpen);\n this.socket!.removeEventListener('error', onError);\n reject(e);\n };\n\n this.socket!.addEventListener('open', onOpen);\n this.socket!.addEventListener('error', onError);\n });\n\n // Socket is now open, call the openHandler\n this.openHandler?.();\n\n // Assign socket events\n this.socket.onmessage = (e) => this.handleMessage(e);\n this.socket.onclose = (e) => this.handleClose(e);\n this.socket.onerror = (e) => this.handleError(e);\n\n // Start keepAliveTimer if configured\n if (keepAliveIntervalMs && keepAliveTimeoutMs) {\n this.startKeepAliveTimer(keepAliveIntervalMs, keepAliveTimeoutMs);\n }\n }\n\n public onMessageReceived(handler: UdpWsReceiveHandler) {\n this.messageReceivedHandler = handler;\n return this;\n }\n\n public onOpen(handler: UdpWsOpenHandler) {\n this.openHandler = handler;\n return this;\n }\n\n public onClose(handler: UdpWsCloseHandler) {\n this.closeHandler = handler;\n return this;\n }\n\n public onError(handler: UdpWsErrorHandler) {\n this.errorHandler = handler;\n return this;\n }\n\n public send(message: UdpWebSocketMessage) {\n if (!this.isConnected) {\n throw new Error(\"WebSocket is not connected.\");\n }\n\n const json = JSON.stringify(message);\n this.socket!.send(json);\n }\n\n public close() {\n if (this.socket) {\n this.socket.close();\n this.stopKeepAliveTimer();\n this.socket = undefined;\n }\n }\n\n // Event handlers\n protected handleMessage(event: MessageEvent) {\n try {\n const msg = JSON.parse(event.data) as UdpWebSocketMessage;\n this.messageReceivedHandler?.(msg);\n } catch (err) {\n console.error(\"Invalid UdpWebSocketMessage received:\", err)\n }\n }\n\n protected handleClose(event: CloseEvent) {\n this.closeHandler?.(event);\n this.close();\n }\n\n protected handleError(event: Event) {\n this.errorHandler?.(event);\n console.error(\"UdpWebSocket error:\", event);\n }\n\n // KeepAlive functions\n protected startKeepAliveTimer(intervalMs: number, timeoutMs: number) {\n this.stopKeepAliveTimer();\n\n // TODO: Check that this is interval not timeout param\n this.keepAliveIntervalId = window.setInterval(() => {\n this.sendKeepAlivePing();\n }, intervalMs);\n\n // Autoclose after timeout reached\n this.keepAliveTimeoutId = window.setTimeout(() => {\n this.close();\n }, timeoutMs);\n }\n\n protected stopKeepAliveTimer() {\n if (this.keepAliveIntervalId) clearInterval(this.keepAliveIntervalId);\n if (this.keepAliveTimeoutId) clearTimeout(this.keepAliveTimeoutId);\n\n this.keepAliveIntervalId = undefined;\n this.keepAliveTimeoutId = undefined;\n }\n\n protected sendKeepAlivePing() {\n const pingPacket: UdpWebSocketMessage = {\n headers: {\n type: \"KeepAlive\",\n timestamp: Date.now()\n },\n };\n\n try {\n this.send(pingPacket);\n } catch (err) {\n console.error(\"KeepAlive ping failed to send:\", err);\n }\n }\n\n // Util functions\n protected isWssUrl(url: string): boolean {\n return /^wss?:\\/\\//.test(url);\n }\n}\n"],"version":3}
|