Virtual Endpoints
Last updated: 4 minutes read.
Virtual endpoints are unique to Tyk. With a virtual endpoint, you can plug short JavaScript functions at the end of a Tyk route and have them run when the endpoint is called. Virtual endpoints are not available in Tyk Cloud Classic.
Note
Virtual endpoints and the JSVM middleware share the same API. See JavaScript API for more details.
A sample use case for this might be aggregate functions that bring together related data from multiple services in your stack into a single object.
Alternatively, you could produce a dynamic response object that transforms or computes data in some way from upstream services.
Note
The JavaScript engine in which these methods run in is a traditional ECMAScript 5 compatible environment and does not offer the more expressive power of something like Node.js. These methods are meant to provide a functional interpreter before complex interactions with your underlying service that cannot be handled by one of the other middleware components.
As with Javascript Middleware you will need to enable the JSVM. You do this by setting enable_jsvm
to true
in your tyk.conf
file.
Virtual Endpoint Functions
To create one of these methods, create a file and place it in a subdirectory of the Tyk configuration environment (ideally under the middleware
folder in your Tyk installation). Here is a sample method:
function myVirtualHandler (request, session, config) {
log("Virtual Test running")
log("Request Body: " + request.Body)
log("Session: " + session)
log("Config: " + config)
log("param-1: " + request.Params["param1"]) // case matters
log("auth Header: " + request.Headers["Authorization"]) // case matters
var responseObject = {
Body: "THIS IS A VIRTUAL RESPONSE",
Headers: {
"x-test": "virtual-header",
"x-test-2": "virtual-header-2"
},
Code: 200
}
return TykJsResponse(responseObject, session.meta_data)
}
log("Virtual Test initialised")
Adding Virtual Endpoints to your API Definition
Virtual endpoints follow the same layout and setup as other elements in the extended_path
section of the API definition:
...
virtual: [
{
response_function_name: "myVirtualHandler",
function_source_type: "file",
function_source_uri: "middleware/testVirtual.js",
path: "call-serverless",
method: "GET",
use_session: true
}
]
The parameters are as follows:
response_function_name
: This is the function to run when this virtual endpoint is requested. The function name must match exactly (including casing) the function name in your virtual middleware. We need to know this as it will be the entry point into your code, this will be called first. Make sure it is unique, all plugins run in the same VM, so if there are naming collisions you may end up with unpredictable behaviour.function_source_type
: This can befile
orblob
If set tofile
, then Tyk will pre-load the JS from disk, if set to blob, then Tyk will base64-decode a string from thefunction_source_uri
section.function_source_uri
: This will be the relative path to the source of the functionality (e.g.myfile.js
), or a blob of base64-encoded data that represents the same information. Blob mode is mainly used by the dashboard to make code injection easier on multiple node deployments.path
: This is the relative URI path to which the virtual middleware will respond. For example,http://{YOUR-DOMAIN}/call-serverless
.method
: This is the HTTP verb (GET
,POST
etc.) to which this virtual middleware will respond.use_session
: If true then the key session data will be provided to the function as thesession
variable. See the plugins documentation for more detail about this object.
Passing Custom Attributes to Middleware
You can use the config_data
special field in your API definition to pass custom attributes to middleware via a virtual endpoint.
Adding config_data
to an API Definition
Add the following to the root of your API definition:
"config_data": {
"string": "string",
"map": {
" key": 3
},
"num": 4
}
Example use of config_data
function myVirtualHandler (request, session, config) {
var responseObject = {
Body: "THIS IS A VIRTUAL RESPONSE",
Headers: {
"foo-header": "bar",
"map-header": JSON.stringify(config.config_data.map),
"string-header": config.config_data.string,
"num-header": JSON.stringify(config.config_data.num)
},
Code: 200
}
return TykJsResponse(responseObject, session.meta_data)
}
Custom Virtual Endpoints Table
We have put together a GitHub repo with a table of custom virtual endpoints that you can experiment with. If you would like to submit one that you have developed, feel free to open an issue in the repo.