Giter Club home page Giter Club logo

maverick-api's Introduction

Maverick-api

API for Maverick Web Interface - Highly Experimental - DO NOT USE FOR REAL WORLD APPLICATIONS YET!

Code Style Python application

About

Maverick-api is the backend code which is used to drive maverick-web. The two projects are designed work together to provide a next generation web based configuration tool and ground station application for your ArduPilot and PX4 based autonomous vehicles.

The server code is primarily written in Python and is built upon an asynchronous web framework called tornado. For vehicle communication and control maverick-api utlises mavros making it agnostic when interfacing with ArduPilot and PX4 based autopilots. To communicate with maverick-web and the browser, maverick-api exposes a GraphQL runtime layer using graphql-core-next to serve up an API which is accessed by maverick-web. The use of GraphQL over a more traditional REST API is a key component which will be discussed at a future date in the documentation. For now you will have to trust me ;)

Documentation

As we are still in the early stages of this project, providing detailed documentation on how the project is layed out, its feature set and how can be extended is a lower priority. We are rapidly adding features and modifying the codebase, so expect breaking changes in the immediate future. Currently the best souce of documentation is the code itself. As we develop maverick-api we are striving to write clear, self documenting code, so if you would like to get stuck in now and try it out, looking over the codebase is a good place to start. If you do get stuck or have a question, feel free to head over to our development gitter channel.

Installation

Currently the simplest way to install the dependencies, setup your environment and start using the project is by using maverick. If you have come across this project and haven't looked at maverick yet, check it out for a very nice way of installing and configuring a wide range of development tools and software packages which are commonly used in the open source autonomous vehicle community.

Once the software has matured slightly, pip installable packages will be made available to simplify the installation procedure. However, for now you will need to git clone the source.

Usage

Maverick-api has been built to be extended without needing to modify or understand the underlying server code. Dont worry if you have never used tornado before, simply drop your custom modules into the supplied folder structure, update the JSON configuration file and you are away! Maverick, maverick-api and maverick-web are all permissively licensed, so you can use them in your product and not have to worry about legally publishing your secret sauce back to the community.

Contributing

Maverick, maverick-api and maverick-web are architected and built in the spare time of a handful of contributors. Issues, feature requests and pull requests are highly welcomed. If you have an idea that you would like supported or just want to say ‘Hi’, feel free to drop into our gitter channel where we actively discuss development.

maverick-api's People

Contributors

dependabot-preview[bot] avatar fnoop avatar pyup-bot avatar samueldudley avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

maverick-api's Issues

Create ‘api state’ message

The API should keep track of certain internal states and expose that in a message for clients to display.
eg:

  • Is API connected to MAVROS?
  • Is parameter metadata available?
  • Is API connected to internet (for supplemental data availability eg. terrain, VFR, weather etc)

Modularise schema

Api and Schema is all currently in a couple of big files which makes it difficult to add new modules/features. Would be much easier if the logic for each area was broken out into separate python modules.

Parameter support

Add graphql support for getting and setting parameters via mavros

Expose vehicle info in graphql

Exposing the vehicle info in graphql will allow the interface to be aware of it's environment and react to different firmware etc

Unable to run with python2.7

Traceback (most recent call last):
  File "example_app.py", line 4, in <module>
    from tornadoql.tornadoql import TornadoQL, PORT
  File "/home/mav/tornadoql/tornadoql/tornadoql.py", line 10, in <module>
    from tornadoql.subscription_handler import GQLSubscriptionHandler
  File "/home/mav/tornadoql/tornadoql/subscription_handler.py", line 173
    self.schema, **params, allow_subscriptions=True
                         ^
SyntaxError: invalid syntax

Parameter value whitespace

eg. FRAME_CLASS:
{ "0": "Undefined", " 11": "Heli_Dual", " 12": "DodecaHexa", " 3": "Octa", " 2": "Hexa", " 1": "Quad", " 6": "Heli", " 7": "Tri", " 4": "OctaQuad", " 5": "Y6", " 8": "SingleCopter", " 9": "CoaxCopter" }
The " 1" value has a whitespace at the beginning of the key, so this doesn't then match when trying to display the parameter value. Can we strip whitespace out of keys? Not sure if this will break anything else - perhaps strip prefixing or suffixing whitespace?

get_vehicle_info error

At the beginning of startup, log entry:
2018-09-27 08:21:04,788 ERROR An error occurred while retrieving vehicle info via ROS: service [/mavros/get_vehicle_info] unavailable

