{
  "version": 3,
  "sources": ["../../src/router/node.ts"],
  "sourcesContent": ["/**\n * Raw Node.js adapter for Colyseus matchmaking routes used by `colyseus/vite`.\n *\n * This file exists specifically so the Vite plugin can share Vite's dev HTTP\n * server while still exposing the Colyseus `/matchmake/*` endpoints.\n *\n * Keep the matchmaking behavior itself in `router/default_routes.ts` and use\n * this file only as the thin raw Node/Express adapter around it.\n */\nimport type http from 'http';\nimport { URL } from 'url';\nimport * as matchMaker from '../MatchMaker.ts';\nimport { setResponse } from '@colyseus/better-call/node';\nimport { postMatchmakeMethod } from './default_routes.ts';\n\nfunction readBody(req: http.IncomingMessage): Promise<any> {\n  return new Promise((resolve, reject) => {\n    let data = '';\n\n    req.on('data', (chunk: Buffer | string) => {\n      data += chunk.toString();\n    });\n    req.on('end', () => resolve(data ? JSON.parse(data) : {}));\n    req.on('error', reject);\n  });\n}\n\nfunction getCorsHeaders(req: http.IncomingMessage, headers?: Headers): Record<string, string> {\n  return {\n    ...matchMaker.controller.DEFAULT_CORS_HEADERS,\n    ...matchMaker.controller.getCorsHeaders(headers),\n  };\n}\n\nexport function createNodeMatchmakingMiddleware() {\n  return async (\n    req: http.IncomingMessage,\n    res: http.ServerResponse,\n    next: () => void,\n  ) => {\n    const url = new URL(req.url || '/', 'http://localhost');\n    const isMatchmakeRoute = url.pathname.startsWith(`/${matchMaker.controller.matchmakeRoute}/`);\n\n    if (!isMatchmakeRoute) {\n      next();\n      return;\n    }\n\n    const headers = new Headers(req.headers as Record<string, string>);\n    const corsHeaders = getCorsHeaders(req, headers);\n\n    if (req.method === 'OPTIONS') {\n      res.writeHead(204, corsHeaders);\n      res.end();\n      return;\n    }\n\n    if (req.method !== 'POST') {\n      next();\n      return;\n    }\n\n    const match = url.pathname.match(/^\\/matchmake\\/(\\w+)\\/(.+)/);\n    if (!match) {\n      next();\n      return;\n    }\n\n    const [, method, roomName] = match;\n\n    try {\n      const response = await postMatchmakeMethod({\n        params: { method, roomName },\n        body: await readBody(req),\n        headers: req.headers as Record<string, string>,\n        request: { headers } as any,\n        asResponse: true,\n      });\n\n      await setResponse(res, response);\n\n    } catch {\n      // Endpoint-level failures are returned as Response when `asResponse` is true.\n      // Any thrown error here is unexpected, so let the next middleware decide.\n      next();\n    }\n  };\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,iBAAoB;AACpB,iBAA4B;AAC5B,kBAA4B;AAC5B,4BAAoC;AAEpC,SAAS,SAAS,KAAyC;AACzD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO;AAEX,QAAI,GAAG,QAAQ,CAAC,UAA2B;AACzC,cAAQ,MAAM,SAAS;AAAA,IACzB,CAAC;AACD,QAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;AACzD,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,eAAe,KAA2B,SAA2C;AAC5F,SAAO;AAAA,IACL,GAAc,sBAAW;AAAA,IACzB,GAAc,sBAAW,eAAe,OAAO;AAAA,EACjD;AACF;AAEO,SAAS,kCAAkC;AAChD,SAAO,OACL,KACA,KACA,SACG;AACH,UAAM,MAAM,IAAI,eAAI,IAAI,OAAO,KAAK,kBAAkB;AACtD,UAAM,mBAAmB,IAAI,SAAS,WAAW,IAAe,sBAAW,cAAc,GAAG;AAE5F,QAAI,CAAC,kBAAkB;AACrB,WAAK;AACL;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,QAAQ,IAAI,OAAiC;AACjE,UAAM,cAAc,eAAe,KAAK,OAAO;AAE/C,QAAI,IAAI,WAAW,WAAW;AAC5B,UAAI,UAAU,KAAK,WAAW;AAC9B,UAAI,IAAI;AACR;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,QAAQ;AACzB,WAAK;AACL;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,SAAS,MAAM,2BAA2B;AAC5D,QAAI,CAAC,OAAO;AACV,WAAK;AACL;AAAA,IACF;AAEA,UAAM,CAAC,EAAE,QAAQ,QAAQ,IAAI;AAE7B,QAAI;AACF,YAAM,WAAW,UAAM,2CAAoB;AAAA,QACzC,QAAQ,EAAE,QAAQ,SAAS;AAAA,QAC3B,MAAM,MAAM,SAAS,GAAG;AAAA,QACxB,SAAS,IAAI;AAAA,QACb,SAAS,EAAE,QAAQ;AAAA,QACnB,YAAY;AAAA,MACd,CAAC;AAED,gBAAM,yBAAY,KAAK,QAAQ;AAAA,IAEjC,QAAQ;AAGN,WAAK;AAAA,IACP;AAAA,EACF;AACF;",
  "names": []
}
