@fluxstack/live-elysia 0.1.0 → 0.2.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/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # @fluxstack/live-elysia
2
+
3
+ Elysia transport adapter for `@fluxstack/live`.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add @fluxstack/live @fluxstack/live-elysia elysia
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { Elysia } from 'elysia'
15
+ import { LiveServer } from '@fluxstack/live'
16
+ import { ElysiaTransport } from '@fluxstack/live-elysia'
17
+
18
+ const app = new Elysia()
19
+
20
+ const server = new LiveServer({
21
+ transport: new ElysiaTransport(app),
22
+ componentsPath: './src/components',
23
+ })
24
+
25
+ await server.start()
26
+ app.listen(3000)
27
+ ```
28
+
29
+ ## How It Works
30
+
31
+ `ElysiaTransport` implements the `LiveTransport` interface from `@fluxstack/live`:
32
+
33
+ - **WebSocket** — Registers a WebSocket route at `/api/live/ws` using Elysia's native `ws()` plugin
34
+ - **HTTP Routes** — Maps `GET`/`POST`/`PUT`/`DELETE` monitoring routes (e.g. `/api/live/stats`)
35
+ - **Client Bundle** — Serves the browser IIFE bundle at `/live-client.js` for vanilla JS usage
36
+
37
+ All security logic (auth, rate limiting, state signing, payload sanitization) is handled by `@fluxstack/live` core — the transport adapter is a thin pass-through wrapper.
38
+
39
+ ## API
40
+
41
+ ### `ElysiaTransport`
42
+
43
+ ```typescript
44
+ import { ElysiaTransport } from '@fluxstack/live-elysia'
45
+
46
+ const transport = new ElysiaTransport(app)
47
+ ```
48
+
49
+ ### `wrapElysiaWs()`
50
+
51
+ Helper to wrap Elysia's `ServerWebSocket` into the generic `GenericWebSocket` interface:
52
+
53
+ ```typescript
54
+ import { wrapElysiaWs } from '@fluxstack/live-elysia'
55
+
56
+ const genericWs = wrapElysiaWs(elysiaWs)
57
+ ```
58
+
59
+ ## Requirements
60
+
61
+ - Elysia `>=1.0.0`
62
+ - Bun runtime
63
+
64
+ ## License
65
+
66
+ MIT
package/dist/index.d.ts CHANGED
@@ -5,6 +5,11 @@ declare class ElysiaTransport implements LiveTransport {
5
5
  private app;
6
6
  constructor(app: Elysia<any>);
7
7
  registerWebSocket(config: WebSocketConfig): void;
8
+ /**
9
+ * Serve the @fluxstack/live-client IIFE browser bundle.
10
+ * Defaults to `/live-client.js`. Pass `false` to disable.
11
+ */
12
+ registerClientBundle(clientPath?: string | false): void;
8
13
  registerHttpRoutes(routes: HttpRouteDefinition[]): void;
9
14
  }
10
15
 
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
1
  // src/index.ts
2
+ import { readFileSync, existsSync } from "fs";
3
+ import { dirname, join } from "path";
4
+ import { fileURLToPath } from "url";
2
5
  var ElysiaTransport = class {
3
6
  app;
4
7
  constructor(app) {
@@ -8,6 +11,14 @@ var ElysiaTransport = class {
8
11
  this.app.ws(config.path, {
9
12
  open(elysiaWs) {
10
13
  const ws = wrapElysiaWs(elysiaWs);
14
+ try {
15
+ const raw = elysiaWs.raw || elysiaWs;
16
+ const origin = raw.data?.headers?.get?.("origin") || raw.data?.server?.upgrade?.headers?.get?.("origin") || void 0;
17
+ if (origin) {
18
+ ws.data = { origin };
19
+ }
20
+ } catch {
21
+ }
11
22
  config.onOpen(ws);
12
23
  },
13
24
  message(elysiaWs, rawMessage) {
@@ -29,6 +40,25 @@ var ElysiaTransport = class {
29
40
  }
30
41
  });
31
42
  }
43
+ /**
44
+ * Serve the @fluxstack/live-client IIFE browser bundle.
45
+ * Defaults to `/live-client.js`. Pass `false` to disable.
46
+ */
47
+ registerClientBundle(clientPath) {
48
+ if (clientPath === false) return;
49
+ const route = clientPath || "/live-client.js";
50
+ const bundlePath = resolveClientBundlePath();
51
+ if (!bundlePath) return;
52
+ const bundle = readFileSync(bundlePath, "utf-8");
53
+ this.app.get(route, () => {
54
+ return new Response(bundle, {
55
+ headers: {
56
+ "Content-Type": "application/javascript",
57
+ "Cache-Control": "public, max-age=86400"
58
+ }
59
+ });
60
+ });
61
+ }
32
62
  registerHttpRoutes(routes) {
33
63
  for (const route of routes) {
34
64
  const handler = async (ctx) => {
@@ -64,6 +94,17 @@ var ElysiaTransport = class {
64
94
  }
65
95
  }
66
96
  };
97
+ function resolveClientBundlePath() {
98
+ try {
99
+ const mainUrl = import.meta.resolve("@fluxstack/live-client");
100
+ const mainPath = fileURLToPath(mainUrl);
101
+ const distDir = dirname(mainPath);
102
+ const bundlePath = join(distDir, "live-client.browser.global.js");
103
+ if (existsSync(bundlePath)) return bundlePath;
104
+ } catch {
105
+ }
106
+ return null;
107
+ }
67
108
  function wrapElysiaWs(elysiaWs) {
68
109
  const raw = elysiaWs.raw || elysiaWs;
69
110
  if (raw.__liveWs) return raw.__liveWs;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @fluxstack/live-elysia - Elysia Transport Adapter\r\n//\r\n// Bridges @fluxstack/live with Elysia's WebSocket and HTTP routing.\r\n//\r\n// Usage:\r\n// import Elysia from 'elysia'\r\n// import { LiveServer } from '@fluxstack/live'\r\n// import { ElysiaTransport } from '@fluxstack/live-elysia'\r\n//\r\n// const app = new Elysia()\r\n// const liveServer = new LiveServer({ transport: new ElysiaTransport(app) })\r\n// await liveServer.start()\r\n// app.listen(3000)\r\n\r\nimport type { Elysia } from 'elysia'\r\nimport type {\r\n LiveTransport,\r\n WebSocketConfig,\r\n HttpRouteDefinition,\r\n GenericWebSocket,\r\n LiveWSData,\r\n} from '@fluxstack/live'\r\n\r\nexport class ElysiaTransport implements LiveTransport {\r\n private app: Elysia<any>\r\n\r\n constructor(app: Elysia<any>) {\r\n this.app = app\r\n }\r\n\r\n registerWebSocket(config: WebSocketConfig): void {\r\n this.app.ws(config.path, {\r\n open(elysiaWs: any) {\r\n // Wrap Elysia WS into GenericWebSocket\r\n const ws = wrapElysiaWs(elysiaWs)\r\n config.onOpen(ws)\r\n },\r\n message(elysiaWs: any, rawMessage: unknown) {\r\n const ws = wrapElysiaWs(elysiaWs)\r\n const isBinary = rawMessage instanceof ArrayBuffer || rawMessage instanceof Uint8Array\r\n // Elysia auto-parses JSON messages into objects. LiveServer expects\r\n // raw strings, so re-stringify if needed.\r\n const message = (!isBinary && typeof rawMessage === 'object' && rawMessage !== null && !(rawMessage instanceof ArrayBuffer) && !(rawMessage instanceof Uint8Array))\r\n ? JSON.stringify(rawMessage)\r\n : rawMessage\r\n config.onMessage(ws, message, isBinary)\r\n },\r\n close(elysiaWs: any, code?: number, reason?: string) {\r\n const ws = wrapElysiaWs(elysiaWs)\r\n config.onClose(ws, code ?? 1000, reason ?? '')\r\n },\r\n // @ts-ignore - Elysia's error handler signature varies between versions\r\n error(elysiaWs: any, error: any) {\r\n if (config.onError) {\r\n const ws = wrapElysiaWs(elysiaWs)\r\n config.onError(ws, error instanceof Error ? error : new Error(String(error)))\r\n }\r\n },\r\n })\r\n }\r\n\r\n registerHttpRoutes(routes: HttpRouteDefinition[]): void {\r\n for (const route of routes) {\r\n const handler = async (ctx: any) => {\r\n const request = {\r\n params: ctx.params || {},\r\n query: ctx.query || {},\r\n body: ctx.body,\r\n headers: ctx.headers || {},\r\n }\r\n\r\n const response = await route.handler(request)\r\n ctx.set.status = response.status ?? 200\r\n if (response.headers) {\r\n for (const [key, value] of Object.entries(response.headers)) {\r\n ctx.set.headers[key] = value\r\n }\r\n }\r\n return response.body\r\n }\r\n\r\n switch (route.method) {\r\n case 'GET':\r\n this.app.get(route.path, handler)\r\n break\r\n case 'POST':\r\n this.app.post(route.path, handler)\r\n break\r\n case 'PUT':\r\n this.app.put(route.path, handler)\r\n break\r\n case 'DELETE':\r\n this.app.delete(route.path, handler)\r\n break\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wrap Elysia's ServerWebSocket into a GenericWebSocket.\r\n *\r\n * Elysia stores its route context on `raw.data` (the Bun ServerWebSocket's data slot).\r\n * We must NOT overwrite it. Instead, LiveWSData is stored on a separate `__liveData`\r\n * property on the raw WS object.\r\n */\r\nfunction wrapElysiaWs(elysiaWs: any): GenericWebSocket {\r\n // Elysia wraps the raw Bun ServerWebSocket. Access the raw ws:\r\n const raw = elysiaWs.raw || elysiaWs\r\n\r\n // Reuse existing wrapper if already created (stored on the raw ws)\r\n if (raw.__liveWs) return raw.__liveWs\r\n\r\n const ws: GenericWebSocket = {\r\n send(data: string | ArrayBuffer | Uint8Array, compress?: boolean) {\r\n return raw.send(data, compress)\r\n },\r\n close(code?: number, reason?: string) {\r\n raw.close(code, reason)\r\n },\r\n get data(): LiveWSData {\r\n return raw.__liveData as LiveWSData\r\n },\r\n set data(value: LiveWSData) {\r\n raw.__liveData = value\r\n },\r\n get remoteAddress(): string {\r\n return raw.remoteAddress || ''\r\n },\r\n get readyState(): 0 | 1 | 2 | 3 {\r\n return raw.readyState\r\n }\r\n }\r\n\r\n raw.__liveWs = ws\r\n return ws\r\n}\r\n\r\nexport { ElysiaTransport as default }\r\n"],"mappings":";AAuBO,IAAM,kBAAN,MAA+C;AAAA,EAC5C;AAAA,EAER,YAAY,KAAkB;AAC5B,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,kBAAkB,QAA+B;AAC/C,SAAK,IAAI,GAAG,OAAO,MAAM;AAAA,MACvB,KAAK,UAAe;AAElB,cAAM,KAAK,aAAa,QAAQ;AAChC,eAAO,OAAO,EAAE;AAAA,MAClB;AAAA,MACA,QAAQ,UAAe,YAAqB;AAC1C,cAAM,KAAK,aAAa,QAAQ;AAChC,cAAM,WAAW,sBAAsB,eAAe,sBAAsB;AAG5E,cAAM,UAAW,CAAC,YAAY,OAAO,eAAe,YAAY,eAAe,QAAQ,EAAE,sBAAsB,gBAAgB,EAAE,sBAAsB,cACnJ,KAAK,UAAU,UAAU,IACzB;AACJ,eAAO,UAAU,IAAI,SAAS,QAAQ;AAAA,MACxC;AAAA,MACA,MAAM,UAAe,MAAe,QAAiB;AACnD,cAAM,KAAK,aAAa,QAAQ;AAChC,eAAO,QAAQ,IAAI,QAAQ,KAAM,UAAU,EAAE;AAAA,MAC/C;AAAA;AAAA,MAEA,MAAM,UAAe,OAAY;AAC/B,YAAI,OAAO,SAAS;AAClB,gBAAM,KAAK,aAAa,QAAQ;AAChC,iBAAO,QAAQ,IAAI,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QAC9E;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,mBAAmB,QAAqC;AACtD,eAAW,SAAS,QAAQ;AAC1B,YAAM,UAAU,OAAO,QAAa;AAClC,cAAM,UAAU;AAAA,UACd,QAAQ,IAAI,UAAU,CAAC;AAAA,UACvB,OAAO,IAAI,SAAS,CAAC;AAAA,UACrB,MAAM,IAAI;AAAA,UACV,SAAS,IAAI,WAAW,CAAC;AAAA,QAC3B;AAEA,cAAM,WAAW,MAAM,MAAM,QAAQ,OAAO;AAC5C,YAAI,IAAI,SAAS,SAAS,UAAU;AACpC,YAAI,SAAS,SAAS;AACpB,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC3D,gBAAI,IAAI,QAAQ,GAAG,IAAI;AAAA,UACzB;AAAA,QACF;AACA,eAAO,SAAS;AAAA,MAClB;AAEA,cAAQ,MAAM,QAAQ;AAAA,QACpB,KAAK;AACH,eAAK,IAAI,IAAI,MAAM,MAAM,OAAO;AAChC;AAAA,QACF,KAAK;AACH,eAAK,IAAI,KAAK,MAAM,MAAM,OAAO;AACjC;AAAA,QACF,KAAK;AACH,eAAK,IAAI,IAAI,MAAM,MAAM,OAAO;AAChC;AAAA,QACF,KAAK;AACH,eAAK,IAAI,OAAO,MAAM,MAAM,OAAO;AACnC;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AASA,SAAS,aAAa,UAAiC;AAErD,QAAM,MAAM,SAAS,OAAO;AAG5B,MAAI,IAAI,SAAU,QAAO,IAAI;AAE7B,QAAM,KAAuB;AAAA,IAC3B,KAAK,MAAyC,UAAoB;AAChE,aAAO,IAAI,KAAK,MAAM,QAAQ;AAAA,IAChC;AAAA,IACA,MAAM,MAAe,QAAiB;AACpC,UAAI,MAAM,MAAM,MAAM;AAAA,IACxB;AAAA,IACA,IAAI,OAAmB;AACrB,aAAO,IAAI;AAAA,IACb;AAAA,IACA,IAAI,KAAK,OAAmB;AAC1B,UAAI,aAAa;AAAA,IACnB;AAAA,IACA,IAAI,gBAAwB;AAC1B,aAAO,IAAI,iBAAiB;AAAA,IAC9B;AAAA,IACA,IAAI,aAA4B;AAC9B,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AAEA,MAAI,WAAW;AACf,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @fluxstack/live-elysia - Elysia Transport Adapter\r\n//\r\n// Bridges @fluxstack/live with Elysia's WebSocket and HTTP routing.\r\n//\r\n// Usage:\r\n// import Elysia from 'elysia'\r\n// import { LiveServer } from '@fluxstack/live'\r\n// import { ElysiaTransport } from '@fluxstack/live-elysia'\r\n//\r\n// const app = new Elysia()\r\n// const liveServer = new LiveServer({ transport: new ElysiaTransport(app) })\r\n// await liveServer.start()\r\n// app.listen(3000)\r\n\r\nimport { readFileSync, existsSync } from 'fs'\r\nimport { dirname, join } from 'path'\r\nimport { fileURLToPath } from 'url'\r\nimport type { Elysia } from 'elysia'\r\nimport type {\r\n LiveTransport,\r\n WebSocketConfig,\r\n HttpRouteDefinition,\r\n GenericWebSocket,\r\n LiveWSData,\r\n} from '@fluxstack/live'\r\n\r\nexport class ElysiaTransport implements LiveTransport {\r\n private app: Elysia<any>\r\n\r\n constructor(app: Elysia<any>) {\r\n this.app = app\r\n }\r\n\r\n registerWebSocket(config: WebSocketConfig): void {\r\n this.app.ws(config.path, {\r\n open(elysiaWs: any) {\r\n // Wrap Elysia WS into GenericWebSocket\r\n const ws = wrapElysiaWs(elysiaWs)\r\n // Extract origin from upgrade request headers for CSRF validation.\r\n // Pre-set on ws.data so handleOpen() can read it before overwriting.\r\n try {\r\n const raw = elysiaWs.raw || elysiaWs\r\n const origin = raw.data?.headers?.get?.('origin')\r\n || raw.data?.server?.upgrade?.headers?.get?.('origin')\r\n || undefined\r\n if (origin) {\r\n ws.data = { origin } as any\r\n }\r\n } catch { /* origin extraction is best-effort */ }\r\n config.onOpen(ws)\r\n },\r\n message(elysiaWs: any, rawMessage: unknown) {\r\n const ws = wrapElysiaWs(elysiaWs)\r\n const isBinary = rawMessage instanceof ArrayBuffer || rawMessage instanceof Uint8Array\r\n // Elysia auto-parses JSON messages into objects. LiveServer expects\r\n // raw strings, so re-stringify if needed.\r\n const message = (!isBinary && typeof rawMessage === 'object' && rawMessage !== null && !(rawMessage instanceof ArrayBuffer) && !(rawMessage instanceof Uint8Array))\r\n ? JSON.stringify(rawMessage)\r\n : rawMessage\r\n config.onMessage(ws, message, isBinary)\r\n },\r\n close(elysiaWs: any, code?: number, reason?: string) {\r\n const ws = wrapElysiaWs(elysiaWs)\r\n config.onClose(ws, code ?? 1000, reason ?? '')\r\n },\r\n // @ts-ignore - Elysia's error handler signature varies between versions\r\n error(elysiaWs: any, error: any) {\r\n if (config.onError) {\r\n const ws = wrapElysiaWs(elysiaWs)\r\n config.onError(ws, error instanceof Error ? error : new Error(String(error)))\r\n }\r\n },\r\n })\r\n }\r\n\r\n /**\r\n * Serve the @fluxstack/live-client IIFE browser bundle.\r\n * Defaults to `/live-client.js`. Pass `false` to disable.\r\n */\r\n registerClientBundle(clientPath?: string | false): void {\r\n if (clientPath === false) return\r\n const route = clientPath || '/live-client.js'\r\n\r\n const bundlePath = resolveClientBundlePath()\r\n if (!bundlePath) return\r\n\r\n const bundle = readFileSync(bundlePath, 'utf-8')\r\n\r\n this.app.get(route, () => {\r\n return new Response(bundle, {\r\n headers: {\r\n 'Content-Type': 'application/javascript',\r\n 'Cache-Control': 'public, max-age=86400',\r\n },\r\n })\r\n })\r\n }\r\n\r\n registerHttpRoutes(routes: HttpRouteDefinition[]): void {\r\n for (const route of routes) {\r\n const handler = async (ctx: any) => {\r\n const request = {\r\n params: ctx.params || {},\r\n query: ctx.query || {},\r\n body: ctx.body,\r\n headers: ctx.headers || {},\r\n }\r\n\r\n const response = await route.handler(request)\r\n ctx.set.status = response.status ?? 200\r\n if (response.headers) {\r\n for (const [key, value] of Object.entries(response.headers)) {\r\n ctx.set.headers[key] = value\r\n }\r\n }\r\n return response.body\r\n }\r\n\r\n switch (route.method) {\r\n case 'GET':\r\n this.app.get(route.path, handler)\r\n break\r\n case 'POST':\r\n this.app.post(route.path, handler)\r\n break\r\n case 'PUT':\r\n this.app.put(route.path, handler)\r\n break\r\n case 'DELETE':\r\n this.app.delete(route.path, handler)\r\n break\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction resolveClientBundlePath(): string | null {\r\n try {\r\n const mainUrl = import.meta.resolve('@fluxstack/live-client')\r\n const mainPath = fileURLToPath(mainUrl)\r\n const distDir = dirname(mainPath)\r\n const bundlePath = join(distDir, 'live-client.browser.global.js')\r\n if (existsSync(bundlePath)) return bundlePath\r\n } catch {\r\n // @fluxstack/live-client not installed\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Wrap Elysia's ServerWebSocket into a GenericWebSocket.\r\n *\r\n * Elysia stores its route context on `raw.data` (the Bun ServerWebSocket's data slot).\r\n * We must NOT overwrite it. Instead, LiveWSData is stored on a separate `__liveData`\r\n * property on the raw WS object.\r\n */\r\nfunction wrapElysiaWs(elysiaWs: any): GenericWebSocket {\r\n // Elysia wraps the raw Bun ServerWebSocket. Access the raw ws:\r\n const raw = elysiaWs.raw || elysiaWs\r\n\r\n // Reuse existing wrapper if already created (stored on the raw ws)\r\n if (raw.__liveWs) return raw.__liveWs\r\n\r\n const ws: GenericWebSocket = {\r\n send(data: string | ArrayBuffer | Uint8Array, compress?: boolean) {\r\n return raw.send(data, compress)\r\n },\r\n close(code?: number, reason?: string) {\r\n raw.close(code, reason)\r\n },\r\n get data(): LiveWSData {\r\n return raw.__liveData as LiveWSData\r\n },\r\n set data(value: LiveWSData) {\r\n raw.__liveData = value\r\n },\r\n get remoteAddress(): string {\r\n return raw.remoteAddress || ''\r\n },\r\n get readyState(): 0 | 1 | 2 | 3 {\r\n return raw.readyState\r\n }\r\n }\r\n\r\n raw.__liveWs = ws\r\n return ws\r\n}\r\n\r\nexport { ElysiaTransport as default }\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fluxstack/live-elysia",
3
- "version": "0.1.0",
4
- "description": "Elysia transport adapter for @fluxstack/live",
3
+ "version": "0.2.0",
4
+ "description": "Elysia.js WebSocket transport adapter for @fluxstack/live (Bun runtime)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -20,7 +20,7 @@
20
20
  "typecheck": "tsc --noEmit"
21
21
  },
22
22
  "dependencies": {
23
- "@fluxstack/live": "^0.1.0"
23
+ "@fluxstack/live": "^0.2.0"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "elysia": ">=1.0.0"