@ereo/server 0.2.19 → 0.2.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"bun-server.d.ts","sourceRoot":"","sources":["../src/bun-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bun-server.d.ts","sourceRoot":"","sources":["../src/bun-server.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -749,8 +749,21 @@ class BunServer {
749
749
  addWebSocketUpgrade(path, upgrader, wsConfig) {
750
750
  this.wsUpgradeHandlers.push({ path, upgrader, wsConfig });
751
751
  }
752
- async handleRequest(request) {
752
+ async handleRequest(request, wsType) {
753
753
  const context = createContext(request);
754
+ if (this.server) {
755
+ if (wsType) {
756
+ const actualServer = this.server;
757
+ context.set("server", {
758
+ upgrade(req, opts) {
759
+ const data = { ...opts?.data, _wsType: wsType };
760
+ return actualServer.upgrade(req, { ...opts, data });
761
+ }
762
+ });
763
+ } else {
764
+ context.set("server", this.server);
765
+ }
766
+ }
754
767
  try {
755
768
  if (this.options.trace && typeof this.options.trace === "object") {
756
769
  const url = new URL(request.url);
@@ -866,6 +879,9 @@ class BunServer {
866
879
  const routeHeaders3 = this.buildRouteHeaders(match);
867
880
  return this.applyRouteHeaders(result, routeHeaders3);
868
881
  }
882
+ if (result === undefined || result === null) {
883
+ return new Response(null, { status: 200 });
884
+ }
869
885
  const jsonResponse = new Response(JSON.stringify(result), {
870
886
  headers: { "Content-Type": "application/json" }
871
887
  });
@@ -1580,65 +1596,67 @@ class BunServer {
1580
1596
  }
1581
1597
  async start() {
1582
1598
  const { port, hostname, tls, websocket } = this.options;
1583
- const pluginUpgradeHandlers = this.wsUpgradeHandlers;
1584
- const hasPluginWs = pluginUpgradeHandlers.length > 0;
1585
- let mergedWebSocket = websocket || undefined;
1586
- if (hasPluginWs && websocket) {
1587
- mergedWebSocket = {
1588
- message(ws, message) {
1589
- const handler = ws.data?._wsType === "hmr" ? websocket : pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1590
- handler?.message?.(ws, message);
1591
- },
1592
- open(ws) {
1593
- const handler = ws.data?._wsType === "hmr" ? websocket : pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1594
- handler?.open?.(ws);
1595
- },
1596
- close(ws) {
1597
- const handler = ws.data?._wsType === "hmr" ? websocket : pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1598
- handler?.close?.(ws);
1599
- },
1600
- drain(ws) {
1601
- const handler = ws.data?._wsType === "hmr" ? websocket : pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1602
- handler?.drain?.(ws);
1603
- }
1604
- };
1605
- } else if (hasPluginWs) {
1606
- mergedWebSocket = {
1607
- message(ws, message) {
1608
- const handler = pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1609
- handler?.message?.(ws, message);
1610
- },
1611
- open(ws) {
1612
- const handler = pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1613
- handler?.open?.(ws);
1614
- },
1615
- close(ws) {
1616
- const handler = pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1617
- handler?.close?.(ws);
1618
- },
1619
- drain(ws) {
1620
- const handler = pluginUpgradeHandlers.find((h) => h.path === ws.data?._wsType)?.wsConfig;
1621
- handler?.drain?.(ws);
1622
- }
1623
- };
1624
- }
1599
+ const upgradeHandlers = this.wsUpgradeHandlers;
1600
+ const resolveHandler = (ws) => {
1601
+ const type = ws.data?._wsType;
1602
+ if (type === "hmr" && websocket)
1603
+ return websocket;
1604
+ return upgradeHandlers.find((h) => h.path === type)?.wsConfig;
1605
+ };
1606
+ const mergedWebSocket = {
1607
+ message(ws, message) {
1608
+ resolveHandler(ws)?.message?.(ws, message);
1609
+ },
1610
+ open(ws) {
1611
+ resolveHandler(ws)?.open?.(ws);
1612
+ },
1613
+ close(ws) {
1614
+ resolveHandler(ws)?.close?.(ws);
1615
+ },
1616
+ drain(ws) {
1617
+ resolveHandler(ws)?.drain?.(ws);
1618
+ }
1619
+ };
1625
1620
  const serverOptions = {
1626
1621
  port,
1627
1622
  hostname,
1628
- fetch: (request, server) => {
1623
+ fetch: async (request, server) => {
1629
1624
  const url = new URL(request.url);
1630
1625
  if (websocket && url.pathname === "/__hmr") {
1631
1626
  if (server.upgrade(request, { data: { _wsType: "hmr" } }))
1632
1627
  return;
1633
1628
  }
1634
- if (hasPluginWs) {
1635
- const upgradeHeader = request.headers.get("Upgrade");
1636
- if (upgradeHeader?.toLowerCase() === "websocket") {
1637
- for (const handler of pluginUpgradeHandlers) {
1638
- if (url.pathname === handler.path) {
1639
- const data = { _wsType: handler.path, subscriptions: new Map, ctx: {}, originalRequest: request };
1640
- if (server.upgrade(request, { data }))
1629
+ const upgradeHeader = request.headers.get("Upgrade");
1630
+ if (upgradeHeader?.toLowerCase() === "websocket") {
1631
+ for (const handler of upgradeHandlers) {
1632
+ if (url.pathname === handler.path) {
1633
+ const data = { _wsType: handler.path, subscriptions: new Map, ctx: {}, originalRequest: request };
1634
+ if (server.upgrade(request, { data }))
1635
+ return;
1636
+ }
1637
+ }
1638
+ if (this.router && typeof this.router.getRoutes === "function") {
1639
+ const routes = this.router.getRoutes();
1640
+ const matchResult = matchWithLayouts(url.pathname, routes);
1641
+ if (matchResult) {
1642
+ await this.router.loadModule(matchResult.route);
1643
+ const mod = matchResult.route.module;
1644
+ if (mod?.websocket) {
1645
+ const wsType = "route:" + url.pathname;
1646
+ if (!upgradeHandlers.some((h) => h.path === wsType)) {
1647
+ upgradeHandlers.push({
1648
+ path: wsType,
1649
+ upgrader: () => true,
1650
+ wsConfig: mod.websocket
1651
+ });
1652
+ }
1653
+ if (typeof mod.GET === "function") {
1654
+ return this.handleRequest(request, wsType);
1655
+ }
1656
+ if (server.upgrade(request, { data: { _wsType: wsType } })) {
1641
1657
  return;
1658
+ }
1659
+ return new Response("WebSocket upgrade failed", { status: 400 });
1642
1660
  }
1643
1661
  }
1644
1662
  }
@@ -1650,9 +1668,7 @@ class BunServer {
1650
1668
  if (tls) {
1651
1669
  serverOptions.tls = tls;
1652
1670
  }
1653
- if (mergedWebSocket) {
1654
- serverOptions.websocket = mergedWebSocket;
1655
- }
1671
+ serverOptions.websocket = mergedWebSocket;
1656
1672
  this.server = Bun.serve(serverOptions);
1657
1673
  const protocol = tls ? "https" : "http";
1658
1674
  console.log(`Server running at ${protocol}://${hostname}:${port}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ereo/server",
3
- "version": "0.2.19",
3
+ "version": "0.2.21",
4
4
  "license": "MIT",
5
5
  "author": "Ereo Team",
6
6
  "homepage": "https://ereojs.github.io/ereoJS",
@@ -32,10 +32,10 @@
32
32
  "typecheck": "tsc --noEmit"
33
33
  },
34
34
  "dependencies": {
35
- "@ereo/core": "^0.2.19",
36
- "@ereo/client": "^0.2.19",
37
- "@ereo/router": "^0.2.19",
38
- "@ereo/data": "^0.2.19"
35
+ "@ereo/core": "^0.2.21",
36
+ "@ereo/client": "^0.2.21",
37
+ "@ereo/router": "^0.2.21",
38
+ "@ereo/data": "^0.2.21"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/bun": "^1.1.0",