Doesn't seem to exist:

[dev] [mav@goodrobots ~/code/maverick-api]$ rostopic echo /mavros/get_vehicle_info
WARNING: topic [/mavros/get_vehicle_info] does not appear to be published yet

Mission support

Store more than one mission to allow selection

Load missions from file (XML and non XML format)
Rec mission msg from mavros
Send mission msgs via mavros

Report missions to client via graphql
Update missions via graphql mutations

Restructure filetree

Currently the code all sits in maverick_api directory, with some meta files up at the top level:

-rw-rw-r-- 1 mav mav  891 Dec 19 23:43 Jenkinsfile
-rw-rw-r-- 1 mav mav 1063 Dec 19 23:43 LICENSE
-rw-rw-r-- 1 mav mav  754 Dec 19 23:43 README.md
drwxrwxr-x 9 mav mav 4096 Dec 19 23:44 maverick_api
-rw-rw-r-- 1 mav mav   68 Dec 19 23:43 requirements.txt

Inside maverick_api, there are several directories:

drwxrwxr-x 2 mav mav 4096 Dec 19 23:43 config
drwxrwxr-x 2 mav mav 4096 Dec 19 23:43 database
-rwxrwxr-x 1 mav mav 7054 Dec 19 23:43 maverick_api.py
drwxrwxr-x 5 mav mav 4096 Dec 19 23:43 modules
drwxrwxr-x 2 mav mav 4096 Dec 19 23:43 param
drwxrwxr-x 2 mav mav 4096 Dec 19 23:43 static
drwxrwxr-x 2 mav mav 4096 Dec 19 23:43 tornadoql
drwxrwxr-x 2 mav mav 4096 Dec 19 23:43 util

It would be nice to flatten this so maverick_api.py sits at the top level, and to simplify/restructure the various directories to be cleaner for end users. For example, config is where a user would expect to find configuration files, not logic that parses the configuration.

For example, something like:

LICENSE
README.md
maverick_api.py
config/
data/
modules/

where modules/ contains most of the logic and is further structured to hold -api modules, and the graphql iterated modules.

This simplified structure should be more intuitive for users, and simpler to deploy and develop?

Add mavlink waypoint data

Mavlink meta data such as flight modes, waypoint types etc need to be available through the API so that the interface can use them for better UX

Maverick-api doesn’t stop gracefully

Stopping the maverick-api service using systemd hits the 10 second timeout and is forcibly killed:

Feb 16 09:39:18 goodrobots-maverick systemd[1]: Stopping Maverick API Service...
Feb 16 09:39:28 goodrobots-maverick systemd[1]: maverick-api.service: State 'stop-sigterm' timed out. Killing.
Feb 16 09:39:28 goodrobots-maverick systemd[1]: maverick-api.service: Main process exited, code=killed, status=9/KILL
Feb 16 09:39:28 goodrobots-maverick systemd[1]: Stopped Maverick API Service.
Feb 16 09:39:28 goodrobots-maverick systemd[1]: maverick-api.service: Unit entered failed state.
Feb 16 09:39:28 goodrobots-maverick systemd[1]: maverick-api.service: Failed with result 'signal'.
Feb 16 09:39:28 goodrobots-maverick systemd[1]: Started Maverick API Service.

Parameter group

