@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 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
  });
@@ -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,wBA6HG"}
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
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.0.0"
6
6
  },
7
- "version": "0.3.30",
7
+ "version": "0.6.0",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
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,3 +1,3 @@
1
1
  import { H3Event } from "h3";
2
- export declare function proxyToAPI(event: H3Event, customPath?: string): Promise<any> | undefined;
2
+ export declare function proxyToAPI(event: H3Event, customPath?: string): Promise<any>;
3
3
  //# sourceMappingURL=proxy.d.ts.map
@@ -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;AAa3C,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,4BAgC7D"}
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
  });
@@ -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":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;QAC/B,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,KAAK,CAAC,EAAE,QAAQ,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,UAAU,cAAc,CAAC,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnG,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAClB,iDAAiD;IACjD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IAC7B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,wFAAwF;IACxF,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1C,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,UAAU,eAAe;IACvB,yGAAyG;IACzG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;CAChD;AAED,KAAK,uBAAuB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;CAAE,GAC5F,eAAe,GACf,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACtC,eAAe,GACf,CAAC,SAAS;IAAE,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAChC,OAAO,CAAC,eAAe,CAAC,GACxB,EAAE,CAAC;AAEP,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3F,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,qBAAqB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACxG,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;CACxB;AAED,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1B,iDAAiD;IACjD,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;CAChD;AAQD,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAEtE,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpB,KAAK,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;CACpE;AAGD,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enfyra/sdk-nuxt",
3
- "version": "0.3.30",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "description": "Nuxt SDK for Enfyra CMS",
6
6
  "repository": {
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
  });
@@ -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
+