phantom icon indicating copy to clipboard operation
phantom copied to clipboard

API

Open jhead opened this issue 5 years ago • 10 comments

Branch: feature/api

Here's an umbrella issue tracking work on providing an (optional) HTTP-based API for phantom. The goal is to provide an API that's sufficient for powering a UI or web app.

Goals

  • Manage multiple servers on a single instance of phantom
  • Start/stop/restart phantom proxies at any time
  • Reconfigure phantom on the fly without restarting it
  • Expose as much information about the proxies/servers as possible
  • Expose as much configuration as possible for powerful UIs

Features

  • Enable via -api flag on the command line
  • HTTP server and JSON REST API for CRUD operations on phantom servers + start/stop API to control the proxy for each server
  • JSON-based settings file phantom.json for easy manual configuration
  • Server info stored on disk and reloaded upon starting phantom so you don't have to reconfigure it every time

Let me know if you have ideas for features!

A fair warning: a lot of the code and APIs could change from commit to commit, so if you build anything against this right now, expect it to break.

jhead avatar May 25 '20 06:05 jhead

An example

POST /api/servers/myServer

 {
  "name": "Test Server",
  "prefs": {
    "bindAddress": "0.0.0.0",
    "bindPort": 0,
    "remoteServer": "lax.mcbr.cubed.host:19132",
    "idleTimeout": 0,
    "ipv6": false
  }
}

^ would create a new server and store it in phantom.json automatically. That file also contains settings, etc., and you could edit it manually.

POST /api/servers/myServer/start would start a proxy for that server, just like running phantom from the CLI normally.

POST api/servers/myServer/stop would stop the proxy for that server.

Not all the endpoints are implemented yet but they should be soon.

jhead avatar May 25 '20 06:05 jhead

@jhead awesome! I'll look into that, since I never worked with that kind of API. Do i just send a POST request to "/api/..." (instead an URL) with a JSON as parameters? Does this work on window aswell (since the file system is different than an UNIX like Systems)?

EDIT: NVM

but: when I send a post request to "http://localhost:7377/api/servers/MyServer" with your example json, I get [90m12:45PM[0m [31mWRN[0m Received invalid server object [31merror=[0m[31m"schema: converter not found for proxy.ProxyPrefs"[0m in the commandline of phantom (ignore the wierd commandline formatting for the timestamp, seems to be a problem with my system) EDIT2: NVM again, I'm apparently just to dumb to use the requests-library of python.

WhatWheatleySaid avatar May 25 '20 09:05 WhatWheatleySaid

@jhead Is there something in the API to remove a server from the JSON without having to fiddle with the JSON directly and overwriting it?

WhatWheatleySaid avatar May 25 '20 16:05 WhatWheatleySaid

Is there something in the API to remove a server from the JSON without having to fiddle with the JSON directly and overwriting it?

You can use an HTTP DELETE request, for example: DELETE http://localhost:7377/api/servers/MyServer would stop and delete the MyServer server.

Does this work on window aswell (since the file system is different than an UNIX like Systems)?

It should, but let me know if you run into any issues 🙂

jhead avatar May 25 '20 18:05 jhead

@jhead it indeed deletes the server, but it does not alter the JSON file and thus, when restarting the application, the server is back in the list

WhatWheatleySaid avatar May 25 '20 19:05 WhatWheatleySaid

@WhatWheatleySaid thanks, fixed in 12e0418

jhead avatar May 25 '20 20:05 jhead

@jhead another Bug I encountered is, that only the most recent started server seems to show up in minecraft in your newest version (when using the JSON REST API)

WhatWheatleySaid avatar May 25 '20 21:05 WhatWheatleySaid

I don't know how closely related this could be connection-wise, but with the way this is connecting people over LAN would it be possible to make something like BungeeCord for bedrock (connecting multiple servers through portals)

BRadHoc avatar May 31 '20 00:05 BRadHoc

I don't know how closely related this could be connection-wise, but with the way this is connecting people over LAN would it be possible to make something like BungeeCord for bedrock (connecting multiple servers through portals)

Hey @BRadHoc! Cool idea. I’m not sure if I want to build it into phantom though, since you could just setup phantom with one of the existing Bedrock proxies like DragonProxy, etc. Don’t reinvent the wheel, right?

jhead avatar May 31 '20 00:05 jhead

existing Bedrock proxies like DragonProxy

DragonProxy is an abandoned project for joining Java Edition servers that was replaced by Geyser, you're probably thinking of things like WaterDog

Heath123 avatar Jul 20 '20 16:07 Heath123