@rpgjs/server 5.0.0-alpha.43 → 5.0.0-alpha.44

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,5 +1,5 @@
1
- import { r as resolveMapUpdateToken, u as updateMap, c as createMapUpdateHeaders } from '../map-D4T2_hc-.js';
2
- export { a as MAP_UPDATE_TOKEN_ENV, M as MAP_UPDATE_TOKEN_HEADER, i as isMapUpdateAuthorized, b as readMapUpdateToken } from '../map-D4T2_hc-.js';
1
+ import { Z as resolveMapUpdateToken, E as setInject, w as context, F as injector, $ as updateMap, a0 as createMapUpdateHeaders, K as provideServerModules } from '../module-CuaepWlN.js';
2
+ export { A as MAP_UPDATE_TOKEN_ENV, z as MAP_UPDATE_TOKEN_HEADER, y as isMapUpdateAuthorized, a1 as readMapUpdateToken } from '../module-CuaepWlN.js';
3
3
 
4
4
  function readEnvVariable(name) {
5
5
  const value = globalThis.process?.env?.[name];
@@ -444,6 +444,7 @@ function createConnectionContext(url, headers, method) {
444
444
  class RpgServerTransport {
445
445
  constructor(serverModule, options = {}) {
446
446
  this.serverModule = serverModule;
447
+ this.serverContextInitialized = false;
447
448
  this.rooms = /* @__PURE__ */ new Map();
448
449
  this.servers = /* @__PURE__ */ new Map();
449
450
  this.lastKnownHost = "";
@@ -452,6 +453,14 @@ class RpgServerTransport {
452
453
  this.partiesPath = normalizePathPrefix(options.partiesPath || "/parties/main", "/parties/main");
453
454
  this.tiledBasePaths = options.tiledBasePaths;
454
455
  }
456
+ async ensureServerContext() {
457
+ if (this.serverContextInitialized) {
458
+ return;
459
+ }
460
+ setInject(context);
461
+ await injector(context, [provideServerModules([])]);
462
+ this.serverContextInitialized = true;
463
+ }
455
464
  getRoom(roomId) {
456
465
  return this.rooms.get(roomId);
457
466
  }
@@ -470,6 +479,7 @@ class RpgServerTransport {
470
479
  }
471
480
  let rpgServer = this.servers.get(roomId);
472
481
  if (!rpgServer) {
482
+ await this.ensureServerContext();
473
483
  rpgServer = new this.serverModule(room);
474
484
  this.servers.set(roomId, rpgServer);
475
485
  console.log(`Created new server instance for room: ${roomId}`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/node/connection.ts","../../src/node/room.ts","../../src/node/transport.ts"],"sourcesContent":["import type { RpgWebSocketConnection } from \"./types\";\n\ntype RuntimeProcess = {\n env?: Record<string, string | undefined>;\n};\n\nfunction readEnvVariable(name: string): string | undefined {\n const value = (globalThis as { process?: RuntimeProcess }).process?.env?.[name];\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport class PartyConnection {\n public id: string;\n public uri: string;\n private _state: any = {};\n private messageQueue: Array<{ message: string; timestamp: number; sequence: number }> = [];\n private isProcessingQueue = false;\n private sequenceCounter = 0;\n private incomingQueue: Array<{\n message: string;\n timestamp: number;\n processor: (messages: string[]) => Promise<void>;\n }> = [];\n private isProcessingIncomingQueue = false;\n\n public static packetLossRate = parseFloat(readEnvVariable(\"RPGJS_PACKET_LOSS_RATE\") || \"0.1\");\n public static packetLossEnabled = readEnvVariable(\"RPGJS_ENABLE_PACKET_LOSS\") === \"true\";\n public static packetLossFilter = readEnvVariable(\"RPGJS_PACKET_LOSS_FILTER\") || \"\";\n public static bandwidthEnabled = readEnvVariable(\"RPGJS_ENABLE_BANDWIDTH\") === \"true\";\n public static bandwidthKbps = parseInt(readEnvVariable(\"RPGJS_BANDWIDTH_KBPS\") || \"100\");\n public static bandwidthFilter = readEnvVariable(\"RPGJS_BANDWIDTH_FILTER\") || \"\";\n public static latencyEnabled = readEnvVariable(\"RPGJS_ENABLE_LATENCY\") === \"true\";\n public static latencyMs = parseInt(readEnvVariable(\"RPGJS_LATENCY_MS\") || \"50\");\n public static latencyFilter = readEnvVariable(\"RPGJS_LATENCY_FILTER\") || \"\";\n\n constructor(private ws: RpgWebSocketConnection, id?: string, uri?: string) {\n this.id = id || this.generateId();\n this.uri = uri || \"\";\n }\n\n private generateId(): string {\n return `conn_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n async send(data: any): Promise<void> {\n if (this.ws.readyState !== 1) {\n return;\n }\n\n const message = typeof data === \"string\" ? data : JSON.stringify(data);\n const timestamp = Date.now();\n const sequence = ++this.sequenceCounter;\n\n this.messageQueue.push({ message, timestamp, sequence });\n\n if (!this.isProcessingQueue) {\n void this.processMessageQueue();\n }\n }\n\n private async processMessageQueue(): Promise<void> {\n if (this.isProcessingQueue) {\n return;\n }\n this.isProcessingQueue = true;\n\n while (this.messageQueue.length > 0) {\n const queueItem = this.messageQueue.shift()!;\n\n if (this.shouldApplyLatency(queueItem.message)) {\n await this.waitUntil(queueItem.timestamp + PartyConnection.latencyMs);\n }\n\n if (PartyConnection.bandwidthEnabled && PartyConnection.bandwidthKbps > 0) {\n if (!PartyConnection.bandwidthFilter || queueItem.message.includes(PartyConnection.bandwidthFilter)) {\n const messageSizeBits = queueItem.message.length * 8;\n const transmissionTimeMs = (messageSizeBits / (PartyConnection.bandwidthKbps * 1000)) * 1000;\n const bandwidthDelayMs = Math.max(transmissionTimeMs, 10);\n console.log(\n `\\x1b[34m[BANDWIDTH SIMULATION]\\x1b[0m Connection ${this.id}: Message #${queueItem.sequence} transmission time: ${bandwidthDelayMs.toFixed(1)}ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, bandwidthDelayMs));\n }\n }\n\n this.ws.send(queueItem.message);\n }\n\n this.isProcessingQueue = false;\n }\n\n private shouldApplyLatency(message: string): boolean {\n if (!PartyConnection.latencyEnabled || PartyConnection.latencyMs <= 0) {\n return false;\n }\n if (!PartyConnection.latencyFilter) {\n return true;\n }\n return message.includes(PartyConnection.latencyFilter);\n }\n\n private async waitUntil(targetTimestamp: number): Promise<void> {\n const delayMs = targetTimestamp - Date.now();\n if (delayMs <= 0) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n close(): void {\n if (this.ws.readyState === 1) {\n this.ws.close();\n }\n }\n\n setState(value: any): void {\n this._state = value;\n }\n\n get state(): any {\n return this._state;\n }\n\n bufferIncoming(message: string, processor: (messages: string[]) => Promise<void>): void {\n this.incomingQueue.push({\n message,\n timestamp: Date.now(),\n processor,\n });\n\n if (!this.isProcessingIncomingQueue) {\n void this.processIncomingQueue();\n }\n }\n\n private async processIncomingQueue(): Promise<void> {\n if (this.isProcessingIncomingQueue) {\n return;\n }\n this.isProcessingIncomingQueue = true;\n\n while (this.incomingQueue.length > 0) {\n const item = this.incomingQueue.shift()!;\n if (this.shouldApplyLatency(item.message)) {\n await this.waitUntil(item.timestamp + PartyConnection.latencyMs);\n }\n try {\n await item.processor([item.message]);\n } catch (err) {\n console.error(\"Error processing incoming message:\", err);\n }\n }\n\n this.isProcessingIncomingQueue = false;\n }\n\n static configurePacketLoss(enabled: boolean, rate: number, filter?: string): void {\n PartyConnection.packetLossEnabled = enabled;\n PartyConnection.packetLossRate = Math.max(0, Math.min(1, rate));\n PartyConnection.packetLossFilter = filter || \"\";\n\n if (enabled && rate > 0) {\n const filterInfo = filter ? ` (filtered: \"${filter}\")` : \"\";\n console.log(`\\x1b[35m[PACKET LOSS SIMULATION]\\x1b[0m Enabled with ${(rate * 100).toFixed(1)}% loss rate${filterInfo}`);\n } else if (enabled) {\n console.log(\"\\x1b[35m[PACKET LOSS SIMULATION]\\x1b[0m Enabled but rate is 0% (no messages will be dropped)\");\n } else {\n console.log(\"\\x1b[35m[PACKET LOSS SIMULATION]\\x1b[0m Disabled\");\n }\n }\n\n static getPacketLossStatus(): { enabled: boolean; rate: number; filter: string } {\n return {\n enabled: PartyConnection.packetLossEnabled,\n rate: PartyConnection.packetLossRate,\n filter: PartyConnection.packetLossFilter,\n };\n }\n\n static configureBandwidth(enabled: boolean, kbps: number, filter?: string): void {\n PartyConnection.bandwidthEnabled = enabled;\n PartyConnection.bandwidthKbps = Math.max(1, kbps);\n PartyConnection.bandwidthFilter = filter || \"\";\n\n if (enabled && kbps > 0) {\n const filterInfo = filter ? ` (filtered: \"${filter}\")` : \"\";\n console.log(`\\x1b[35m[BANDWIDTH SIMULATION]\\x1b[0m Enabled with ${kbps} kbps bandwidth${filterInfo}`);\n } else if (enabled) {\n console.log(\"\\x1b[35m[BANDWIDTH SIMULATION]\\x1b[0m Enabled but bandwidth is 0 kbps (no delay will be applied)\");\n } else {\n console.log(\"\\x1b[35m[BANDWIDTH SIMULATION]\\x1b[0m Disabled\");\n }\n }\n\n static getBandwidthStatus(): { enabled: boolean; kbps: number; filter: string } {\n return {\n enabled: PartyConnection.bandwidthEnabled,\n kbps: PartyConnection.bandwidthKbps,\n filter: PartyConnection.bandwidthFilter,\n };\n }\n\n static configureLatency(enabled: boolean, ms: number, filter?: string): void {\n PartyConnection.latencyEnabled = enabled;\n PartyConnection.latencyMs = Math.max(0, ms);\n PartyConnection.latencyFilter = filter || \"\";\n\n if (enabled && ms > 0) {\n const filterInfo = filter ? ` (filtered: \"${filter}\")` : \"\";\n console.log(`\\x1b[35m[LATENCY SIMULATION]\\x1b[0m Enabled with ${ms}ms fixed latency${filterInfo}`);\n } else if (enabled) {\n console.log(\"\\x1b[35m[LATENCY SIMULATION]\\x1b[0m Enabled but latency is 0ms (no delay will be applied)\");\n } else {\n console.log(\"\\x1b[35m[LATENCY SIMULATION]\\x1b[0m Disabled\");\n }\n }\n\n static getLatencyStatus(): { enabled: boolean; ms: number; filter: string } {\n return {\n enabled: PartyConnection.latencyEnabled,\n ms: PartyConnection.latencyMs,\n filter: PartyConnection.latencyFilter,\n };\n }\n}\n\nexport function logNetworkSimulationStatus(): void {\n const packetLossStatus = PartyConnection.getPacketLossStatus();\n const bandwidthStatus = PartyConnection.getBandwidthStatus();\n const latencyStatus = PartyConnection.getLatencyStatus();\n\n if (packetLossStatus.enabled) {\n const filterInfo = packetLossStatus.filter ? ` (filter: \"${packetLossStatus.filter}\")` : \"\";\n console.log(\n `\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Packet loss simulation: ${(packetLossStatus.rate * 100).toFixed(1)}% loss rate${filterInfo}`,\n );\n } else {\n console.log(\"\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Packet loss simulation: disabled\");\n }\n\n if (bandwidthStatus.enabled) {\n const filterInfo = bandwidthStatus.filter ? ` (filter: \"${bandwidthStatus.filter}\")` : \"\";\n console.log(`\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Bandwidth simulation: ${bandwidthStatus.kbps} kbps${filterInfo}`);\n } else {\n console.log(\"\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Bandwidth simulation: disabled\");\n }\n\n if (latencyStatus.enabled) {\n const filterInfo = latencyStatus.filter ? ` (filter: \"${latencyStatus.filter}\")` : \"\";\n console.log(`\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Latency simulation: ${latencyStatus.ms}ms ping${filterInfo}`);\n } else {\n console.log(\"\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Latency simulation: disabled\");\n }\n}\n","import { PartyConnection } from \"./connection\";\n\nexport class PartyRoom {\n public id: string;\n public internalID: string;\n public env: Record<string, any> = {};\n public context: any = {};\n\n private connections = new Map<string, PartyConnection>();\n private storageData = new Map<string, any>();\n\n constructor(id: string) {\n this.id = id;\n this.internalID = `internal_${id}_${Date.now()}`;\n }\n\n async broadcast(message: any, except: string[] = []): Promise<void> {\n const data = typeof message === \"string\" ? message : JSON.stringify(message);\n const sendPromises: Promise<void>[] = [];\n\n for (const [connectionId, connection] of this.connections) {\n if (!except.includes(connectionId)) {\n sendPromises.push(connection.send(data));\n }\n }\n\n await Promise.all(sendPromises);\n }\n\n getConnection(id: string): PartyConnection | undefined {\n return this.connections.get(id);\n }\n\n getConnections(tag?: string): IterableIterator<PartyConnection> {\n void tag;\n return this.connections.values();\n }\n\n addConnection(connection: PartyConnection): void {\n this.connections.set(connection.id, connection);\n }\n\n removeConnection(connectionId: string): void {\n this.connections.delete(connectionId);\n }\n\n get storage() {\n return {\n put: async (key: string, value: any) => {\n this.storageData.set(key, value);\n },\n get: async <T = any>(key: string): Promise<T | undefined> => {\n return this.storageData.get(key) as T;\n },\n delete: async (key: string) => {\n this.storageData.delete(key);\n },\n list: async () => {\n return Array.from(this.storageData.entries());\n },\n };\n }\n}\n","import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport { PartyConnection } from \"./connection\";\nimport { createMapUpdateHeaders, resolveMapUpdateToken, updateMap } from \"./map\";\nimport { PartyRoom } from \"./room\";\nimport type {\n CreateRpgServerTransportOptions,\n HandleNodeRequestOptions,\n RpgTransportRequestLike,\n RpgTransportServer,\n RpgTransportServerConstructor,\n RpgWebSocketConnection,\n RpgWebSocketRequestLike,\n RpgWebSocketServer,\n SendMapUpdateOptions,\n} from \"./types\";\n\ntype PartiesFetchInit = {\n body?: any;\n headers?: HeadersInit | IncomingHttpHeaders | Map<string, string | undefined>;\n method?: string;\n};\n\nfunction normalizePathPrefix(path: string, fallback: string): string {\n const trimmed = (path || fallback).trim();\n if (!trimmed) {\n return fallback;\n }\n const prefixed = trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n return prefixed !== \"/\" ? prefixed.replace(/\\/+$/, \"\") : prefixed;\n}\n\nfunction hasPathPrefix(pathname: string, prefix: string): boolean {\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n}\n\nfunction prependMountedPath(pathname: string, mountedPath?: string): string {\n if (!mountedPath) {\n return pathname;\n }\n const normalizedMountedPath = normalizePathPrefix(mountedPath, \"/\");\n if (hasPathPrefix(pathname, normalizedMountedPath)) {\n return pathname;\n }\n if (pathname === \"/\") {\n return normalizedMountedPath;\n }\n return `${normalizedMountedPath}${pathname.startsWith(\"/\") ? pathname : `/${pathname}`}`.replace(/\\/{2,}/g, \"/\");\n}\n\nfunction parseHttpRoute(pathname: string, partiesPath: string): { roomId: string; requestPath: string } | null {\n if (!hasPathPrefix(pathname, partiesPath)) {\n return null;\n }\n\n const remainder = pathname.slice(partiesPath.length);\n const segments = remainder.split(\"/\").filter(Boolean);\n if (segments.length < 2) {\n return null;\n }\n\n return {\n roomId: segments[0],\n requestPath: `/${segments.slice(1).join(\"/\")}`,\n };\n}\n\nfunction parseSocketRoute(pathname: string, partiesPath: string): { roomId: string } | null {\n if (!hasPathPrefix(pathname, partiesPath)) {\n return null;\n }\n\n const remainder = pathname.slice(partiesPath.length);\n const segments = remainder.split(\"/\").filter(Boolean);\n if (segments.length < 1) {\n return null;\n }\n\n return { roomId: segments[0] };\n}\n\nfunction toHeaders(\n input?: Headers | HeadersInit | IncomingHttpHeaders | Map<string, string | undefined>,\n): Headers {\n if (!input) {\n return new Headers();\n }\n if (input instanceof Headers) {\n return new Headers(input);\n }\n if (Array.isArray(input)) {\n return new Headers(input);\n }\n if (input instanceof Map) {\n const headers = new Headers();\n for (const [key, value] of input) {\n if (typeof value !== \"undefined\") {\n headers.set(key, value);\n }\n }\n return headers;\n }\n\n const headers = new Headers();\n Object.entries(input).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (typeof value[0] !== \"undefined\") {\n headers.set(key, value[0]);\n }\n return;\n }\n if (typeof value !== \"undefined\") {\n headers.set(key, String(value));\n }\n });\n return headers;\n}\n\nfunction createRequestLike(url: string, method: string, headers: Headers, bodyText: string): RpgTransportRequestLike {\n return {\n url,\n method,\n headers,\n json: async () => {\n if (!bodyText) {\n return undefined;\n }\n return JSON.parse(bodyText);\n },\n text: async () => bodyText,\n };\n}\n\nasync function normalizeEngineResponse(result: any): Promise<Response> {\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n\n return new Response(JSON.stringify(result ?? {}), {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n}\n\nasync function sendNodeResponse(res: ServerResponse, response: Response): Promise<void> {\n res.statusCode = response.status;\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n res.end(await response.text());\n}\n\nasync function readNodeBody(req: IncomingMessage): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer | string) => {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction resolveUrlFromSocketRequest(request: RpgWebSocketRequestLike): { headers: Headers; method?: string; rawUrl: string; url: URL } {\n const headers = toHeaders(request.headers);\n const host = headers.get(\"host\") || \"localhost\";\n const rawUrl = request.url || \"/\";\n const url = new URL(rawUrl, `http://${host}`);\n return {\n headers,\n method: request.method,\n rawUrl,\n url,\n };\n}\n\nfunction createConnectionContext(url: URL, headers: Headers, method?: string): any {\n const normalizedHeaders = new Map<string, string>();\n headers.forEach((value, key) => {\n normalizedHeaders.set(key.toLowerCase(), value);\n });\n\n return {\n request: {\n headers: {\n has: (name: string) => normalizedHeaders.has(name.toLowerCase()),\n get: (name: string) => normalizedHeaders.get(name.toLowerCase()),\n entries: () => normalizedHeaders.entries(),\n keys: () => normalizedHeaders.keys(),\n values: () => normalizedHeaders.values(),\n },\n method,\n url: url.toString(),\n },\n url,\n };\n}\n\nexport class RpgServerTransport {\n private partiesPath: string;\n private readonly initializeMaps: boolean;\n private readonly mapUpdateToken: string;\n private readonly tiledBasePaths?: string[];\n private readonly rooms = new Map<string, PartyRoom>();\n private readonly servers = new Map<string, RpgTransportServer>();\n private lastKnownHost = \"\";\n\n constructor(\n private readonly serverModule: RpgTransportServerConstructor,\n options: CreateRpgServerTransportOptions = {},\n ) {\n this.initializeMaps = options.initializeMaps ?? true;\n this.mapUpdateToken = resolveMapUpdateToken(options.mapUpdateToken);\n this.partiesPath = normalizePathPrefix(options.partiesPath || \"/parties/main\", \"/parties/main\");\n this.tiledBasePaths = options.tiledBasePaths;\n }\n\n getRoom(roomId: string): PartyRoom | undefined {\n return this.rooms.get(roomId);\n }\n\n getServer(roomId: string): RpgTransportServer | undefined {\n return this.servers.get(roomId);\n }\n\n private async ensureRoomAndServer(roomId: string, host?: string): Promise<{ room: PartyRoom; rpgServer: RpgTransportServer }> {\n if (host) {\n this.lastKnownHost = host;\n }\n\n let room = this.rooms.get(roomId);\n if (!room) {\n room = new PartyRoom(roomId);\n this.rooms.set(roomId, room);\n console.log(`Created new room: ${roomId}`);\n }\n\n let rpgServer = this.servers.get(roomId);\n if (!rpgServer) {\n rpgServer = new this.serverModule(room);\n this.servers.set(roomId, rpgServer);\n console.log(`Created new server instance for room: ${roomId}`);\n\n if (typeof rpgServer.onStart === \"function\") {\n try {\n await rpgServer.onStart();\n console.log(`Server started for room: ${roomId}`);\n } catch (error) {\n console.error(`Error starting server for room ${roomId}:`, error);\n }\n }\n\n if (this.initializeMaps) {\n await updateMap(roomId, rpgServer, {\n host: host || this.lastKnownHost,\n mapUpdateToken: this.mapUpdateToken,\n tiledBasePaths: this.tiledBasePaths,\n });\n }\n }\n\n room.context.parties = this.buildPartiesContext();\n return { room, rpgServer };\n }\n\n private buildPartiesContext() {\n return {\n main: {\n get: async (targetRoomId: string) => {\n return {\n fetch: async (path: string, init?: PartiesFetchInit) => {\n const method = (init?.method || \"GET\").toUpperCase();\n const headers = toHeaders(init?.headers);\n const requestPath = path.startsWith(\"/\") ? path : `/${path}`;\n let bodyText = \"\";\n\n if (typeof init?.body === \"string\") {\n bodyText = init.body;\n } else if (typeof init?.body !== \"undefined\") {\n bodyText = JSON.stringify(init.body);\n }\n\n return this.dispatchRoomRequest(\n targetRoomId,\n createRequestLike(\n `http://localhost${this.partiesPath}/${targetRoomId}${requestPath}`,\n method,\n headers,\n bodyText,\n ),\n this.lastKnownHost,\n );\n },\n };\n },\n },\n } as any;\n }\n\n private async dispatchRoomRequest(roomId: string, requestLike: RpgTransportRequestLike, host?: string): Promise<Response> {\n const { room, rpgServer } = await this.ensureRoomAndServer(roomId, host);\n room.context.parties = this.buildPartiesContext();\n const result = await rpgServer.onRequest?.(requestLike);\n return normalizeEngineResponse(result);\n }\n\n async fetch(request: Request | string | URL, init?: RequestInit): Promise<Response> {\n const webRequest = request instanceof Request ? request : new Request(String(request), init);\n const url = new URL(webRequest.url);\n const route = parseHttpRoute(url.pathname, this.partiesPath);\n if (!route) {\n return new Response(JSON.stringify({ error: \"Not found\" }), {\n status: 404,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n const bodyText = await webRequest.text();\n return this.dispatchRoomRequest(\n route.roomId,\n createRequestLike(webRequest.url, webRequest.method.toUpperCase(), toHeaders(webRequest.headers), bodyText),\n url.host,\n );\n }\n\n async updateMap(mapId: string, payload: any, options: SendMapUpdateOptions = {}): Promise<Response> {\n const roomId = mapId.startsWith(\"map-\") ? mapId : `map-${mapId}`;\n const headers = createMapUpdateHeaders(this.mapUpdateToken, options.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return this.dispatchRoomRequest(\n roomId,\n createRequestLike(\n `http://localhost${this.partiesPath}/${roomId}/map/update`,\n \"POST\",\n headers,\n JSON.stringify(payload),\n ),\n options.host ?? this.lastKnownHost,\n );\n }\n\n async handleNodeRequest(\n req: IncomingMessage,\n res: ServerResponse,\n next?: () => void,\n options: HandleNodeRequestOptions = {},\n ): Promise<boolean> {\n try {\n const headers = toHeaders(req.headers);\n const host = headers.get(\"host\") || \"localhost\";\n const url = new URL(req.url || \"/\", `http://${host}`);\n const normalizedPathname = prependMountedPath(url.pathname, options.mountedPath);\n const normalizedUrl = new URL(url.toString());\n normalizedUrl.pathname = normalizedPathname;\n\n const route = parseHttpRoute(normalizedUrl.pathname, this.partiesPath);\n if (!route) {\n next?.();\n return false;\n }\n\n const bodyText = await readNodeBody(req);\n const response = await this.dispatchRoomRequest(\n route.roomId,\n createRequestLike(normalizedUrl.toString(), (req.method || \"GET\").toUpperCase(), headers, bodyText),\n host,\n );\n\n await sendNodeResponse(res, response);\n return true;\n } catch (error) {\n console.error(\"Error handling RPG-JS request:\", error);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n return true;\n }\n }\n\n async acceptWebSocket(ws: RpgWebSocketConnection, request: RpgWebSocketRequestLike): Promise<boolean> {\n const normalizedRequest = resolveUrlFromSocketRequest(request);\n const route = parseSocketRoute(normalizedRequest.url.pathname, this.partiesPath);\n if (!route) {\n return false;\n }\n\n try {\n console.log(`WebSocket upgrade request: ${normalizedRequest.url.pathname}`);\n\n const queryParams = Object.fromEntries(normalizedRequest.url.searchParams.entries());\n console.log(`Room: ${route.roomId}, Query params:`, queryParams);\n\n const { room, rpgServer } = await this.ensureRoomAndServer(route.roomId, normalizedRequest.url.host);\n room.context.parties = this.buildPartiesContext();\n\n const connection = new PartyConnection(ws, queryParams._pk, normalizedRequest.rawUrl);\n room.addConnection(connection);\n\n console.log(`WebSocket connection established: ${connection.id} in room: ${route.roomId}`);\n\n let isClosed = false;\n const cleanup = async (logMessage?: string, error?: Error) => {\n if (isClosed) {\n return;\n }\n isClosed = true;\n if (logMessage) {\n console.log(logMessage);\n }\n if (error) {\n console.error(\"WebSocket error:\", error);\n }\n room.removeConnection(connection.id);\n await rpgServer.onClose?.(connection as any);\n };\n\n ws.on(\"message\", async (data: Buffer | string) => {\n try {\n const rawMessage = typeof data === \"string\" ? data : data.toString();\n\n if (PartyConnection.packetLossEnabled && PartyConnection.packetLossRate > 0) {\n if (!PartyConnection.packetLossFilter || rawMessage.includes(PartyConnection.packetLossFilter)) {\n const random = Math.random();\n if (random < PartyConnection.packetLossRate) {\n console.log(\n `\\x1b[31m[PACKET LOSS]\\x1b[0m Connection ${connection.id}: Server dropped an incoming packet (${(PartyConnection.packetLossRate * 100).toFixed(1)}% loss rate)`,\n );\n console.log(`\\x1b[33m[PACKET DATA]\\x1b[0m ${rawMessage.slice(0, 100)}${rawMessage.length > 100 ? \"...\" : \"\"}`);\n return;\n }\n }\n }\n\n connection.bufferIncoming(rawMessage, async (batch: string[]) => {\n for (const message of batch) {\n await rpgServer.onMessage?.(message, connection as any);\n }\n });\n } catch (error) {\n console.error(\"Error processing WebSocket message:\", error);\n }\n });\n\n ws.on(\"close\", () => {\n void cleanup(`WebSocket connection closed: ${connection.id} from room: ${route.roomId}`);\n });\n\n ws.on(\"error\", (error: Error) => {\n void cleanup(undefined, error);\n });\n\n if (typeof rpgServer.onConnect === \"function\") {\n await rpgServer.onConnect(\n connection as any,\n createConnectionContext(normalizedRequest.url, normalizedRequest.headers, normalizedRequest.method) as any,\n );\n }\n\n await connection.send({\n type: \"connected\",\n id: connection.id,\n message: \"Connected to RPG-JS server\",\n });\n\n return true;\n } catch (error) {\n console.error(\"Error establishing WebSocket connection:\", error);\n ws.close();\n return true;\n }\n }\n\n async handleUpgrade(\n wsServer: RpgWebSocketServer,\n request: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n ): Promise<boolean> {\n const headers = toHeaders(request.headers);\n const host = headers.get(\"host\") || \"localhost\";\n const url = new URL(request.url || \"/\", `http://${host}`);\n if (!parseSocketRoute(url.pathname, this.partiesPath)) {\n return false;\n }\n\n wsServer.handleUpgrade(request, socket, head, (ws) => {\n void this.acceptWebSocket(ws, request);\n });\n\n return true;\n }\n}\n\nexport function createRpgServerTransport(\n serverModule: RpgTransportServerConstructor,\n options?: CreateRpgServerTransportOptions,\n): RpgServerTransport {\n return new RpgServerTransport(serverModule, options);\n}\n"],"names":["headers"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/node/connection.ts","../../src/node/room.ts","../../src/node/transport.ts"],"sourcesContent":["import type { RpgWebSocketConnection } from \"./types\";\n\ntype RuntimeProcess = {\n env?: Record<string, string | undefined>;\n};\n\nfunction readEnvVariable(name: string): string | undefined {\n const value = (globalThis as { process?: RuntimeProcess }).process?.env?.[name];\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport class PartyConnection {\n public id: string;\n public uri: string;\n private _state: any = {};\n private messageQueue: Array<{ message: string; timestamp: number; sequence: number }> = [];\n private isProcessingQueue = false;\n private sequenceCounter = 0;\n private incomingQueue: Array<{\n message: string;\n timestamp: number;\n processor: (messages: string[]) => Promise<void>;\n }> = [];\n private isProcessingIncomingQueue = false;\n\n public static packetLossRate = parseFloat(readEnvVariable(\"RPGJS_PACKET_LOSS_RATE\") || \"0.1\");\n public static packetLossEnabled = readEnvVariable(\"RPGJS_ENABLE_PACKET_LOSS\") === \"true\";\n public static packetLossFilter = readEnvVariable(\"RPGJS_PACKET_LOSS_FILTER\") || \"\";\n public static bandwidthEnabled = readEnvVariable(\"RPGJS_ENABLE_BANDWIDTH\") === \"true\";\n public static bandwidthKbps = parseInt(readEnvVariable(\"RPGJS_BANDWIDTH_KBPS\") || \"100\");\n public static bandwidthFilter = readEnvVariable(\"RPGJS_BANDWIDTH_FILTER\") || \"\";\n public static latencyEnabled = readEnvVariable(\"RPGJS_ENABLE_LATENCY\") === \"true\";\n public static latencyMs = parseInt(readEnvVariable(\"RPGJS_LATENCY_MS\") || \"50\");\n public static latencyFilter = readEnvVariable(\"RPGJS_LATENCY_FILTER\") || \"\";\n\n constructor(private ws: RpgWebSocketConnection, id?: string, uri?: string) {\n this.id = id || this.generateId();\n this.uri = uri || \"\";\n }\n\n private generateId(): string {\n return `conn_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n async send(data: any): Promise<void> {\n if (this.ws.readyState !== 1) {\n return;\n }\n\n const message = typeof data === \"string\" ? data : JSON.stringify(data);\n const timestamp = Date.now();\n const sequence = ++this.sequenceCounter;\n\n this.messageQueue.push({ message, timestamp, sequence });\n\n if (!this.isProcessingQueue) {\n void this.processMessageQueue();\n }\n }\n\n private async processMessageQueue(): Promise<void> {\n if (this.isProcessingQueue) {\n return;\n }\n this.isProcessingQueue = true;\n\n while (this.messageQueue.length > 0) {\n const queueItem = this.messageQueue.shift()!;\n\n if (this.shouldApplyLatency(queueItem.message)) {\n await this.waitUntil(queueItem.timestamp + PartyConnection.latencyMs);\n }\n\n if (PartyConnection.bandwidthEnabled && PartyConnection.bandwidthKbps > 0) {\n if (!PartyConnection.bandwidthFilter || queueItem.message.includes(PartyConnection.bandwidthFilter)) {\n const messageSizeBits = queueItem.message.length * 8;\n const transmissionTimeMs = (messageSizeBits / (PartyConnection.bandwidthKbps * 1000)) * 1000;\n const bandwidthDelayMs = Math.max(transmissionTimeMs, 10);\n console.log(\n `\\x1b[34m[BANDWIDTH SIMULATION]\\x1b[0m Connection ${this.id}: Message #${queueItem.sequence} transmission time: ${bandwidthDelayMs.toFixed(1)}ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, bandwidthDelayMs));\n }\n }\n\n this.ws.send(queueItem.message);\n }\n\n this.isProcessingQueue = false;\n }\n\n private shouldApplyLatency(message: string): boolean {\n if (!PartyConnection.latencyEnabled || PartyConnection.latencyMs <= 0) {\n return false;\n }\n if (!PartyConnection.latencyFilter) {\n return true;\n }\n return message.includes(PartyConnection.latencyFilter);\n }\n\n private async waitUntil(targetTimestamp: number): Promise<void> {\n const delayMs = targetTimestamp - Date.now();\n if (delayMs <= 0) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n close(): void {\n if (this.ws.readyState === 1) {\n this.ws.close();\n }\n }\n\n setState(value: any): void {\n this._state = value;\n }\n\n get state(): any {\n return this._state;\n }\n\n bufferIncoming(message: string, processor: (messages: string[]) => Promise<void>): void {\n this.incomingQueue.push({\n message,\n timestamp: Date.now(),\n processor,\n });\n\n if (!this.isProcessingIncomingQueue) {\n void this.processIncomingQueue();\n }\n }\n\n private async processIncomingQueue(): Promise<void> {\n if (this.isProcessingIncomingQueue) {\n return;\n }\n this.isProcessingIncomingQueue = true;\n\n while (this.incomingQueue.length > 0) {\n const item = this.incomingQueue.shift()!;\n if (this.shouldApplyLatency(item.message)) {\n await this.waitUntil(item.timestamp + PartyConnection.latencyMs);\n }\n try {\n await item.processor([item.message]);\n } catch (err) {\n console.error(\"Error processing incoming message:\", err);\n }\n }\n\n this.isProcessingIncomingQueue = false;\n }\n\n static configurePacketLoss(enabled: boolean, rate: number, filter?: string): void {\n PartyConnection.packetLossEnabled = enabled;\n PartyConnection.packetLossRate = Math.max(0, Math.min(1, rate));\n PartyConnection.packetLossFilter = filter || \"\";\n\n if (enabled && rate > 0) {\n const filterInfo = filter ? ` (filtered: \"${filter}\")` : \"\";\n console.log(`\\x1b[35m[PACKET LOSS SIMULATION]\\x1b[0m Enabled with ${(rate * 100).toFixed(1)}% loss rate${filterInfo}`);\n } else if (enabled) {\n console.log(\"\\x1b[35m[PACKET LOSS SIMULATION]\\x1b[0m Enabled but rate is 0% (no messages will be dropped)\");\n } else {\n console.log(\"\\x1b[35m[PACKET LOSS SIMULATION]\\x1b[0m Disabled\");\n }\n }\n\n static getPacketLossStatus(): { enabled: boolean; rate: number; filter: string } {\n return {\n enabled: PartyConnection.packetLossEnabled,\n rate: PartyConnection.packetLossRate,\n filter: PartyConnection.packetLossFilter,\n };\n }\n\n static configureBandwidth(enabled: boolean, kbps: number, filter?: string): void {\n PartyConnection.bandwidthEnabled = enabled;\n PartyConnection.bandwidthKbps = Math.max(1, kbps);\n PartyConnection.bandwidthFilter = filter || \"\";\n\n if (enabled && kbps > 0) {\n const filterInfo = filter ? ` (filtered: \"${filter}\")` : \"\";\n console.log(`\\x1b[35m[BANDWIDTH SIMULATION]\\x1b[0m Enabled with ${kbps} kbps bandwidth${filterInfo}`);\n } else if (enabled) {\n console.log(\"\\x1b[35m[BANDWIDTH SIMULATION]\\x1b[0m Enabled but bandwidth is 0 kbps (no delay will be applied)\");\n } else {\n console.log(\"\\x1b[35m[BANDWIDTH SIMULATION]\\x1b[0m Disabled\");\n }\n }\n\n static getBandwidthStatus(): { enabled: boolean; kbps: number; filter: string } {\n return {\n enabled: PartyConnection.bandwidthEnabled,\n kbps: PartyConnection.bandwidthKbps,\n filter: PartyConnection.bandwidthFilter,\n };\n }\n\n static configureLatency(enabled: boolean, ms: number, filter?: string): void {\n PartyConnection.latencyEnabled = enabled;\n PartyConnection.latencyMs = Math.max(0, ms);\n PartyConnection.latencyFilter = filter || \"\";\n\n if (enabled && ms > 0) {\n const filterInfo = filter ? ` (filtered: \"${filter}\")` : \"\";\n console.log(`\\x1b[35m[LATENCY SIMULATION]\\x1b[0m Enabled with ${ms}ms fixed latency${filterInfo}`);\n } else if (enabled) {\n console.log(\"\\x1b[35m[LATENCY SIMULATION]\\x1b[0m Enabled but latency is 0ms (no delay will be applied)\");\n } else {\n console.log(\"\\x1b[35m[LATENCY SIMULATION]\\x1b[0m Disabled\");\n }\n }\n\n static getLatencyStatus(): { enabled: boolean; ms: number; filter: string } {\n return {\n enabled: PartyConnection.latencyEnabled,\n ms: PartyConnection.latencyMs,\n filter: PartyConnection.latencyFilter,\n };\n }\n}\n\nexport function logNetworkSimulationStatus(): void {\n const packetLossStatus = PartyConnection.getPacketLossStatus();\n const bandwidthStatus = PartyConnection.getBandwidthStatus();\n const latencyStatus = PartyConnection.getLatencyStatus();\n\n if (packetLossStatus.enabled) {\n const filterInfo = packetLossStatus.filter ? ` (filter: \"${packetLossStatus.filter}\")` : \"\";\n console.log(\n `\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Packet loss simulation: ${(packetLossStatus.rate * 100).toFixed(1)}% loss rate${filterInfo}`,\n );\n } else {\n console.log(\"\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Packet loss simulation: disabled\");\n }\n\n if (bandwidthStatus.enabled) {\n const filterInfo = bandwidthStatus.filter ? ` (filter: \"${bandwidthStatus.filter}\")` : \"\";\n console.log(`\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Bandwidth simulation: ${bandwidthStatus.kbps} kbps${filterInfo}`);\n } else {\n console.log(\"\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Bandwidth simulation: disabled\");\n }\n\n if (latencyStatus.enabled) {\n const filterInfo = latencyStatus.filter ? ` (filter: \"${latencyStatus.filter}\")` : \"\";\n console.log(`\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Latency simulation: ${latencyStatus.ms}ms ping${filterInfo}`);\n } else {\n console.log(\"\\x1b[36m[NETWORK SIMULATION]\\x1b[0m Latency simulation: disabled\");\n }\n}\n","import { PartyConnection } from \"./connection\";\n\nexport class PartyRoom {\n public id: string;\n public internalID: string;\n public env: Record<string, any> = {};\n public context: any = {};\n\n private connections = new Map<string, PartyConnection>();\n private storageData = new Map<string, any>();\n\n constructor(id: string) {\n this.id = id;\n this.internalID = `internal_${id}_${Date.now()}`;\n }\n\n async broadcast(message: any, except: string[] = []): Promise<void> {\n const data = typeof message === \"string\" ? message : JSON.stringify(message);\n const sendPromises: Promise<void>[] = [];\n\n for (const [connectionId, connection] of this.connections) {\n if (!except.includes(connectionId)) {\n sendPromises.push(connection.send(data));\n }\n }\n\n await Promise.all(sendPromises);\n }\n\n getConnection(id: string): PartyConnection | undefined {\n return this.connections.get(id);\n }\n\n getConnections(tag?: string): IterableIterator<PartyConnection> {\n void tag;\n return this.connections.values();\n }\n\n addConnection(connection: PartyConnection): void {\n this.connections.set(connection.id, connection);\n }\n\n removeConnection(connectionId: string): void {\n this.connections.delete(connectionId);\n }\n\n get storage() {\n return {\n put: async (key: string, value: any) => {\n this.storageData.set(key, value);\n },\n get: async <T = any>(key: string): Promise<T | undefined> => {\n return this.storageData.get(key) as T;\n },\n delete: async (key: string) => {\n this.storageData.delete(key);\n },\n list: async () => {\n return Array.from(this.storageData.entries());\n },\n };\n }\n}\n","import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Duplex } from \"node:stream\";\nimport { injector } from \"@signe/di\";\nimport { context as serverContext } from \"../core/context\";\nimport { setInject } from \"../core/inject\";\nimport { provideServerModules } from \"../module\";\nimport { PartyConnection } from \"./connection\";\nimport { createMapUpdateHeaders, resolveMapUpdateToken, updateMap } from \"./map\";\nimport { PartyRoom } from \"./room\";\nimport type {\n CreateRpgServerTransportOptions,\n HandleNodeRequestOptions,\n RpgTransportRequestLike,\n RpgTransportServer,\n RpgTransportServerConstructor,\n RpgWebSocketConnection,\n RpgWebSocketRequestLike,\n RpgWebSocketServer,\n SendMapUpdateOptions,\n} from \"./types\";\n\ntype PartiesFetchInit = {\n body?: any;\n headers?: HeadersInit | IncomingHttpHeaders | Map<string, string | undefined>;\n method?: string;\n};\n\nfunction normalizePathPrefix(path: string, fallback: string): string {\n const trimmed = (path || fallback).trim();\n if (!trimmed) {\n return fallback;\n }\n const prefixed = trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n return prefixed !== \"/\" ? prefixed.replace(/\\/+$/, \"\") : prefixed;\n}\n\nfunction hasPathPrefix(pathname: string, prefix: string): boolean {\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n}\n\nfunction prependMountedPath(pathname: string, mountedPath?: string): string {\n if (!mountedPath) {\n return pathname;\n }\n const normalizedMountedPath = normalizePathPrefix(mountedPath, \"/\");\n if (hasPathPrefix(pathname, normalizedMountedPath)) {\n return pathname;\n }\n if (pathname === \"/\") {\n return normalizedMountedPath;\n }\n return `${normalizedMountedPath}${pathname.startsWith(\"/\") ? pathname : `/${pathname}`}`.replace(/\\/{2,}/g, \"/\");\n}\n\nfunction parseHttpRoute(pathname: string, partiesPath: string): { roomId: string; requestPath: string } | null {\n if (!hasPathPrefix(pathname, partiesPath)) {\n return null;\n }\n\n const remainder = pathname.slice(partiesPath.length);\n const segments = remainder.split(\"/\").filter(Boolean);\n if (segments.length < 2) {\n return null;\n }\n\n return {\n roomId: segments[0],\n requestPath: `/${segments.slice(1).join(\"/\")}`,\n };\n}\n\nfunction parseSocketRoute(pathname: string, partiesPath: string): { roomId: string } | null {\n if (!hasPathPrefix(pathname, partiesPath)) {\n return null;\n }\n\n const remainder = pathname.slice(partiesPath.length);\n const segments = remainder.split(\"/\").filter(Boolean);\n if (segments.length < 1) {\n return null;\n }\n\n return { roomId: segments[0] };\n}\n\nfunction toHeaders(\n input?: Headers | HeadersInit | IncomingHttpHeaders | Map<string, string | undefined>,\n): Headers {\n if (!input) {\n return new Headers();\n }\n if (input instanceof Headers) {\n return new Headers(input);\n }\n if (Array.isArray(input)) {\n return new Headers(input);\n }\n if (input instanceof Map) {\n const headers = new Headers();\n for (const [key, value] of input) {\n if (typeof value !== \"undefined\") {\n headers.set(key, value);\n }\n }\n return headers;\n }\n\n const headers = new Headers();\n Object.entries(input).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n if (typeof value[0] !== \"undefined\") {\n headers.set(key, value[0]);\n }\n return;\n }\n if (typeof value !== \"undefined\") {\n headers.set(key, String(value));\n }\n });\n return headers;\n}\n\nfunction createRequestLike(url: string, method: string, headers: Headers, bodyText: string): RpgTransportRequestLike {\n return {\n url,\n method,\n headers,\n json: async () => {\n if (!bodyText) {\n return undefined;\n }\n return JSON.parse(bodyText);\n },\n text: async () => bodyText,\n };\n}\n\nasync function normalizeEngineResponse(result: any): Promise<Response> {\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n\n return new Response(JSON.stringify(result ?? {}), {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n}\n\nasync function sendNodeResponse(res: ServerResponse, response: Response): Promise<void> {\n res.statusCode = response.status;\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n res.end(await response.text());\n}\n\nasync function readNodeBody(req: IncomingMessage): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer | string) => {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction resolveUrlFromSocketRequest(request: RpgWebSocketRequestLike): { headers: Headers; method?: string; rawUrl: string; url: URL } {\n const headers = toHeaders(request.headers);\n const host = headers.get(\"host\") || \"localhost\";\n const rawUrl = request.url || \"/\";\n const url = new URL(rawUrl, `http://${host}`);\n return {\n headers,\n method: request.method,\n rawUrl,\n url,\n };\n}\n\nfunction createConnectionContext(url: URL, headers: Headers, method?: string): any {\n const normalizedHeaders = new Map<string, string>();\n headers.forEach((value, key) => {\n normalizedHeaders.set(key.toLowerCase(), value);\n });\n\n return {\n request: {\n headers: {\n has: (name: string) => normalizedHeaders.has(name.toLowerCase()),\n get: (name: string) => normalizedHeaders.get(name.toLowerCase()),\n entries: () => normalizedHeaders.entries(),\n keys: () => normalizedHeaders.keys(),\n values: () => normalizedHeaders.values(),\n },\n method,\n url: url.toString(),\n },\n url,\n };\n}\n\nexport class RpgServerTransport {\n private serverContextInitialized = false;\n private partiesPath: string;\n private readonly initializeMaps: boolean;\n private readonly mapUpdateToken: string;\n private readonly tiledBasePaths?: string[];\n private readonly rooms = new Map<string, PartyRoom>();\n private readonly servers = new Map<string, RpgTransportServer>();\n private lastKnownHost = \"\";\n\n constructor(\n private readonly serverModule: RpgTransportServerConstructor,\n options: CreateRpgServerTransportOptions = {},\n ) {\n this.initializeMaps = options.initializeMaps ?? true;\n this.mapUpdateToken = resolveMapUpdateToken(options.mapUpdateToken);\n this.partiesPath = normalizePathPrefix(options.partiesPath || \"/parties/main\", \"/parties/main\");\n this.tiledBasePaths = options.tiledBasePaths;\n }\n\n private async ensureServerContext(): Promise<void> {\n if (this.serverContextInitialized) {\n return;\n }\n\n setInject(serverContext);\n await injector(serverContext, [provideServerModules([])]);\n this.serverContextInitialized = true;\n }\n\n getRoom(roomId: string): PartyRoom | undefined {\n return this.rooms.get(roomId);\n }\n\n getServer(roomId: string): RpgTransportServer | undefined {\n return this.servers.get(roomId);\n }\n\n private async ensureRoomAndServer(roomId: string, host?: string): Promise<{ room: PartyRoom; rpgServer: RpgTransportServer }> {\n if (host) {\n this.lastKnownHost = host;\n }\n\n let room = this.rooms.get(roomId);\n if (!room) {\n room = new PartyRoom(roomId);\n this.rooms.set(roomId, room);\n console.log(`Created new room: ${roomId}`);\n }\n\n let rpgServer = this.servers.get(roomId);\n if (!rpgServer) {\n await this.ensureServerContext();\n rpgServer = new this.serverModule(room);\n this.servers.set(roomId, rpgServer);\n console.log(`Created new server instance for room: ${roomId}`);\n\n if (typeof rpgServer.onStart === \"function\") {\n try {\n await rpgServer.onStart();\n console.log(`Server started for room: ${roomId}`);\n } catch (error) {\n console.error(`Error starting server for room ${roomId}:`, error);\n }\n }\n\n if (this.initializeMaps) {\n await updateMap(roomId, rpgServer, {\n host: host || this.lastKnownHost,\n mapUpdateToken: this.mapUpdateToken,\n tiledBasePaths: this.tiledBasePaths,\n });\n }\n }\n\n room.context.parties = this.buildPartiesContext();\n return { room, rpgServer };\n }\n\n private buildPartiesContext() {\n return {\n main: {\n get: async (targetRoomId: string) => {\n return {\n fetch: async (path: string, init?: PartiesFetchInit) => {\n const method = (init?.method || \"GET\").toUpperCase();\n const headers = toHeaders(init?.headers);\n const requestPath = path.startsWith(\"/\") ? path : `/${path}`;\n let bodyText = \"\";\n\n if (typeof init?.body === \"string\") {\n bodyText = init.body;\n } else if (typeof init?.body !== \"undefined\") {\n bodyText = JSON.stringify(init.body);\n }\n\n return this.dispatchRoomRequest(\n targetRoomId,\n createRequestLike(\n `http://localhost${this.partiesPath}/${targetRoomId}${requestPath}`,\n method,\n headers,\n bodyText,\n ),\n this.lastKnownHost,\n );\n },\n };\n },\n },\n } as any;\n }\n\n private async dispatchRoomRequest(roomId: string, requestLike: RpgTransportRequestLike, host?: string): Promise<Response> {\n const { room, rpgServer } = await this.ensureRoomAndServer(roomId, host);\n room.context.parties = this.buildPartiesContext();\n const result = await rpgServer.onRequest?.(requestLike);\n return normalizeEngineResponse(result);\n }\n\n async fetch(request: Request | string | URL, init?: RequestInit): Promise<Response> {\n const webRequest = request instanceof Request ? request : new Request(String(request), init);\n const url = new URL(webRequest.url);\n const route = parseHttpRoute(url.pathname, this.partiesPath);\n if (!route) {\n return new Response(JSON.stringify({ error: \"Not found\" }), {\n status: 404,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n const bodyText = await webRequest.text();\n return this.dispatchRoomRequest(\n route.roomId,\n createRequestLike(webRequest.url, webRequest.method.toUpperCase(), toHeaders(webRequest.headers), bodyText),\n url.host,\n );\n }\n\n async updateMap(mapId: string, payload: any, options: SendMapUpdateOptions = {}): Promise<Response> {\n const roomId = mapId.startsWith(\"map-\") ? mapId : `map-${mapId}`;\n const headers = createMapUpdateHeaders(this.mapUpdateToken, options.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return this.dispatchRoomRequest(\n roomId,\n createRequestLike(\n `http://localhost${this.partiesPath}/${roomId}/map/update`,\n \"POST\",\n headers,\n JSON.stringify(payload),\n ),\n options.host ?? this.lastKnownHost,\n );\n }\n\n async handleNodeRequest(\n req: IncomingMessage,\n res: ServerResponse,\n next?: () => void,\n options: HandleNodeRequestOptions = {},\n ): Promise<boolean> {\n try {\n const headers = toHeaders(req.headers);\n const host = headers.get(\"host\") || \"localhost\";\n const url = new URL(req.url || \"/\", `http://${host}`);\n const normalizedPathname = prependMountedPath(url.pathname, options.mountedPath);\n const normalizedUrl = new URL(url.toString());\n normalizedUrl.pathname = normalizedPathname;\n\n const route = parseHttpRoute(normalizedUrl.pathname, this.partiesPath);\n if (!route) {\n next?.();\n return false;\n }\n\n const bodyText = await readNodeBody(req);\n const response = await this.dispatchRoomRequest(\n route.roomId,\n createRequestLike(normalizedUrl.toString(), (req.method || \"GET\").toUpperCase(), headers, bodyText),\n host,\n );\n\n await sendNodeResponse(res, response);\n return true;\n } catch (error) {\n console.error(\"Error handling RPG-JS request:\", error);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n return true;\n }\n }\n\n async acceptWebSocket(ws: RpgWebSocketConnection, request: RpgWebSocketRequestLike): Promise<boolean> {\n const normalizedRequest = resolveUrlFromSocketRequest(request);\n const route = parseSocketRoute(normalizedRequest.url.pathname, this.partiesPath);\n if (!route) {\n return false;\n }\n\n try {\n console.log(`WebSocket upgrade request: ${normalizedRequest.url.pathname}`);\n\n const queryParams = Object.fromEntries(normalizedRequest.url.searchParams.entries());\n console.log(`Room: ${route.roomId}, Query params:`, queryParams);\n\n const { room, rpgServer } = await this.ensureRoomAndServer(route.roomId, normalizedRequest.url.host);\n room.context.parties = this.buildPartiesContext();\n\n const connection = new PartyConnection(ws, queryParams._pk, normalizedRequest.rawUrl);\n room.addConnection(connection);\n\n console.log(`WebSocket connection established: ${connection.id} in room: ${route.roomId}`);\n\n let isClosed = false;\n const cleanup = async (logMessage?: string, error?: Error) => {\n if (isClosed) {\n return;\n }\n isClosed = true;\n if (logMessage) {\n console.log(logMessage);\n }\n if (error) {\n console.error(\"WebSocket error:\", error);\n }\n room.removeConnection(connection.id);\n await rpgServer.onClose?.(connection as any);\n };\n\n ws.on(\"message\", async (data: Buffer | string) => {\n try {\n const rawMessage = typeof data === \"string\" ? data : data.toString();\n\n if (PartyConnection.packetLossEnabled && PartyConnection.packetLossRate > 0) {\n if (!PartyConnection.packetLossFilter || rawMessage.includes(PartyConnection.packetLossFilter)) {\n const random = Math.random();\n if (random < PartyConnection.packetLossRate) {\n console.log(\n `\\x1b[31m[PACKET LOSS]\\x1b[0m Connection ${connection.id}: Server dropped an incoming packet (${(PartyConnection.packetLossRate * 100).toFixed(1)}% loss rate)`,\n );\n console.log(`\\x1b[33m[PACKET DATA]\\x1b[0m ${rawMessage.slice(0, 100)}${rawMessage.length > 100 ? \"...\" : \"\"}`);\n return;\n }\n }\n }\n\n connection.bufferIncoming(rawMessage, async (batch: string[]) => {\n for (const message of batch) {\n await rpgServer.onMessage?.(message, connection as any);\n }\n });\n } catch (error) {\n console.error(\"Error processing WebSocket message:\", error);\n }\n });\n\n ws.on(\"close\", () => {\n void cleanup(`WebSocket connection closed: ${connection.id} from room: ${route.roomId}`);\n });\n\n ws.on(\"error\", (error: Error) => {\n void cleanup(undefined, error);\n });\n\n if (typeof rpgServer.onConnect === \"function\") {\n await rpgServer.onConnect(\n connection as any,\n createConnectionContext(normalizedRequest.url, normalizedRequest.headers, normalizedRequest.method) as any,\n );\n }\n\n await connection.send({\n type: \"connected\",\n id: connection.id,\n message: \"Connected to RPG-JS server\",\n });\n\n return true;\n } catch (error) {\n console.error(\"Error establishing WebSocket connection:\", error);\n ws.close();\n return true;\n }\n }\n\n async handleUpgrade(\n wsServer: RpgWebSocketServer,\n request: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n ): Promise<boolean> {\n const headers = toHeaders(request.headers);\n const host = headers.get(\"host\") || \"localhost\";\n const url = new URL(request.url || \"/\", `http://${host}`);\n if (!parseSocketRoute(url.pathname, this.partiesPath)) {\n return false;\n }\n\n wsServer.handleUpgrade(request, socket, head, (ws) => {\n void this.acceptWebSocket(ws, request);\n });\n\n return true;\n }\n}\n\nexport function createRpgServerTransport(\n serverModule: RpgTransportServerConstructor,\n options?: CreateRpgServerTransportOptions,\n): RpgServerTransport {\n return new RpgServerTransport(serverModule, options);\n}\n"],"names":["headers","serverContext"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { PartyRoom } from './room';
4
4
  import { CreateRpgServerTransportOptions, HandleNodeRequestOptions, RpgTransportServer, RpgTransportServerConstructor, RpgWebSocketConnection, RpgWebSocketRequestLike, RpgWebSocketServer, SendMapUpdateOptions } from './types';
5
5
  export declare class RpgServerTransport {
6
6
  private readonly serverModule;
7
+ private serverContextInitialized;
7
8
  private partiesPath;
8
9
  private readonly initializeMaps;
9
10
  private readonly mapUpdateToken;
@@ -12,6 +13,7 @@ export declare class RpgServerTransport {
12
13
  private readonly servers;
13
14
  private lastKnownHost;
14
15
  constructor(serverModule: RpgTransportServerConstructor, options?: CreateRpgServerTransportOptions);
16
+ private ensureServerContext;
15
17
  getRoom(roomId: string): PartyRoom | undefined;
16
18
  getServer(roomId: string): RpgTransportServer | undefined;
17
19
  private ensureRoomAndServer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpgjs/server",
3
- "version": "5.0.0-alpha.43",
3
+ "version": "5.0.0-alpha.44",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -22,9 +22,9 @@
22
22
  "description": "",
23
23
  "dependencies": {
24
24
  "@canvasengine/tiled": "2.0.0-beta.54",
25
- "@rpgjs/common": "5.0.0-alpha.43",
26
- "@rpgjs/physic": "5.0.0-alpha.43",
27
- "@rpgjs/testing": "5.0.0-alpha.43",
25
+ "@rpgjs/common": "5.0.0-alpha.44",
26
+ "@rpgjs/physic": "5.0.0-alpha.44",
27
+ "@rpgjs/testing": "5.0.0-alpha.44",
28
28
  "@rpgjs/database": "^4.3.0",
29
29
  "@signe/di": "^2.8.3",
30
30
  "@signe/reactive": "^2.8.3",
@@ -1149,6 +1149,14 @@ export function WithMoveManager<TBase extends PlayerCtor>(Base: TBase) {
1149
1149
 
1150
1150
  moveRoutes(routes: Routes, options?: MoveRoutesOptions): Promise<boolean> {
1151
1151
  const player = this as unknown as PlayerWithMixins;
1152
+ const selfAny = this as any;
1153
+ const routeSequence = (selfAny.__moveRouteSequence__ ?? 0) + 1;
1154
+ selfAny.__moveRouteSequence__ = routeSequence;
1155
+
1156
+ if (this._finishRoute) {
1157
+ this._finishRoute(false);
1158
+ this._finishRoute = null;
1159
+ }
1152
1160
 
1153
1161
  // Break any existing route movement
1154
1162
  this.clearMovements();
@@ -1175,6 +1183,11 @@ export function WithMoveManager<TBase extends PlayerCtor>(Base: TBase) {
1175
1183
  // Note: We keep promises in the routes array and handle them in the strategy
1176
1184
  const finalRoutes = this.flattenRoutes(processedRoutes);
1177
1185
 
1186
+ if (selfAny.__moveRouteSequence__ !== routeSequence) {
1187
+ resolve(false);
1188
+ return;
1189
+ }
1190
+
1178
1191
  // Create a movement strategy that handles all routes
1179
1192
  class RouteMovementStrategy implements MovementStrategy {
1180
1193
  private routeIndex = 0;
@@ -1441,6 +1454,7 @@ export function WithMoveManager<TBase extends PlayerCtor>(Base: TBase) {
1441
1454
  // This ensures we match the test expectations which compare player.x()
1442
1455
  const currentTopLeftX = this.player.x();
1443
1456
  const currentTopLeftY = this.player.y()
1457
+ const currentMap = this.player.getCurrentMap() as any;
1444
1458
 
1445
1459
  // Calculate direction and distance using top-left position if available
1446
1460
  let dx: number, dy: number, distance: number;
@@ -1448,9 +1462,12 @@ export function WithMoveManager<TBase extends PlayerCtor>(Base: TBase) {
1448
1462
  dx = this.currentTargetTopLeft.x - currentTopLeftX;
1449
1463
  dy = this.currentTargetTopLeft.y - currentTopLeftY;
1450
1464
  distance = Math.hypot(dx, dy);
1465
+ const arrivalThreshold = Math.max(this.tolerance, this.player.speed());
1466
+
1467
+ // Snap to the target when the physics step overshoots the discrete route distance.
1468
+ if (distance <= arrivalThreshold) {
1469
+ currentMap?.setBodyPosition?.(this.player.id, this.currentTargetTopLeft.x, this.currentTargetTopLeft.y, "top-left");
1451
1470
 
1452
- // Check if we've reached the target (using top-left position)
1453
- if (distance <= this.tolerance) {
1454
1471
  // Target reached, wait for frequency before processing next route
1455
1472
  this.debugLog(`TARGET reached at (${currentTopLeftX.toFixed(1)}, ${currentTopLeftY.toFixed(1)})`);
1456
1473
  this.currentTarget = null;
@@ -1485,9 +1502,13 @@ export function WithMoveManager<TBase extends PlayerCtor>(Base: TBase) {
1485
1502
  dx = this.currentTarget.x - currentPosition.x;
1486
1503
  dy = this.currentTarget.y - currentPosition.y;
1487
1504
  distance = Math.hypot(dx, dy);
1505
+ const arrivalThreshold = Math.max(this.tolerance, this.player.speed());
1488
1506
 
1489
1507
  // Check if we've reached the target (using center position as fallback)
1490
- if (distance <= this.tolerance) {
1508
+ if (distance <= arrivalThreshold) {
1509
+ entity.position.set(this.currentTarget.x, this.currentTarget.y);
1510
+ entity.notifyPositionChange?.();
1511
+
1491
1512
  // Target reached, wait for frequency before processing next route
1492
1513
  this.currentTarget = null;
1493
1514
  this.currentTargetTopLeft = null;
@@ -1603,7 +1624,7 @@ export function WithMoveManager<TBase extends PlayerCtor>(Base: TBase) {
1603
1624
  }
1604
1625
 
1605
1626
  // Get speed scalar from map (default 50 if not found)
1606
- const map = this.player.getCurrentMap() as any;
1627
+ const map = currentMap;
1607
1628
  const speedScalar = map?.speedScalar ?? 50;
1608
1629
 
1609
1630
  // Calculate direction and speed
@@ -10,6 +10,13 @@ export type ExpCurve = {
10
10
  accelerationB: number;
11
11
  };
12
12
 
13
+ export type ParameterCurve = {
14
+ start: number;
15
+ end: number;
16
+ };
17
+
18
+ export type ParameterValue = number | ParameterCurve;
19
+
13
20
  const DEFAULT_EXP_CURVE: ExpCurve = {
14
21
  basis: 30,
15
22
  extra: 20,
@@ -36,6 +43,31 @@ function normalizeExpCurve(value: unknown): ExpCurve {
36
43
  };
37
44
  }
38
45
 
46
+ function normalizeParameterCurve(value: unknown): ParameterCurve {
47
+ if (typeof value === "number") {
48
+ const normalized = toValidNumber(value, 0);
49
+ return {
50
+ start: normalized,
51
+ end: normalized
52
+ };
53
+ }
54
+
55
+ if (!isObject(value)) {
56
+ return {
57
+ start: 0,
58
+ end: 0
59
+ };
60
+ }
61
+
62
+ const start = toValidNumber(value.start, 0);
63
+ const end = toValidNumber(value.end, start);
64
+
65
+ return {
66
+ start,
67
+ end
68
+ };
69
+ }
70
+
39
71
  /**
40
72
  * Interface for Parameter Manager functionality
41
73
  *
@@ -267,6 +299,16 @@ export interface IParameterManager {
267
299
  */
268
300
  parameters: { [key: string]: { start: number, end: number } };
269
301
 
302
+ /**
303
+ * Set a parameter with either a fixed value or a level curve
304
+ *
305
+ * A numeric value is stored as a fixed parameter where `start === end`.
306
+ *
307
+ * @param name - Parameter name
308
+ * @param value - Fixed value or parameter curve
309
+ */
310
+ setParameter(name: string, value: ParameterValue): void;
311
+
270
312
  /**
271
313
  * Get the value of a specific parameter by name
272
314
  *
@@ -441,6 +483,8 @@ export function WithParameterManager<TBase extends PlayerCtor>(Base: TBase) {
441
483
  }
442
484
  }>({}) as any, '_parametersSignal', { persist: true }, this as any)
443
485
 
486
+ private _paramProxy: { [key: string]: number } | null = null
487
+
444
488
  /**
445
489
  * Computed signal for all parameter values
446
490
  *
@@ -755,7 +799,46 @@ export function WithParameterManager<TBase extends PlayerCtor>(Base: TBase) {
755
799
  * @memberof ParameterManager
756
800
  * */
757
801
  get param() {
758
- return this._param()
802
+ if (!this._paramProxy) {
803
+ this._paramProxy = new Proxy({}, {
804
+ get: (_target, property) => {
805
+ if (typeof property !== 'string') {
806
+ return undefined
807
+ }
808
+ return this._param()[property]
809
+ },
810
+ set: (_target, property, value) => {
811
+ if (typeof property !== 'string') {
812
+ return false
813
+ }
814
+ this.setParameter(property, value as ParameterValue)
815
+ return true
816
+ },
817
+ has: (_target, property) => {
818
+ if (typeof property !== 'string') {
819
+ return false
820
+ }
821
+ return property in this._param()
822
+ },
823
+ ownKeys: () => Reflect.ownKeys(this._param()),
824
+ getOwnPropertyDescriptor: (_target, property) => {
825
+ if (typeof property !== 'string') {
826
+ return undefined
827
+ }
828
+ const parameters = this._param()
829
+ if (!(property in parameters)) {
830
+ return undefined
831
+ }
832
+ return {
833
+ configurable: true,
834
+ enumerable: true,
835
+ writable: true,
836
+ value: parameters[property]
837
+ }
838
+ }
839
+ }) as { [key: string]: number }
840
+ }
841
+ return this._paramProxy
759
842
  }
760
843
 
761
844
  get paramsModifier() {
@@ -833,7 +916,17 @@ export function WithParameterManager<TBase extends PlayerCtor>(Base: TBase) {
833
916
  }
834
917
 
835
918
  set parameters(val) {
836
- this._parametersSignal.set(val)
919
+ const normalizedParameters = {}
920
+ for (const [name, parameterValue] of Object.entries(val || {})) {
921
+ normalizedParameters[name] = normalizeParameterCurve(parameterValue)
922
+ }
923
+ this._parametersSignal.set(normalizedParameters)
924
+ if (MAXHP in normalizedParameters && this.hp > this.param[MAXHP]) {
925
+ this.hp = this.param[MAXHP]
926
+ }
927
+ if (MAXSP in normalizedParameters && this.sp > this.param[MAXSP]) {
928
+ this.sp = this.param[MAXSP]
929
+ }
837
930
  }
838
931
 
839
932
  private _expForLevel(level: number): number {
@@ -874,11 +967,12 @@ export function WithParameterManager<TBase extends PlayerCtor>(Base: TBase) {
874
967
  * @returns {void}
875
968
  * @memberof ParameterManager
876
969
  * */
877
- addParameter(name: string, { start, end }: { start: number, end: number }): void {
970
+ setParameter(name: string, value: ParameterValue): void {
971
+ const normalizedValue = normalizeParameterCurve(value)
878
972
  this._parametersSignal.mutate(parameters => {
879
973
  parameters[name] = {
880
- start,
881
- end
974
+ start: normalizedValue.start,
975
+ end: normalizedValue.end
882
976
  }
883
977
  })
884
978
  const maxHp = this.param[MAXHP]
@@ -891,6 +985,10 @@ export function WithParameterManager<TBase extends PlayerCtor>(Base: TBase) {
891
985
  }
892
986
  }
893
987
 
988
+ addParameter(name: string, { start, end }: { start: number, end: number }): void {
989
+ this.setParameter(name, { start, end })
990
+ }
991
+
894
992
  /**
895
993
  * Gives back in percentage of health points to skill points
896
994
  *