In the parameter group screen (http://www.maverick.one/maverick-web/#/config/parameter-groups), the params are grouped by the first _ split component of the parameter ID (eg. ACCEL_Z_D becomes ACCEL). It's very difficult to do this in the frontend without creating a complete new set of nested arrays, which takes a lot of code and cycles, and then breaks some reactive data links.

If each parameter could have an extra 'group' or 'prefix' field inserted by the API that has this component, it would greatly simplify the frontend.

Parameters full set sent every subscription

Full set of parameters query seem to be sent to clients every time a subscription is sent - ie. every parameter update. This is very heavy and forces the client to reprocess the full parameter set frequently, loading cpu.

maverick-api requires rospy

launching maverick-api as a service fails on rospy import

Feb 03 10:26:31 goodrobots-maverick maverick-api[5105]:   File "/srv/maverick/code/maverick-api/maverick-api", line 32, in <module>
Feb 03 10:26:31 goodrobots-maverick maverick-api[5105]:     import rospy
Feb 03 10:26:31 goodrobots-maverick maverick-api[5105]: ImportError: No module named rospy
Feb 03 10:26:31 goodrobots-maverick systemd[1]: maverick-api.service: Main process exited, code=exited, status=1/FAILURE
Feb 03 10:26:31 goodrobots-maverick systemd[1]: maverick-api.service: Unit entered failed state.
Feb 03 10:26:31 goodrobots-maverick systemd[1]: maverick-api.service: Failed with result 'exit-code'.
Feb 03 10:26:31 goodrobots-maverick systemd[1]: maverick-api.service: Service hold-off time over, scheduling restart.
Feb 03 10:26:31 goodrobots-maverick systemd[1]: Stopped Maverick API Service.
Feb 03 10:26:31 goodrobots-maverick systemd[1]: maverick-api.service: Start request repeated too quickly.
Feb 03 10:26:31 goodrobots-maverick systemd[1]: Failed to start Maverick API Service.

mongodb is currently required/hardcoded

mongodb support is currently required and the db_client created in the main script is passed through settings as an object.

Should support be optional?
Regardless I think passing the client object should happen outside of settings (and must with the new tornado options model).

Document API

Need to document the gql api for endpoints to use (ie what messages and schema are available, field types etc).
Possible to autogenerate the docs?

make graphiql a template

Currently graphiql.html is served as a static file with hard coded paths. Render as template to enable app prefix and port changes

graphiql websockets call url should be constructed

      var subscriptionsClient = new window.SubscriptionsTransportWs.SubscriptionClient('ws://dev.maverick.one/maverick-api/subscriptions', {
        reconnect: true
      });

The websockets should be constructed from the called URL like fetchUrl is.

Arduplane parameters failing to update

SITL on dev.maverick.one updated to run arduplane. Params are not failing to update. error in log:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/graphql/execution/executor.py", line 311, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "/usr/local/lib/python2.7/dist-packages/graphql/execution/executors/sync.py", line 7, in execute
    return fn(*args, **kwargs)
  File "/srv/maverick/code/maverick-api/api/schema.py", line 164, in mutate
    ret_val = Parameters.callback(kwargs) # this calls param set
  File "/srv/maverick/code/maverick-api/maverick-api", line 330, in param_set_callback
    ret = param_set(param_data['id'].encode('ascii','ignore'), float(param_data['value']))
  File "/srv/maverick/software/ros/current/lib/python2.7/dist-packages/mavros/param.py", line 146, in param_set
    raise IOError(str(ex))
graphql.error.located_error.GraphQLLocatedError: service [/mavros/param/set] unavailable

In tornado.log:

2018-03-31 07:09:09,154 DEBUG subscriptions: {u'20': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda6d2c10>, u'21': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda6e9090>, u'22': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcdac62ed0>, u'23': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda679d50>, u'1': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcfa860650>, u'3': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda7fd410>, u'2': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda7f4150>, u'5': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda815410>, u'4': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda809490>, u'7': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda78cf50>, u'6': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda7bba90>, u'9': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda740650>, u'8': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda7a7a10>, u'11': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda740250>, u'10': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda74d8d0>, u'13': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda6f49d0>, u'12': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda765790>, u'15': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda710910>, u'14': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda701910>, u'17': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda729a10>, u'16': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda71d990>, u'19': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda6c49d0>, u'18': <rx.disposables.anonymousdisposable.AnonymousDisposable object at 0x7fdcda6b86d0>}
2018-03-31 07:09:48,990 DEBUG graphql request: {u'query': u'mutation updateParam($id: ID, $value: ParamValueType) {\n  updateParam(id: $id, value: $value) {\n    ok\n    param {\n      id\n      value\n      __typename\n    }\n    __typename\n  }\n}\n', u'variables': {u'id': u'AHRS_GPS_USE', u'value': False}, u'operationName': u'updateParam'}
2018-03-31 07:09:49,002 DEBUG GraphQL result data: OrderedDict([(u'updateParam', None)]) errors: [GraphQLLocatedError('service [/mavros/param/set] unavailable',)] invalid False
2018-03-31 07:09:49,002 WARNING GraphQL Error:
2018-03-31 07:09:49,003 DEBUG error_json: {"errors": [{"message": "service [/mavros/param/set] unavailable"}]}
2018-03-31 07:09:49,003 WARNING 400 POST /graphql (127.0.0.1) 14.08ms

CORS support needed

2018-02-15 21:59:15,218 WARNING 403 GET /subscriptions (127.0.0.1) 0.58ms
2018-02-15 21:59:15,219 DEBUG Cross origin websockets not allowed

CORS is needed if our web GCS will support multiple endpoints, by definition any additional endpoint will be cross origin.

Add VFR/NOTAM data feed to graphql

Add VFR, NOTAM etc data to a query/subscription feed, that will allow us to display airports, airspace boundaries etc. Crucial to any planning/HUD/AR environment

Request data streams

Looks like maverick-api needs to request the various data streams in order to receive most of the data. At the moment after you start sitl and maverick-api you get the basic data only - no vfr/gps/pose/imu data. But if you just connect a GCS like QGC then immediately the rest of the data starts streaming. This is presumably because the GCS requests all the data streams to start.

Sort parameter meta values by key

Meta values aren't sorted: "values": "{\"0\": \"Disabled\", \"0.5\": \"Very High\", \"0.2\": \"Low\", \"0.4\": \"High\", \"0.3\": \"Medium\", \"0.1\": \"Very Low\"}",
Would save logic and cycles in the browser if this could be sorted in the api

Altitude data?

vfrHudMessage.altitude gives an odd figure - when flying at reported 100m from a GCS, this message field gives about 684 value slightly lower that the navSatFix.altitude:
vfrHudMessage: 684.22998046875 :: navSatFix: 703.6901112815922

Expose parameter value type

Is it possible to add the parameter value type in the meta data? eg. if a parameter is a boolean, or integer, float or bitmask?
It would be very useful so the interface can react and present the most appropriate choice of input to the user.

navSatFixed callback error

Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]: [ERROR] [1518162262.001378]: bad callback: <bound method Connection.nav_sat_fix_callback of <__main__.Connection object at 0x7f41918c96d0>>
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]: Traceback (most recent call last):
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     cb(msg)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/srv/maverick/code/maverick-api/maverick-api", line 214, in nav_sat_fix_callback
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     res = UpdateNavSatFixMessage().mutate(**kwargs)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/srv/maverick/code/maverick-api/api/schema.py", line 296, in mutate
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     Subscriptions.stream['NavSatFix'].on_next(nav_sat_fixed_message)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/subjects/subject.py", line 92, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     observer.on_next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/autodetachobserver.py", line 16, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self.observer.on_next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/anonymousobserver.py", line 14, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/linq/observable/select.py", line 36, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     observer.on_next(result)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/autodetachobserver.py", line 16, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self.observer.on_next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/anonymousobserver.py", line 14, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/autodetachobserver.py", line 16, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self.observer.on_next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/anonymousobserver.py", line 14, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/linq/observable/select.py", line 36, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     observer.on_next(result)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/observerbase.py", line 19, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._on_next_core(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/rx/core/autodetachobserver.py", line 16, in _on_next_core
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self.observer.on_next(value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/srv/maverick/code/maverick-api/tornadoql/subscription_handler.py", line 39, in on_next
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self.send_execution_result(self.op_id, value)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/srv/maverick/code/maverick-api/tornadoql/subscription_handler.py", line 103, in send_execution_result
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     return self.send_message(op_id, GQL_DATA, result)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/srv/maverick/code/maverick-api/tornadoql/subscription_handler.py", line 80, in send_message
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     return self.write_message(json_message)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 252, in write_message
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     return self.ws_connection.write_message(message, binary=binary)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 793, in write_message
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     return self._write_frame(True, opcode, message, flags=flags)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 776, in _write_frame
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     return self.stream.write(frame)
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:   File "/usr/local/lib/python2.7/dist-packages/tornado/iostream.py", line 395, in write
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]:     self._write_buffer += data
Feb 09 07:44:22 goodrobots-maverick maverick-api[14616]: BufferError: Existing exports of data: object cannot be re-sized

Consider alternate options to graphql

Background

It has been identified that graphql has implementation limitations that may not allow us to achieve the desired project architecture. This issue is to keep track of thoughts and requirements to help decide if we need to change out our API<->Client communication mechanism and discuss potential replacement options.

Required:

  • Support a single client connecting to many API instances simultaneously
  • API instances should not have to communicate between one another for this feature to function
  • Non-polling (e.g. support websocket streaming)
  • Ability to be modularised

Desired:

  • An interface that can be polled to request capability (introspection)
  • Existing libraries that can be leveraged to make out jobs simpler (Client and API)

Related:

goodrobots/maverick-web#35
vuejs/apollo#216
https://medium.com/open-graphql/apollo-multiple-clients-with-react-b34b571210a5
#36

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.