@enfyra/sdk-nuxt 0.3.30 → 0.6.0
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/module.cjs +8 -0
- package/dist/module.d.ts.map +1 -1
- package/dist/module.json +1 -1
- package/dist/module.mjs +8 -0
- package/dist/runtime/composables/useEnfyraWebSocket.d.ts +16 -0
- package/dist/runtime/composables/useEnfyraWebSocket.d.ts.map +1 -0
- package/dist/runtime/composables/useEnfyraWebSocket.js +94 -0
- package/dist/runtime/utils/server/proxy.d.ts +1 -1
- package/dist/runtime/utils/server/proxy.d.ts.map +1 -1
- package/dist/runtime/utils/server/proxy.js +0 -17
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/module.ts +8 -0
- package/src/runtime/composables/useEnfyraWebSocket.ts +127 -0
- package/src/runtime/utils/server/proxy.ts +0 -28
- package/src/types/index.ts +10 -0
package/dist/module.cjs
CHANGED
|
@@ -67,6 +67,10 @@ enfyraSDK: {
|
|
|
67
67
|
{
|
|
68
68
|
name: "useEnfyraAuth",
|
|
69
69
|
from: resolve("./runtime/composables/useEnfyraAuth")
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: "useEnfyraWebSocket",
|
|
73
|
+
from: resolve("./runtime/composables/useEnfyraWebSocket")
|
|
70
74
|
}
|
|
71
75
|
]);
|
|
72
76
|
kit.addTypeTemplate({
|
|
@@ -81,6 +85,10 @@ declare module '#imports' {
|
|
|
81
85
|
export function useEnfyra(): UseEnfyraReturn
|
|
82
86
|
|
|
83
87
|
export function useEnfyraAuth(): import('@enfyra/sdk-nuxt/types').UseEnfyraAuthReturn
|
|
88
|
+
|
|
89
|
+
export type EnfyraWebSocketInstance = import('@enfyra/sdk-nuxt/types').EnfyraWebSocketInstance
|
|
90
|
+
|
|
91
|
+
export function useEnfyraWebSocket(path: string, options?: { reconnect?: boolean; reconnectInterval?: number; maxReconnectAttempts?: number }): EnfyraWebSocketInstance
|
|
84
92
|
}
|
|
85
93
|
`
|
|
86
94
|
});
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;;AAED,
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;;AAED,wBAqIG"}
|
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -64,6 +64,10 @@ enfyraSDK: {
|
|
|
64
64
|
{
|
|
65
65
|
name: "useEnfyraAuth",
|
|
66
66
|
from: resolve("./runtime/composables/useEnfyraAuth")
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "useEnfyraWebSocket",
|
|
70
|
+
from: resolve("./runtime/composables/useEnfyraWebSocket")
|
|
67
71
|
}
|
|
68
72
|
]);
|
|
69
73
|
addTypeTemplate({
|
|
@@ -78,6 +82,10 @@ declare module '#imports' {
|
|
|
78
82
|
export function useEnfyra(): UseEnfyraReturn
|
|
79
83
|
|
|
80
84
|
export function useEnfyraAuth(): import('@enfyra/sdk-nuxt/types').UseEnfyraAuthReturn
|
|
85
|
+
|
|
86
|
+
export type EnfyraWebSocketInstance = import('@enfyra/sdk-nuxt/types').EnfyraWebSocketInstance
|
|
87
|
+
|
|
88
|
+
export function useEnfyraWebSocket(path: string, options?: { reconnect?: boolean; reconnectInterval?: number; maxReconnectAttempts?: number }): EnfyraWebSocketInstance
|
|
81
89
|
}
|
|
82
90
|
`
|
|
83
91
|
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface EnfyraWebSocketOptions {
|
|
2
|
+
reconnect?: boolean;
|
|
3
|
+
reconnectInterval?: number;
|
|
4
|
+
maxReconnectAttempts?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface EnfyraWebSocketInstance {
|
|
7
|
+
connect: () => void;
|
|
8
|
+
close: () => void;
|
|
9
|
+
send: (event: string, data?: any) => void;
|
|
10
|
+
on: (event: string, callback: (...args: any[]) => void) => void;
|
|
11
|
+
off: (event: string, callback: (...args: any[]) => void) => void;
|
|
12
|
+
getWebSocket: () => WebSocket | null;
|
|
13
|
+
isConnected: () => boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function useEnfyraWebSocket(path: string, options?: EnfyraWebSocketOptions): EnfyraWebSocketInstance;
|
|
16
|
+
//# sourceMappingURL=useEnfyraWebSocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEnfyraWebSocket.d.ts","sourceRoot":"","sources":["../../../src/runtime/composables/useEnfyraWebSocket.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAC1C,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IAChE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IACjE,YAAY,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,uBAAuB,CA2G9G"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useRuntimeConfig } from "#imports";
|
|
2
|
+
import { normalizeUrl } from "../utils/url.js";
|
|
3
|
+
export function useEnfyraWebSocket(path, options = {}) {
|
|
4
|
+
const config = useRuntimeConfig().public.enfyraSDK;
|
|
5
|
+
const apiUrl = config?.apiUrl || process.env.API_URL || "http://localhost:1105";
|
|
6
|
+
let ws = null;
|
|
7
|
+
let reconnectTimer = null;
|
|
8
|
+
let reconnectAttempts = 0;
|
|
9
|
+
const listeners = /* @__PURE__ */ new Map();
|
|
10
|
+
const getWsUrl = (path2) => {
|
|
11
|
+
const url = apiUrl.replace(/^http/, "ws");
|
|
12
|
+
return normalizeUrl(url, path2);
|
|
13
|
+
};
|
|
14
|
+
const connect = () => {
|
|
15
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
ws = new WebSocket(getWsUrl(path));
|
|
19
|
+
ws.onopen = () => {
|
|
20
|
+
reconnectAttempts = 0;
|
|
21
|
+
emit("open");
|
|
22
|
+
};
|
|
23
|
+
ws.onmessage = (event) => {
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(event.data);
|
|
26
|
+
const eventName = parsed.event || "message";
|
|
27
|
+
emit(eventName, parsed.data);
|
|
28
|
+
emit("message", parsed);
|
|
29
|
+
} catch {
|
|
30
|
+
emit("message", event.data);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
ws.onclose = () => {
|
|
34
|
+
emit("close");
|
|
35
|
+
if (options.reconnect && (!options.maxReconnectAttempts || reconnectAttempts < (options.maxReconnectAttempts || 5))) {
|
|
36
|
+
reconnectTimer = setTimeout(() => {
|
|
37
|
+
reconnectAttempts++;
|
|
38
|
+
connect();
|
|
39
|
+
}, options.reconnectInterval || 3e3);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
ws.onerror = (error) => {
|
|
43
|
+
emit("error", error);
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
const send = (event, data) => {
|
|
47
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
48
|
+
throw new Error("WebSocket is not connected");
|
|
49
|
+
}
|
|
50
|
+
const payload = data !== void 0 ? { event, data } : { event };
|
|
51
|
+
ws.send(JSON.stringify(payload));
|
|
52
|
+
};
|
|
53
|
+
const close = () => {
|
|
54
|
+
if (reconnectTimer) {
|
|
55
|
+
clearTimeout(reconnectTimer);
|
|
56
|
+
reconnectTimer = null;
|
|
57
|
+
}
|
|
58
|
+
if (ws) {
|
|
59
|
+
ws.close();
|
|
60
|
+
ws = null;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const getWebSocket = () => ws;
|
|
64
|
+
const isConnected = () => {
|
|
65
|
+
return ws !== null && ws.readyState === WebSocket.OPEN;
|
|
66
|
+
};
|
|
67
|
+
const on = (event, callback) => {
|
|
68
|
+
if (!listeners.has(event)) {
|
|
69
|
+
listeners.set(event, /* @__PURE__ */ new Set());
|
|
70
|
+
}
|
|
71
|
+
listeners.get(event).add(callback);
|
|
72
|
+
};
|
|
73
|
+
const off = (event, callback) => {
|
|
74
|
+
const eventListeners = listeners.get(event);
|
|
75
|
+
if (eventListeners) {
|
|
76
|
+
eventListeners.delete(callback);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const emit = (event, ...args) => {
|
|
80
|
+
const eventListeners = listeners.get(event);
|
|
81
|
+
if (eventListeners) {
|
|
82
|
+
eventListeners.forEach((callback) => callback(...args));
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
connect,
|
|
87
|
+
send,
|
|
88
|
+
close,
|
|
89
|
+
getWebSocket,
|
|
90
|
+
isConnected,
|
|
91
|
+
on,
|
|
92
|
+
off
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../../src/runtime/utils/server/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../../src/runtime/utils/server/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,IAAI,CAAC;AAK3C,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,gBAY7D"}
|
|
@@ -1,30 +1,13 @@
|
|
|
1
1
|
import { proxyRequest } from "h3";
|
|
2
|
-
import { createProxy } from "http-proxy";
|
|
3
2
|
import { useRuntimeConfig } from "#imports";
|
|
4
3
|
import { ENFYRA_API_PREFIX } from "../../constants/config.js";
|
|
5
4
|
import { normalizeUrl } from "../url.js";
|
|
6
|
-
const proxy = createProxy({
|
|
7
|
-
target: process.env.API_URL || "http://localhost:1105",
|
|
8
|
-
ws: true,
|
|
9
|
-
changeOrigin: true
|
|
10
|
-
});
|
|
11
5
|
export function proxyToAPI(event, customPath) {
|
|
12
6
|
const config = useRuntimeConfig();
|
|
13
7
|
const apiPrefix = config.public?.enfyraSDK?.apiPrefix || ENFYRA_API_PREFIX;
|
|
14
8
|
const rawPath = customPath || event.path.replace(new RegExp(`^${apiPrefix}`), "");
|
|
15
9
|
const targetUrl = normalizeUrl(config.public?.enfyraSDK?.apiUrl, rawPath);
|
|
16
10
|
const headers = event.context.proxyHeaders || {};
|
|
17
|
-
const isWebSocket = event.node.req.headers["upgrade"]?.toLowerCase() === "websocket";
|
|
18
|
-
if (isWebSocket) {
|
|
19
|
-
event.node.req.url = rawPath;
|
|
20
|
-
proxy.web(event.node.req, event.node.res, {
|
|
21
|
-
target: config.public?.enfyraSDK?.apiUrl || process.env.API_URL || "http://localhost:1105",
|
|
22
|
-
ws: true,
|
|
23
|
-
changeOrigin: true,
|
|
24
|
-
headers
|
|
25
|
-
});
|
|
26
|
-
return void 0;
|
|
27
|
-
}
|
|
28
11
|
return proxyRequest(event, targetUrl, {
|
|
29
12
|
headers
|
|
30
13
|
});
|
package/dist/types/index.d.ts
CHANGED
|
@@ -140,4 +140,13 @@ export interface UseEnfyraApiClientReturn<T> {
|
|
|
140
140
|
execute: (executeOpts?: ExecuteOptions) => Promise<T | T[] | null>;
|
|
141
141
|
}
|
|
142
142
|
export * from './auth';
|
|
143
|
+
export interface EnfyraWebSocketInstance {
|
|
144
|
+
connect: () => void;
|
|
145
|
+
close: () => void;
|
|
146
|
+
send: (event: string, data?: any) => void;
|
|
147
|
+
on: (event: string, callback: (...args: any[]) => void) => void;
|
|
148
|
+
off: (event: string, callback: (...args: any[]) => void) => void;
|
|
149
|
+
getWebSocket: () => WebSocket | null;
|
|
150
|
+
isConnected: () => boolean;
|
|
151
|
+
}
|
|
143
152
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/module.ts
CHANGED
|
@@ -96,6 +96,10 @@ export default defineNuxtModule<ModuleOptions>({
|
|
|
96
96
|
name: "useEnfyraAuth",
|
|
97
97
|
from: resolve("./runtime/composables/useEnfyraAuth"),
|
|
98
98
|
},
|
|
99
|
+
{
|
|
100
|
+
name: "useEnfyraWebSocket",
|
|
101
|
+
from: resolve("./runtime/composables/useEnfyraWebSocket"),
|
|
102
|
+
},
|
|
99
103
|
]);
|
|
100
104
|
addTypeTemplate({
|
|
101
105
|
filename: "types/enfyra-sdk.d.ts",
|
|
@@ -109,6 +113,10 @@ declare module '#imports' {
|
|
|
109
113
|
export function useEnfyra(): UseEnfyraReturn
|
|
110
114
|
|
|
111
115
|
export function useEnfyraAuth(): import('@enfyra/sdk-nuxt/types').UseEnfyraAuthReturn
|
|
116
|
+
|
|
117
|
+
export type EnfyraWebSocketInstance = import('@enfyra/sdk-nuxt/types').EnfyraWebSocketInstance
|
|
118
|
+
|
|
119
|
+
export function useEnfyraWebSocket(path: string, options?: { reconnect?: boolean; reconnectInterval?: number; maxReconnectAttempts?: number }): EnfyraWebSocketInstance
|
|
112
120
|
}
|
|
113
121
|
`,
|
|
114
122
|
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { useRuntimeConfig } from "#imports";
|
|
2
|
+
import { normalizeUrl } from "../utils/url";
|
|
3
|
+
|
|
4
|
+
export interface EnfyraWebSocketOptions {
|
|
5
|
+
reconnect?: boolean;
|
|
6
|
+
reconnectInterval?: number;
|
|
7
|
+
maxReconnectAttempts?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface EnfyraWebSocketInstance {
|
|
11
|
+
connect: () => void;
|
|
12
|
+
close: () => void;
|
|
13
|
+
send: (event: string, data?: any) => void;
|
|
14
|
+
on: (event: string, callback: (...args: any[]) => void) => void;
|
|
15
|
+
off: (event: string, callback: (...args: any[]) => void) => void;
|
|
16
|
+
getWebSocket: () => WebSocket | null;
|
|
17
|
+
isConnected: () => boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function useEnfyraWebSocket(path: string, options: EnfyraWebSocketOptions = {}): EnfyraWebSocketInstance {
|
|
21
|
+
const config = useRuntimeConfig().public.enfyraSDK;
|
|
22
|
+
const apiUrl = config?.apiUrl || process.env.API_URL || 'http://localhost:1105';
|
|
23
|
+
|
|
24
|
+
let ws: WebSocket | null = null;
|
|
25
|
+
let reconnectTimer: ReturnType<typeof setTimeout> | null = null;
|
|
26
|
+
let reconnectAttempts = 0;
|
|
27
|
+
const listeners: Map<string, Set<(...args: any[]) => void>> = new Map();
|
|
28
|
+
|
|
29
|
+
const getWsUrl = (path: string): string => {
|
|
30
|
+
const url = apiUrl.replace(/^http/, 'ws');
|
|
31
|
+
return normalizeUrl(url, path);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const connect = (): void => {
|
|
35
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ws = new WebSocket(getWsUrl(path));
|
|
40
|
+
|
|
41
|
+
ws.onopen = () => {
|
|
42
|
+
reconnectAttempts = 0;
|
|
43
|
+
emit('open');
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
ws.onmessage = (event: MessageEvent) => {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(event.data);
|
|
49
|
+
const eventName = parsed.event || 'message';
|
|
50
|
+
emit(eventName, parsed.data);
|
|
51
|
+
emit('message', parsed);
|
|
52
|
+
} catch {
|
|
53
|
+
emit('message', event.data);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
ws.onclose = () => {
|
|
58
|
+
emit('close');
|
|
59
|
+
if (options.reconnect && (!options.maxReconnectAttempts || reconnectAttempts < (options.maxReconnectAttempts || 5))) {
|
|
60
|
+
reconnectTimer = setTimeout(() => {
|
|
61
|
+
reconnectAttempts++;
|
|
62
|
+
connect();
|
|
63
|
+
}, options.reconnectInterval || 3000);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
ws.onerror = (error: Event) => {
|
|
68
|
+
emit('error', error);
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const send = (event: string, data?: any): void => {
|
|
73
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
74
|
+
throw new Error('WebSocket is not connected');
|
|
75
|
+
}
|
|
76
|
+
const payload = data !== undefined ? { event, data } : { event };
|
|
77
|
+
ws.send(JSON.stringify(payload));
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const close = (): void => {
|
|
81
|
+
if (reconnectTimer) {
|
|
82
|
+
clearTimeout(reconnectTimer);
|
|
83
|
+
reconnectTimer = null;
|
|
84
|
+
}
|
|
85
|
+
if (ws) {
|
|
86
|
+
ws.close();
|
|
87
|
+
ws = null;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const getWebSocket = (): WebSocket | null => ws;
|
|
92
|
+
|
|
93
|
+
const isConnected = (): boolean => {
|
|
94
|
+
return ws !== null && ws.readyState === WebSocket.OPEN;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const on = (event: string, callback: (...args: any[]) => void): void => {
|
|
98
|
+
if (!listeners.has(event)) {
|
|
99
|
+
listeners.set(event, new Set());
|
|
100
|
+
}
|
|
101
|
+
listeners.get(event)!.add(callback);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const off = (event: string, callback: (...args: any[]) => void): void => {
|
|
105
|
+
const eventListeners = listeners.get(event);
|
|
106
|
+
if (eventListeners) {
|
|
107
|
+
eventListeners.delete(callback);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const emit = (event: string, ...args: any[]): void => {
|
|
112
|
+
const eventListeners = listeners.get(event);
|
|
113
|
+
if (eventListeners) {
|
|
114
|
+
eventListeners.forEach(callback => callback(...args));
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
connect,
|
|
120
|
+
send,
|
|
121
|
+
close,
|
|
122
|
+
getWebSocket,
|
|
123
|
+
isConnected,
|
|
124
|
+
on,
|
|
125
|
+
off,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import { H3Event, proxyRequest } from "h3";
|
|
2
|
-
import { createProxy } from "http-proxy";
|
|
3
2
|
import { useRuntimeConfig } from "#imports";
|
|
4
3
|
import { ENFYRA_API_PREFIX } from "../../constants/config";
|
|
5
4
|
import { normalizeUrl } from "../url";
|
|
6
5
|
|
|
7
|
-
// Create proxy instance (reuse for performance)
|
|
8
|
-
const proxy = createProxy({
|
|
9
|
-
target: process.env.API_URL || 'http://localhost:1105',
|
|
10
|
-
ws: true,
|
|
11
|
-
changeOrigin: true,
|
|
12
|
-
});
|
|
13
|
-
|
|
14
6
|
export function proxyToAPI(event: H3Event, customPath?: string) {
|
|
15
7
|
const config = useRuntimeConfig();
|
|
16
8
|
const apiPrefix = config.public?.enfyraSDK?.apiPrefix || ENFYRA_API_PREFIX;
|
|
@@ -20,26 +12,6 @@ export function proxyToAPI(event: H3Event, customPath?: string) {
|
|
|
20
12
|
|
|
21
13
|
const headers = event.context.proxyHeaders || {};
|
|
22
14
|
|
|
23
|
-
// Detect WebSocket upgrade request
|
|
24
|
-
const isWebSocket = event.node.req.headers['upgrade']?.toLowerCase() === 'websocket';
|
|
25
|
-
|
|
26
|
-
if (isWebSocket) {
|
|
27
|
-
// Modify req.url to remove the apiPrefix before proxying
|
|
28
|
-
// The incoming request is /api/chat/test-room but backend expects /chat/test-room
|
|
29
|
-
// Don't restore since proxy.web() is async
|
|
30
|
-
event.node.req.url = rawPath;
|
|
31
|
-
|
|
32
|
-
// For WebSocket, use http-proxy directly
|
|
33
|
-
proxy.web(event.node.req, event.node.res, {
|
|
34
|
-
target: config.public?.enfyraSDK?.apiUrl || process.env.API_URL || 'http://localhost:1105',
|
|
35
|
-
ws: true,
|
|
36
|
-
changeOrigin: true,
|
|
37
|
-
headers,
|
|
38
|
-
});
|
|
39
|
-
// Return undefined to signal we've handled the response asynchronously
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
15
|
return proxyRequest(event, targetUrl, {
|
|
44
16
|
headers,
|
|
45
17
|
});
|
package/src/types/index.ts
CHANGED
|
@@ -163,3 +163,13 @@ export interface UseEnfyraApiClientReturn<T> {
|
|
|
163
163
|
|
|
164
164
|
export * from './auth';
|
|
165
165
|
|
|
166
|
+
export interface EnfyraWebSocketInstance {
|
|
167
|
+
connect: () => void;
|
|
168
|
+
close: () => void;
|
|
169
|
+
send: (event: string, data?: any) => void;
|
|
170
|
+
on: (event: string, callback: (...args: any[]) => void) => void;
|
|
171
|
+
off: (event: string, callback: (...args: any[]) => void) => void;
|
|
172
|
+
getWebSocket: () => WebSocket | null;
|
|
173
|
+
isConnected: () => boolean;
|
|
174
|
+
}
|
|
175
|
+
|