From b9dc57d6ffb30db02fe0d349d619693f469a929a Mon Sep 17 00:00:00 2001 From: Andy Ost Date: Fri, 1 Mar 2024 14:06:50 +0000 Subject: [PATCH 01/35] Updated virtual endpoint and JS docs --- .../virtual-endpoint-file.png | Bin 0 -> 73761 bytes .../virtual-endpoint-inline.png | Bin 0 -> 131263 bytes .../virtual-endpoint-middleware.png | Bin 0 -> 118286 bytes .../compose-apis/demo-virtual-endpoint.md | 205 +++++++++++-- .../compose-apis/sample-batch-funtion.md | 78 ----- .../compose-apis/virtual-endpoints.md | 152 +++------- .../javascript-middleware.md | 46 +-- .../install-middleware/install-middleware.md | 19 -- .../install-middleware/tyk-ce.md | 4 +- .../install-middleware/tyk-hybrid.md | 4 +- .../install-middleware/tyk-pro.md | 4 +- .../javascript-middleware/javascript-api.md | 11 +- .../middleware-scripting-guide.md | 275 +++++++++--------- .../virtual-endpoint-tyk-classic.md | 115 ++++++++ .../middleware/virtual-endpoint-tyk-oas.md | 151 ++++++++++ tyk-docs/data/menu.yaml | 54 ++-- 16 files changed, 696 insertions(+), 422 deletions(-) create mode 100644 tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-file.png create mode 100644 tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-inline.png create mode 100644 tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-middleware.png delete mode 100644 tyk-docs/content/advanced-configuration/compose-apis/sample-batch-funtion.md delete mode 100755 tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/install-middleware.md create mode 100644 tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md create mode 100644 tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md diff --git a/tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-file.png b/tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-file.png new file mode 100644 index 0000000000000000000000000000000000000000..047e1351bb466d0acd16dcd4ed990aa38a2c5fc1 GIT binary patch literal 73761 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�T=NeD2z>+J9VKdWR(kv8juGn7FAgX0~SFZ_2`KT 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 IZ5sN20EX`tH~;_u literal 0 HcmV?d00001 diff --git a/tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-inline.png b/tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-inline.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c5d7492c6221ac20b8680418ed128c6e95e2f8 GIT binary patch literal 131263 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

fiDrnB2`y)kWUjA!%Ce}H?NkwbZRF7sV?m4?z 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 bG#!{9xa_Fx$}elh8Gyjk)z4*}Q$iB}qNR2q literal 0 HcmV?d00001 diff --git a/tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-middleware.png b/tyk-docs/assets/img/dashboard/endpoint-designer/virtual-endpoint-middleware.png new file mode 100644 index 0000000000000000000000000000000000000000..2d23708a6044daed02b84e50a28d1ea87f938495 GIT binary patch literal 118286 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 (API request, session key, API definition). -1. From the **Endpoint Designer**, Add a new Endpoint. -2. From the Plugins drop-down list, select **Virtual Endpoint**. -3. From the Virtual Endpoint settings, add a unique name in the **JS function to call** option. You should also use the same name inside the function code. For this demo, we will use `myVirtualHandlerGetHeaders`. +1. Enable the Virtual Endpoint middleware on an endpoint of your API and paste this JavaScript into the API Designer (or save in a file and reference it from the middleware config): +```javascript +function myFirstVirtualHandler (request, session, config) { + log("Virtual Test running") + + log("Request Body: " + request.Body) + log("Session: " + JSON.stringify(session.allowance)) + log("Config: " + JSON.stringify(config.APIID)) + log("param-1: " + request.Params["param1"]) // case matters + log("auth Header: " + request.Headers["Authorization"]) // case matters + + var responseObject = { + Body: "VIRTUAL ENDPOINT EXAMPLE #1", + Headers: { + "x-test": "virtual-header", + "x-test-2": "virtual-header-2" + }, + Code: 200 + } + + return TykJsResponse(responseObject, session.meta_data) +} +log("Virtual Test initialised") +``` + +2. Make a call to your API endpoint passing a request body, a value in the `Authorization` header and a query parameter `param1`. -Every line in the script gives an example of a functionality usage: +3. The virtual endpoint will terminate the request and return this response: +``` +HTTP/1.1 200 OK +Date: Thu, 29 Feb 2024 17:39:00 GMT +Server: tyk +X-Ratelimit-Limit: 0 +X-Ratelimit-Remaining: 0 +X-Ratelimit-Reset: 0 +X-Test: virtual-header +X-Test-2: virtual-header-2 +Content-Length: 27 +Content-Type: text/plain; charset=utf-8 + +VIRTUAL ENDPOINT EXAMPLE #1 +``` -* How to get form param -* How to get specific key inside json variable -* The structure of request object with `Body`, `Headers`, (need to add session object examples)Using `TykMakeHttpRequest`, and the json it returns - `.Code` and `.Body`. +4. The gateway logs will include: +``` +time="" level=info msg="Virtual Test running" prefix=jsvm type=log-msg +time="" level=info msg="Request Body: " prefix=jsvm type=log-msg +time="" level=info msg="Session: " prefix=jsvm type=log-msg +time="" level=info msg="Config: " prefix=jsvm type=log-msg +time="" level=info msg="param-1: " prefix=jsvm type=log-msg +time="" level=info msg="auth Header: " prefix=jsvm type=log-msg +``` + +## Example 2: Accessing custom attributes in the API Definition +You can add [custom attributes]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#passing-custom-attributes-to-middleware" >}}) to the API definition and access these from within your Virtual Endpoint. + +1. Add the following custom attributes to your API definition: +```{.json} +{ + "string": "string", + "map": { + " key": 3 + }, + "num": 4 +} +``` + +2. Enable the Virtual Endpoint middleware on an endpoint of your API and paste this JavaScript into the API Designer (or save in a file and reference it from the middleware config): +```.js +function mySecondVirtualHandler (request, session, config) { + var responseObject = { + Body: "VIRTUAL ENDPOINT EXAMPLE #2", + 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) +} +``` + +3. Make a call to your API endpoint. + +4. The virtual endpoint will terminate the request and return this response: +``` +HTTP/1.1 200 OK +Date: Thu, 29 Feb 2024 17:29:12 GMT +Foo-Header: bar +Map-Header: {" key":3} +Num-Header: 4 +Server: tyk +String-Header: string +X-Ratelimit-Limit: 0 +X-Ratelimit-Remaining: 0 +X-Ratelimit-Reset: 0 +Content-Length: 26 +Content-Type: text/plain; charset=utf-8 + +VIRTUAL ENDPOINT EXAMPLE #2 +``` + +## Example 3: Advanced example +In this example, every line in the script gives an example of a functionality usage, including: + - how to get form param + - how to get to a specific key inside a JSON variable + - the structure of the request object + - using `TykMakeHttpRequest` to make an HTTP request from within the virtual endpoint, and the json it returns - `.Code` and `.Body`. -Paste the following code in the **Code editor**. ```{.json} function myVirtualHandlerGetHeaders (request, session, config) { @@ -58,7 +159,7 @@ function myVirtualHandlerGetHeaders (request, session, config) { var bodyObject = JSON.parse(usableResponse.Body); var responseObject = { - //Body: "THIS IS A VIRTUAL RESPONSE", + //Body: "THIS IS A VIRTUAL RESPONSE", Body: "yo yo", Headers: { "test": "virtual", @@ -72,18 +173,11 @@ function myVirtualHandlerGetHeaders (request, session, config) { return TykJsResponse(responseObject, session.meta_data) } ``` -{{< note success >}} -**Note** - -Another option, instead of the steps above, you can use this Gist to import the API definition - [API Definition Import](https://gist.github.com/letzya/5b5edb3f9f59ab8e0c3c614219c40747) -{{< /note >}} - -The virtual function is `base64` encoded in the `function_source_uri` field. +#### Running the Advanced example +You can find a Tyk Classic API definition [here](https://gist.github.com/letzya/5b5edb3f9f59ab8e0c3c614219c40747) that includes the advanced example, with the JS encoded `inline` within the middleware config for the `GET /headers` endpoint. -## Demonstrating the Virtual Endpoint - -Run the following command: +Create a new Tyk Classic API using that API definition and then run the following command to send a request to the API endpoint where the : `curl http://tyk-gateway:8080/testvirtualendpoint2/headers -H "location: /get" -v` This should return the following: @@ -114,7 +208,8 @@ Connection #0 to host tyk-gateway left intact yo yo ``` -## Checking the Tyk Gateway Logs +#### Checking the Tyk Gateway Logs +The `log` and `rawlog` commands in the JS function write to the Tyk Gateway logs. If you check the logs you should see the following: ``` [Jun 13 14:45:21] DEBUG jsvm: Running: myVirtualHandlerGetHeaders @@ -138,3 +233,59 @@ Virtual Test ended [Jun 13 14:45:22] DEBUG JSVM Virtual Endpoint execution took: (ns) 191031553 ``` +## Example 4: Aggregating upstream calls using batch processing +One of the most common use cases for virtual endpoints is to provide some form of aggregate data to your users, combining the responses from multiple upstream service calls. This virtual endpoint function will do just that using the batch processing function from the [JavaScript API]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api" >}}) + +``` .js +function batchTest(request, session, config) { + // Set up a response object + var response = { + Body: "", + Headers: { + "test": "virtual-header-1", + "test-2": "virtual-header-2", + "content-type": "application/json" + }, + Code: 200 + } + + // Batch request + var batch = { + "requests": [ + { + "method": "GET", + "headers": { + "x-tyk-test": "1", + "x-tyk-version": "1.2", + "authorization": "1dbc83b9c431649d7698faa9797e2900f" + }, + "body": "", + "relative_url": "http://httpbin.org/get" + }, + { + "method": "GET", + "headers": {}, + "body": "", + "relative_url": "http://httpbin.org/user-agent" + } + ], + "suppress_parallel_execution": false + } + + log("[Virtual Test] Making Upstream Batch Request") + var newBody = TykBatchRequest(JSON.stringify(batch)) + + // We know that the requests return JSON in their body, lets flatten it + var asJS = JSON.parse(newBody) + for (var i in asJS) { + asJS[i].body = JSON.parse(asJS[i].body) + } + + // We need to send a string object back to Tyk to embed in the response + response.Body = JSON.stringify(asJS) + + return TykJsResponse(response, session.meta_data) + +} +log("Batch Test initialised") +``` \ No newline at end of file diff --git a/tyk-docs/content/advanced-configuration/compose-apis/sample-batch-funtion.md b/tyk-docs/content/advanced-configuration/compose-apis/sample-batch-funtion.md deleted file mode 100644 index f4d5495b58..0000000000 --- a/tyk-docs/content/advanced-configuration/compose-apis/sample-batch-funtion.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -date: 2017-03-23T18:08:16Z -title: Example Batch Processing Aggregate Function -menu: - main: - parent: "Compose APIs" -weight: 3 ---- - -## Batch using the /tyk/batch endpoint - -{{< note success >}} -**Note** - -Virtual endpoints are not available in the Tyk Cloud Classic Edition. -{{< /note >}} - - -### An Aggregate JS Function - -The most common use case for this functionality, as we see it, is to provide some form of aggregate data to your users, here's a snippet that will do just that using the new batch processing API: - -```{.copyWrapper} -function batchTest(request, session, config) { - // Set up a response object - var response = { - Body: "", - Headers: { - "test": "virtual-header-1", - "test-2": "virtual-header-2", - "content-type": "application/json" - }, - Code: 200 - } - - // Batch request - var batch = { - "requests": [ - { - "method": "GET", - "headers": { - "x-tyk-test": "1", - "x-tyk-version": "1.2", - "authorization": "1dbc83b9c431649d7698faa9797e2900f" - }, - "body": "", - "relative_url": "http://httpbin.org/get" - }, - { - "method": "GET", - "headers": {}, - "body": "", - "relative_url": "http://httpbin.org/user-agent" - } - ], - "suppress_parallel_execution": false - } - - log("[Virtual Test] Making Upstream Batch Request") - var newBody = TykBatchRequest(JSON.stringify(batch)) - - // We know that the requests return JSON in their body, lets flatten it - var asJS = JSON.parse(newBody) - for (var i in asJS) { - asJS[i].body = JSON.parse(asJS[i].body) - } - - // We need to send a string object back to Tyk to embed in the response - response.Body = JSON.stringify(asJS) - - return TykJsResponse(response, session.meta_data) - -} -log("Batch Test initialised") - -``` - -The batch object here is the same object that is fed into our batch request method `TykBatchRequest` that is exposed as part of certain API definitions. \ No newline at end of file diff --git a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md index 36da36e1aa..9ef3c97034 100755 --- a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md @@ -1,126 +1,64 @@ --- date: 2017-03-23T18:08:16Z -title: Virtual Endpoints -menu: - main: - parent: "Compose APIs" -weight: 1 +title: Tyk Virtual Endpoints +description: "Virtual Endpoint middleware" +tags: ["virtual endpoint", "middleware", "per-endpoint", "JavaScript", "JS"] aliases: - /compose-apis/virtual-endpoints/ --- -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. +Tyk's Virtual Endpoint is a programmable middleware component that is invoked towards the end of the request processing chain. It can be enabled at the per-endpoint level and can perform complex interactions with your upstream service(s) that cannot be handled by one of the other middleware components. + +Virtual endpoint middleware provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself, without the need to proxy the request to an upstream service. This functionality is particularly useful for a variety of use cases, including request transformation, aggregation of responses from multiple services, or implementing custom authentication mechanisms. + +The Virtual Endpoint is an extremely powerful feature that is unique to Tyk and provides exceptional flexibility to your APIs. + +## When to use virtual endpoints +#### Aggregating data from multiple services +From a virtual endpoint, you can make calls out to other internal and upstream APIs. You can then aggregate and process the responses, returning a single response object to the originating client. This allows you to configure a single externally facing API to simplify interaction with multiple internal services, leaving the heavy lifting to Tyk rather than standing up an aggregation service within your stack. + +#### Enforcing custom policies +Tyk provides a very flexible [middleware chain]({{< ref "concepts/middleware-execution-order" >}}) where you can combine functions to implement the access controls you require to protect your upstream services. Of course, not all scenarios can be covered by Tyk's standard middleware functions, but you can use a virtual endpoint to apply whatever custom logic you require to optimise your API experience. + +#### Dynamic Routing +With a virtual endpoint you can implement complex dynamic routing of requests made to a single external endpoint on to different upstream services. The flexibility of the virtual endpoint gives access to data within the request (including the key session) and also the ability to make calls to other APIs to make decisions on the routing of the request. It can operate as a super-powered [URL rewrite]({{< ref "transform-traffic/url-rewriting" >}}) middleware. + +## How virtual endpoints work +The virtual endpoint middleware provides a JavaScript engine that runs the custom code that you provide either inline within the API definition or in a source code file accessible to the Gateway. The JavaScript Virtual Machine (JSVM) provided in the middleware is a traditional ECMAScript5 compatible environment which does not offer the more expressive power of something like Node.js. + +The virtual endpoint terminates the request, so the JavaScript function must provide the response to be passed to the client. When a request hits a virtual endpoint, the JSVM executes the JavaScript code which can modify the request, make calls to other APIs or upstream services, process data, and ultimately determines the response returned to the client. {{< note success >}} **Note** -Virtual endpoints and the JSVM middleware share the same API. See [JavaScript API]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api" >}}) for more details. +You will need to enable Tyk's JavaScript Virtual Machine by setting `enable_jsvm` to `true` in your `tyk.conf` [file]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}) for your virtual endpoints to work. {{< /note >}} -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. +## Scripting virtual endpoint functions +The [middleware scripting guide]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide" >}}) provides guidance on writing JS functions for your virtual endpoints, including how to access key session data and custom attributes from the API definition. + +#### Function naming +The virtual endpoint middleware will invoke a named function within the JS code that you provide (either inline or in a file). Both the filename and function name are configurable per endpoint, but note that function names must be unique across your API portfolio because all plugins run in the same virtual machine. This means that you can share a single function definition across multiple endpoints and APIs but you cannot have two different functions with the same name (this applies across all [JavaScript middleware components]({{< ref "plugins/supported-languages/javascript-middleware" >}})). + +Inline mode is mainly used by the dashboard to make code injection easier on multiple node deployments. -Alternatively, you could produce a dynamic response object that transforms or computes data in some way from upstream services. +## Virtual endpoint library +We have put together a [library](https://github.com/TykTechnologies/custom-plugins#virtual-endpoints) of JS functions that you could use in your virtual endpoints. We welcome submissions from the Tyk community so if you've created a function that you think would be useful to other users, please open an issue in the Github repository and we can discuss bringing it into the library. {{< note success >}} **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. +Virtual endpoints are not available in Tyk Cloud Classic. {{< /note >}} -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: - -```javascript -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: - -```{.json} -... -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 be `file` or `blob` If set to `file`, then Tyk will pre-load the JS from disk, if set to blob, then Tyk will base64-decode a string from the `function_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 the `session` 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: - -```{.json} -"config_data": { - "string": "string", - "map": { - " key": 3 - }, - "num": 4 -} -``` - -#### Example use of `config_data` - -```javascript -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](https://github.com/TykTechnologies/custom-plugins#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. \ No newline at end of file +


+ +If you're using Tyk OAS APIs, then you can find details and examples of how to configure the virtual endpoint middleware [here]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas" >}}). + +If you're using Tyk Classic APIs, then you can find details and examples of how to configure the virtual endpoint middleware [here]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic" >}}). + + diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware.md index ee34790046..f1a51da806 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware.md @@ -1,42 +1,46 @@ --- date: 2017-03-24T14:45:20Z title: JavaScript Middleware -menu: - main: - parent: "Supported Languages" -weight: 2 +description: "Using JavaScript with Tyk" +tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "plugins", "virtual endpoint", "JSVM", "JavaScript Virtual Machine", "dynamic event handler"] aliases: - /customise-tyk/plugins/javascript-middleware/ - /customise-tyk/plugins/javascript-middleware/middleware-execution-order/ - /plugins/javascript-middleware - /plugins/supported-languages/javascript-middleware/ + - /plugins/supported-languages/javascript-middleware/ + - /plugins/supported-languages/javascript-middleware/install-middleware/install-middleware + - /plugins/javascript-middleware/install-middleware --- -## Customise JS Middleware Overview +There are three middleware components that can be scripted with Tyk: -There are two types of customisations that can be scripted with Tyk: +1. **Custom JavaScript plugins**: These execute either *pre* or *post* validation. A *pre* middleware component will execute before any session validation or token validation has taken place, while a *post* middleware component will execute after the request has been passed through all checks and is ready to be proxied upstream. -1. **Middleware components**: These execute either *pre* or *post* validation. A *pre* middleware component will execute before any session validation or token validation has taken place, while a *post* middleware component will execute after the request has been passed through all checks and is ready to be proxied upstream. +2. **Dynamic event handlers**: These components fire on certain API events (see the event handlers section), these are fired Async and do not have a cooldown timer. These are documented [here]({{< ref "basic-config-and-security/report-monitor-trigger-events/webhooks#setup-with-api" >}}). -2. **Dynamic event handlers**: These components fire on certain API events (see the event handlers section), these are fired Async and do not have a cooldown timer. These are documented [here]({{< ref "basic-config-and-security/report-monitor-trigger-events/webhooks#setup-with-api" >}}). +3. **Virtual endpoints**: These are powerful programmable middleware invoked towards the end of the request processing chain. Unlike the custom JavaScript plugins, the virtual endpoint terminates the request. These are documented [here]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}). -All customisations have access to a limited system API (for access to resources outside of the JavaScript Virtual Machine sandbox), however the contexts of each plugin are different and have different constraints, this API gives access to the ability to make outbound HTTP requests as well as access to the key management REST API functions. +The JavaScript (JS) [scripting guide]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide" >}}) provides details of how to access dynamic data (such as the key session object) from your JS functions. Combining these resources provides you with a powerful set of tools for shaping and structuring inbound traffic to your API. -Middleware components receive extra data (depending on their context), but all have the capability to modify the request and the session object if it has been made available to the plugin. Usage of the Session object in a middleware component is expensive as the object needs to be retrieved, and de/re-encoded multiple times as it passes through the system. +### Declared plugin functions +JavaScript functions are available globally in the same namespace. So, if you include two or more JSVM plugins that call the same function, the last declared plugin implementation of the function will be returned. -## Underscore.js Library +## Enabling the JavaScript Virtual Machine (JSVM) +Before you can use JavaScript customisation in any component you will need to enable the JSVM. -In addition to our Tyk JavaScript API functions, you also have access to all the functions from the http://underscorejs.org/ library. +You do this by setting `enable_jsvm` to `true` in your `tyk.conf` [file]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}). -Underscore.js is a JavaScript library that provides a lot of useful functional programming helpers without extending any built-in objects. Underscore provides over 100 functions that support your favourite functional helpers: +## Installing JavaScript middleware +Installing middleware is different for different Tyk deployments, for example, in Tyk OSS it is possible to directly specify a path to a file in the API Definition, while in Tyk Self-Managed, we recommend using a directory-based loader. -* map -* filter -* invoke +We've provided the following guides: + - [Tyk OSS]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce" >}}) + - [Tyk Self-Managed]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro" >}}) + - [Tyk Hybrid]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid" >}}) -There are also more specialised goodies, including: +{{< note success >}} +**Note** -* function binding -* JavaScript templating -* creating quick indexes -* deep equality testing +Tyk Cloud Classic does not support custom middleware. +{{< /note >}} diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/install-middleware.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/install-middleware.md deleted file mode 100755 index e2bdad1e7d..0000000000 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/install-middleware.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -date: 2017-03-24T15:11:05Z -title: Install Middleware -menu: - main: - parent: "JavaScript Middleware" -weight: 4 -aliases: - - /plugins/javascript-middleware/install-middleware ---- - -Installing middleware is different for different releases of Tyk, for example, in Tyk Community Edition it is possible to directly specify a path to a file in the API Definition, while in Tyk Pro, we recommend using a directory-based loader. - -{{< note success >}} -**Note** - -Tyk Cloud Classic does not support custom middleware loading. However, it is possible with a [Tyk Multi-Cloud deployment]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid" >}}). -{{< /note >}} - diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md index ee6c5d1796..f5b97a12d9 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md @@ -1,6 +1,6 @@ --- date: 2017-03-24T15:38:11Z -title: Install Middleware on Tyk OSS +title: Installing Middleware on Tyk OSS tags: ["Tyk OSS JS plugin", "jave script plugin", "Javascript Middleware"] menu: main: @@ -10,7 +10,7 @@ aliases: - /plugins/javascript-middleware/install-middleware/tyk-ce --- -In order to activate middleware in a Tyk Community Edition edition or when using a file-based setup, the middleware needs to be registered as part of your API Definition. Registration of middleware components is relatively simple. +In order to activate middleware when using Tyk OSS or when using a file-based setup, the middleware needs to be registered as part of your API Definition. Registration of middleware components is relatively simple. {{< note success >}} **Note** diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md index a944280c11..11c01dd2b0 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md @@ -1,6 +1,6 @@ --- date: 2017-03-24T15:41:38Z -title: Install Middleware on Tyk Multi-Cloud +title: Installing Middleware on Tyk Hybrid menu: main: parent: "Install Middleware" @@ -9,7 +9,7 @@ aliases: - /plugins/javascript-middleware/install-middleware/tyk-hybrid --- -In some cases middleware references can't be directly embedded in API Definitions (for example, when using the dashboard in a Multi-Cloud install). However, there is an easy way to distribute and enable custom middleware for an API on a Tyk node. +In some cases middleware references can't be directly embedded in API Definitions (for example, when using the dashboard in a Hybrid install). However, there is an easy way to distribute and enable custom middleware for an API on a Tyk node. A second method of loading API Definitions in Tyk nodes is to add them as a directory structure in the Tyk node. Tyk will load the middleware plugins dynamically on host-reload without needing a direct reference to them in the API Definition. diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md index 0170d1c3dd..ad2959d51b 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md @@ -1,6 +1,6 @@ --- date: 2017-03-24T15:40:54Z -title: Install Middleware on Tyk Pro +title: Installing Middleware on Tyk Self-Managed menu: main: parent: "Install Middleware" @@ -9,7 +9,7 @@ aliases: - /plugins/javascript-middleware/install-middleware/tyk-pro --- -In some cases middleware references can't be directly embedded in API Definitions (for example, when using the Tyk Dashboard in an Self-Managed Pro installation). However, there is an easy way to distribute and enable custom middleware for an API in a Tyk node by adding them as a directory structure. +In some cases middleware references can't be directly embedded in API Definitions (for example, when using the Tyk Dashboard in an Self-Managed installation). However, there is an easy way to distribute and enable custom middleware for an API in a Tyk node by adding them as a directory structure. Tyk will load the middleware plugins dynamically on host-reload without needing a direct reference to them in the API Definition. diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md index ecc407f07b..960b25eb2a 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md @@ -1,16 +1,14 @@ --- date: 2017-03-24T14:54:24Z title: JavaScript API -menu: - main: - parent: "JavaScript Middleware" -weight: 1 +description: "Tyk JavaScript system API" +tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "plugins", "javascript API"] aliases: - /customise-tyk/plugins/javascript-middleware/javascript-api/ - /plugins/javascript-middleware/javascript-api --- -## Overview +This system API provides access to resources outside of the JavaScript Virtual Machine sandbox, the ability to make outbound HTTP requests and access to the key management REST API functions. Embedded JavaScript interpreters offer the bare bones of a scripting language, but not necessarily the functions that you would expect, especially with JavaScript, where objects such as `XMLHttpRequest()` are a given. However, those interfaces are actually provided by the browser / DOM that the script engine are executing in. In a similar vein, we have included a series of functions to the JSVM for convenience and give the interpreter more capability. @@ -61,7 +59,8 @@ log("Response body: " + usableResponse.Body); This method does not execute asynchronously, so execution will block until a response is received. -* `TykGetKeyData(api_key, api_id)`: Use this method to retrieve a session object for the key and the API provided: +### Working with the key session object +* `TykGetKeyData(api_key, api_id)`: Use this method to retrieve a [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) for the key and the API provided: ```{.copyWrapper} // In an event handler, we can get the key idea from the event, and the API ID from the context variable. diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index fa47f8bdcf..5242c4d2b9 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -1,93 +1,85 @@ --- date: 2017-03-24T14:51:42Z -title: Middleware Scripting Guide -menu: - main: - parent: "JavaScript Middleware" -weight: 3 +title: Using JavaScript with Tyk +description: "Writing custom JS functions for Tyk middleware" +tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "plugins", "virtual endpoint"] aliases: - /tyk-api-gateway-v1-9/javascript-plugins/middleware-scripting/ - /plugins/javascript-middleware/middleware-scripting-guide --- -## Middleware Scripting +Tyk's JavaScript Virtual Machine (JSVM) provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself. This can be accessed from [multiple locations]({{< ref "plugins/supported-languages/javascript-middleware" >}}) in the API processing chain and allows significant customisation and optimisation of your request handling. -Middleware scripting is done in either a _pre_ or _post_ middleware chain context, dynamic middleware can be applied to both session-based APIs and Open (Keyless) APIs. +In this guide we will cover the features and resources available to you when creating custom functions, highlighting where there are limitations for the different middleware stages. -The difference between the middleware types are: +## Scripting basics +Here we cover various facets that you need to be aware of when creating custom functions for Tyk. -1. **Pre**: These middleware instances do not have access to the session object (as it has not been created yet) and therefore cannot perform modification actions on them. - -2. **Post**: These middleware components have access to the session object (the user quota, allowances and auth data), but have the option to disable it, as deserialising it into the JSVM is computationally expensive and can add latency. +### Accessing external and dynamic data +JS functions can be given access to external data objects relating to the API request. These allow for the modification of both the request itself and the session: + - `request`: an [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-request-object" >}}) describing the API request that invoked the middleware + - `session`: the key session [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-session-object" >}}) provided by the client when making the API request + - `config`: an [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-config-object" >}}) containing fields from the API definition {{< note success >}} **Note** -A new JSVM instance is created for _each_ API that is managed, this means that inter-API communication is not possible via shared methods (they have different bounds), however it _is_ possible using the session object if a key is shared across APIs. +There are other ways of accessing and editing a session object using the [Tyk JavaScript API functions]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api#Working-with-the-key-session-object" >}}). {{< /note >}} +### Creating a middleware component +Tyk injects a `TykJS` namespace into the JSVM, this namespace can be used to initialise a new middleware component. The JS for each middleware component should be in its own `*.js` file. - -### Declared Plugin Functions - -Plugin functions are available globally in the same namespace. So, if you include two or more JSVM plugins that call the same function, the last declared plugin implementation of the function will be returned. - -### Enable the JSVM - -Before you can use Javascript Middleware you will need to enable the JSVM - -You can do this by setting `enable_jsvm` to `true` in your `tyk.conf` file. - -#### Creating a middleware component - -Tyk injects a `TykJS` namespace into the JSVM, this namespace can be used to initialise a new middleware component. Each middleware component should be in its own `*.js` file. +You create a middleware object by calling the `TykJS.TykMiddleware.NewMiddleware({})` constructor with an empty object and then initialising it with your function using the `NewProcessRequest()` closure syntax. This is where you expose the [external data objects]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#accessing-external-and-dynamic-data" >}}) to your custom function. {{< note success >}} **Note** -The middleware variable name should match the name of the file it's in. + - For Custom JS plugins and Dynamic Event Handlers, the filename of the file containing the source code must match the function name + - Virtual Endpoints do not have this limitation {{< /note >}} +### Returning from the middleware +When returning from the middleware, you provide specific return data depending upon the type of middleware. +#### Returning from Custom JS plugin +A custom JS plugin can modify fields in the API request and the session metadata, however this is not performed directly within the JSVM so the required updates must be passed out of the JSVM for Tyk to apply the changes. This is a requirement and omitting them can cause the middleware to fail. -Creating a middleware object is done my calling the `TykJS.TykMiddleware.NewMiddleware({})` constructor with an empty object and then initialising it with your function using the `NewProcessRequest()` closure syntax. +The JS function must provide the `request` and `session.meta_data` objects in the `ReturnData` as follows: +``` .js +return sampleMiddleware.ReturnData(request, session.meta_data); +``` -Here is an example implementation: +Custom JS plugins sit in the [middleware processing chain]({{< ref "concepts/middleware-execution-order" >}}) and pass the request onto the next middleware before it is proxied to the upstream. If required, however, a custom JS plugin can terminate the request and provide a custom response to the client if you configure the `ReturnOverrides` in the `request` object, as described [here]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#using-returnoverrides" >}}). -```{.copyWrapper} -/* --- sampleMiddleware.js --- */ +#### Returning from Virtual Endpoint +Unlike custom JS plugins, Virtual Endpoints always [terminate the request]({{< ref "advanced-configuration/compose-apis/virtual-endpoints#how-virtual-endpoints-work" >}}) so have a different method of returning from the JS function. -// Create your middleware object -var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({}); +The function must return a `responseObject`. This is crucial as it determines the HTTP response that will be sent back to the client. The structure of this object is defined to ensure that the virtual endpoint can communicate the necessary response details back to the Tyk Gateway, which then forwards it to the client. -// Initialise it with your functionality by passing a closure that accepts two objects -// into the NewProcessRequest() function: -sampleMiddleware.NewProcessRequest(function(request, session, spec) { +The `responseObject` has the following structure: + - `code`: an integer representing the HTTP status code of the response + - `headers`: an object containing key-value pairs representing the HTTP headers of the response + - `body`: a string that represents the body of the response which can be plain text, JSON, or XML, depending on what your API client expects to receive - console.log("This middleware does nothing, but will print this to your terminal.") - - // You MUST return both the request and session metadata - return sampleMiddleware.ReturnData(request, session.meta_data); -}); +You must provide the `responseObject` together with the `session.meta_data` as parameters in a call to `TykJsResponse` as follows: +``` .js + return TykJsResponse(responseObject, session.meta_data); ``` -#### Middleware component variables - -As well as the API functions that all JSVM components share, the middleware components have access to some data structures that are performant and allow for the modification of both the request itself and the session. These objects are exposed to the middleware in the form of the `request`, `session` and `spec` objects in the `NewProcessRequest(function(request, session) {};` call. +You can find some examples of how this works [here]({{< ref "advanced-configuration/compose-apis/demo-virtual-endpoint" >}}). -In the example above, we can see that we return 2 of these variables (`request` and `session` meta data) - this is a requirement, and omitting it can cause the middleware to fail, this line should be called at the end of each process: - -``` -return sampleMiddleware.ReturnData(request, session.meta_data); -``` +## JavaScript resources +JavaScript (JS) functions have access to a [system API]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api" >}}) and [library of functions]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#underscorejs-library" >}}). They can also be given access to certain Tyk data objects relating to the API request. -This allows the middleware machinery to perform the necessary writes and changes to the two main context objects. +The system API provides access to resources outside of the JavaScript Virtual Machine sandbox, the ability to make outbound HTTP requests and access to the key management REST API functions. -#### The `request` object +### The `request` object +The `request` object provides a set of arrays that describe the API request. These can be manipulated and, when changed, will affect the request as it passes through the middleware pipeline. -The `request` object provides a set of arrays that can be manipulated, that when changed, will affect the request as it passes through the middleware pipeline, the `request` object looks like this: +The structure of the `request` object is: -```{.copyWrapper} +``` .go { Headers map[string][]string SetHeaders map[string]string @@ -98,7 +90,6 @@ The `request` object provides a set of arrays that can be manipulated, that when DeleteParams []string ReturnOverrides { ResponseCode: int - ResponseError: string ResponseBody: string ResponseHeaders []string } @@ -108,107 +99,129 @@ The `request` object provides a set of arrays that can be manipulated, that when Scheme string } ``` -{{< note success >}} -**Note** - -From v2.9.3, `ResponseError` has been deprecated. You should use `ResponseBody` instead. -{{< /note >}} - -- `Headers`: This is an object of string arrays, and represents the current state of the request header. This object cannot be modified directly, but can be used to read header data. -- `SetHeaders`: This is a key-value map that will be set in the header when the middleware returns the object, existing headers will be overwritten and new headers will be added. -- `DeleteHeaders`: Any header name that is in this list will be deleted from the outgoing request. `DeleteHeaders` happens before `SetHeaders`. -- `Body`: This represents the body of the request, if you modify this field it will overwrite the request. -- `URL`: This represents the path portion of the outbound URL, use this to redirect a URL to a different endpoint upstream. -- `AddParams`: You can add parameters to your request here, for example internal data headers that are only relevant to your network setup. -- `DeleteParams`: These parameters will be removed from the request as they pass through the middleware. `DeleteParams` happens before `AddParams`. -- `ReturnOverrides`: Values stored here are used to stop or halt middleware execution and return an error code if the middleware operation has failed. You can also set the `ResponseHeader` for the response. -- `IgnoreBody`: If this parameter is set to true, the original request body will be used. If set to false the `Body` field will be used, this is the default behavior. -- `Method`: Contains the HTTP method (`GET`, `POST`, etc.). -- `RequestURI`: Contains the request URI, including the query string, e.g. `/path?key=value`. -- `Scheme`: Contains the URL scheme, e.g. `http`, `https`. - -#### JSVM Example -``` +- `Headers`: this is an object of string arrays, and represents the current state of the request header; this object cannot be modified directly, but can be used to read header data +- `SetHeaders`: this is a key-value map that will be set in the header when the middleware returns the object; existing headers will be overwritten and new headers will be added +- `DeleteHeaders`: any header name that is in this list will be deleted from the outgoing request; note that `DeleteHeaders` happens before `SetHeaders` +- `Body`: this represents the body of the request, if you modify this field it will overwrite the request +- `URL`: this represents the path portion of the outbound URL, you can modify this to redirect a URL to a different upstream path +- `AddParams`: you can add parameters to your request here, for example internal data headers that are only relevant to your network setup +- `DeleteParams`: these parameters will be removed from the request as they pass through the middleware; note `DeleteParams` happens before `AddParams` +- `ReturnOverrides`: values stored here are used to stop or halt middleware execution and return an error code +- `IgnoreBody`: if this parameter is set to `true`, the original request body will be used; if set to `false` the `Body` field will be used (`false` is the default behaviour) +- `Method`: contains the HTTP method (`GET`, `POST`, etc.) +- `RequestURI`: contains the request URI, including the query string, e.g. `/path?key=value` +- `Scheme`: contains the URL scheme, e.g. `http`, `https` + +#### Using `ReturnOverrides` +If you configure values in `request.ReturnOverrides` then Tyk will terminate the request and provide a response to the client when the function completes. The request will not be proxied to the upstream. + +The response will use the parameters configured in `ReturnOverrides`: + - `ResponseCode` + - `ResponseBody` + - `ResponseHeaders` + +In this example, if the condition is met, Tyk will return `HTTP 403 Access Denied` with the custom header `"X-Error":"the-condition"`: + +``` .js var testJSVMData = new TykJS.TykMiddleware.NewMiddleware({}); testJSVMData.NewProcessRequest(function(request, session, config) { - request.ReturnOverrides.ResponseError = "Foobarbaz" - request.ReturnOverrides.ResponseBody = "Foobar" - request.ReturnOverrides.ResponseCode = 200 - request.ReturnOverrides.ResponseHeaders = { - "X-Foo": "Bar", - "X-Baz": "Qux" - } - return testJSVMData.ReturnData(request, {}); + // Logic to determine if the request should be overridden + if (someCondition) { + request.ReturnOverrides.response_code = 403; + request.ReturnOverrides.response_body = "Access Denied"; + request.ReturnOverrides.headers = {"X-Error": "the-condition"}; + // This stops the request from proceeding to the upstream + } + return testJSVMData.ReturnData(request, session.meta_data); }); ``` -{{< note success >}} -**Note** - -Fom v2.9.3 you should use `ResponseBody`. `ResponseError` has been deprecated. -{{< /note >}} - +### The `session` object +Tyk uses an internal [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) to handle the quota, rate limits, access allowances and auth data of a specific key. JS middleware can be granted access to the session object but have the option to disable it as deserialising it into the JSVM is computationally expensive and can add latency. Other than the `meta_data` field, the session object itself cannot be directly edited as it is crucial to the correct functioning of Tyk. -Using the methods outlined above, alongside the API functions that are made available to the VM, allows for a powerful set of tools for shaping and structuring inbound traffic to your API, as well as processing, validating or re-structuring the data as it is inbound. +#### Limitations + - Custom JS plugins at the [pre-]({{< ref "" >}}) stage do not have access to the session object (as it has not been created yet) + - When scripting for Virtual Endpoints, the `session` data will only be available to the JS function if enabled in the middleware configuration. -#### The `session` object +#### Sharing data between middleware using the `session` object +For different middleware to be able to transfer data between each other, the session object makes available a `meta_data` key/value field that is written back to the session store (and can be retrieved by the middleware down the line) - this data is permanent, and can also be retrieved by the REST API from outside of Tyk using the `/tyk/keys/` method. -Tyk uses an internal session representation to handle the quota, rate limits, and access allowances of a specific key. This data can be made available to POST-processing middleware for processing. the session object itself cannot be edited, as it is crucial to the correct functioning of Tyk. +{{< note success >}} +**Note** +A new JSVM instance is created for _each_ API that is managed, this means that inter-API communication is not possible via shared methods (they have different bounds), however it _is_ possible using the session object if a key is shared across APIs. +{{< /note >}} -In order for middleware to be able to transfer data between each other, the session object makes available a `meta_data` key/value field that is written back to the session store (and can be retrieved by the middleware down the line) - this data is permanent, and can also be retrieved by the REST API from outside of Tyk using the `/tyk/keys/` method. +### The `config` object +The third Tyk data object that is made available to the script running in the JSVM contains data from the API Definition. This is read-only and cannot be modified by the JS function. The structure of this object is: + - `APIID`: the unique identifier for the API + - `OrgID`: the organisation identifier + - `config_data`: custom attributes defined in the API description -The session object has the same representation as the one used by the API: +#### Adding custom attributes to the API Definition +When working with Tyk OAS APIs, you can add custom attributes in the `data` object in the `x-tyk-api-gateway.middleware.global.pluginConfig` section of the API definition, for example: -```{.copyWrapper} +```.json {linenos=true, linenostart=1} { - "allowance": 999, - "rate": 1000, - "per": 60, - "expires": 0, - "quota_max": -1, - "quota_renews": 1406121006, - "quota_remaining": 0, - "quota_renewal_rate": 60, - "access_rights": { - "234a71b4c2274e5a57610fe48cdedf40": { - "api_name": "Versioned API", - "api_id": "234a71b4c2274e5a57610fe48cdedf40", - "versions": [ - "v1" - ] + "x-tyk-api-gateway": { + "middleware": { + "global": { + "pluginConfig": { + "data": { + "enabled": true, + "value": { + "foo": "bar" + } + } + } + } } - }, - "org_id": "53ac07777cbb8c2d53000002", - "meta_data": { - "your-key": "your-value" } } ``` -There are other ways of accessing and editing a session object by using the Tyk JSVM API functions. +When working with Tyk Classic APIs, you simply add the attributes in the `config_data` object in the root of the API definition: +```.json {linenos=true, linenostart=1} +{ + "config_data": { + "foo": "bar" + } +} +``` + +### Underscore.js Library +In addition to our Tyk JavaScript API functions, you also have access to all the functions from the http://underscorejs.org/ library. -#### Passing Custom Attributes to Middleware +Underscore.js is a JavaScript library that provides a lot of useful functional programming helpers without extending any built-in objects. Underscore provides over 100 functions that support your favourite functional helpers: -You can use the `config_data` special field in your API definition to pass custom attributes to middleware via the JSVM. +* map +* filter +* invoke -#### Adding `config_data` to an API Definition +There are also more specialised goodies, including: -Add the following to the root of your API definition: +* function binding +* JavaScript templating +* creating quick indexes +* deep equality testing -```{.copyWrapper} -"config_data": { - "foo": "bar" -}, -``` +## Example +In this basic example, we show the creation and initialisation of a middleware object. Note how the three Tyk data objects (`request`, `session`, `config`) are made available to the function and the two objects that are returned from the function (in case the external objects need to be updated). -#### Sample use of `config_data` +``` .js {linenos=true, linenostart=1} +/* --- sampleMiddleware.js --- */ -``` -var testJSVMData = new TykJS.TykMiddleware.NewMiddleware({}); -testJSVMData.NewProcessRequest(function(request, session, spec) { - request.SetHeaders["data-foo"] = spec.config_data.foo; - return testJSVMData.ReturnData(request, {}); +// Create new middleware object +var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({}); + +// Initialise the object with your functionality by passing a closure that accepts +// two objects into the NewProcessRequest() function: +sampleMiddleware.NewProcessRequest(function(request, session, config) { + + console.log("This middleware does nothing, but will print this to your terminal.") + + // You MUST return both the request and session metadata + return sampleMiddleware.ReturnData(request, session.meta_data); }); -``` +``` \ No newline at end of file diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md new file mode 100644 index 0000000000..e863ed1849 --- /dev/null +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -0,0 +1,115 @@ +--- +title: Using the Virtual Endpoint middleware with Tyk Classic APIs +date: 2024-02-29 +description: "Using the Virtual Endpoint middleware with Tyk Classic APIs" +tags: ["virtual endpoint", "middleware", "per-endpoint", "Tyk Classic", "Tyk Classic API"] +--- + +The [virtual endpoint]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}) middleware provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself, without the need to proxy the request to an upstream service. This functionality is particularly useful for a variety of use cases, including request transformation, aggregation of responses from multiple services, or implementing custom authentication mechanisms. + +This middleware is configured in the Tyk Classic API Definition. You can do this via the Tyk Dashboard API or in the API Designer. + +If you're using the newer Tyk OAS APIs, then check out the [Tyk OAS]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas" >}}) page. + +## Configuring the middleware in the Tyk Classic API Definition +If you want to use Virtual Endpoints, you must [enable Tyk's JavaScript Virtual Machine]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}) by setting `enable_jsvm` to `true` in your `tyk.conf` file. + +To enable the middleware you must add a new `virtual` object to the `extended_paths` section of your API definition. + +The `virtual` object has the following configuration: + - `path`: the path to match on + - `method`: the method to match on + - `response_function_name`: this is the name of the JavaScript function that will be executed when the virtual endpoint is triggered + - `function_source_type`: instructs the middleware to look for the JavaScript code either in a `file` or in a base64 encoded `blob`; the actual file location (or base64 encoded code) is provided in `function_source_uri` + - `function_source_uri`: if `function_source_type` is set to `file`, this will be the relative path to the source file containing the JavaScript code; if `function_source_type` if set to `blob`, this will be a `base64` encoded string containing the JavaScript code + - `use_session`: a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable + - `proxy_on_error`: a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response + +For example: +```.json {linenos=true, linenostart=1} +{ + "extended_paths": { + "virtual": [ + { + "response_function_name": "myUniqueFunctionName", + "function_source_type": "blob", + "function_source_uri": "ZnVuY3Rpb24gbXlVbmlxdWVGdW5jdGlvbk5hbWUocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7CiAgdmFyIHJlc3BvbnNlT2JqZWN0ID0geyAKICAgIEJvZHk6ICJUSElTIElTIEEgIFZJUlRVQUwgUkVTUE9OU0UiLCAKICAgIENvZGU6IDIwMCAKICB9CiAgcmV0dXJuIFR5a0pzUmVzcG9uc2UocmVzcG9uc2VPYmplY3QsIHNlc3Npb24ubWV0YV9kYXRhKQp9", + "path": "/anything", + "method": "GET", + "use_session": false, + "proxy_on_error": false + } + ] + } +} +``` + +In this example the Virtual Endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. For any call made to this endpoint, Tyk will invoke the function `myUniqueFunctionName` that is `base64` encoded in the `function_source_uri` field. This virtual endpoint does not require access to the session data and will not proxy the request on to the upstream if there is an error when processing the `myUniqueFunctionName` function. + +Decoding the value in `function_source_uri` we can see that the JavaScript code is: +``` .js {linenos=true, linenostart=1} + function myUniqueFunctionName(request, session, config) { + var responseObject = { + Body: "THIS IS A VIRTUAL RESPONSE", + Code: 200 + } + return TykJsResponse(responseObject, session.meta_data) + } +``` + +This function will terminate the request without proxying it to the upstream returning `HTTP 200` as follows: +``` {linenos=true, linenostart=1} +HTTP/1.1 200 OK +Date: Wed, 28 Feb 2024 20:52:30 GMT +Server: tyk +X-Ratelimit-Limit: 0 +X-Ratelimit-Remaining: 0 +X-Ratelimit-Reset: 0 +Content-Length: 27 +Content-Type: text/plain; charset=utf-8 + +THIS IS A VIRTUAL RESPONSE +``` + +If, however, we introduce an error to the JavaScript, such that Tyk fails to process the function, we will receive an `HTTP 500 Internal Server Error` as follows: +``` {linenos=true, linenostart=1} +HTTP/1.1 500 Internal Server Error +Content-Type: application/json +X-Generator: tyk.io +Date: Wed, 28 Feb 2024 20:55:27 GMT +Content-Length: 99 + +{ +"error": "Error during virtual endpoint execution. Contact Administrator for more details." +} +``` + +If we set `proxy_on_error` to `true` and keep the error in the Javascript, the request will be forwarded to the upstream and Tyk will return the response received that service. + +## Configuring the middleware in the API Designer +You can use the API Designer in the Tyk Dashboard to configure the internal endpoint middleware for your Tyk Classic API by following these steps. + +#### Step 1: Add an endpoint for the path and select the plugin +From the **Endpoint Designer** add an endpoint that matches the path for which you want to trigger the virtual endpoint. Select the **Virtual Endpoint** plugin. + +{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-middleware.png" alt="Selecting the middleware" >}} + +#### Step 2: Configure the middleware +Once you have selected the virtual endpoint middleware for the endpoint, you need to supply: + - JS function to call + - Source type (`file` or `inline`) + +If you select source type `file` you must provide the path to the file: +{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-file.png" alt="Configuring file based JS code" >}} + +If you select `inline` you can enter the JavaScript code in the Code Editor window. +{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-inline.png" alt="Configuring inline JS code" >}} + +#### Step 3: Save the API +Use the *save* or *create* buttons to save the changes and activate the Virtual Endpoint middleware. + +{{< note success >}} +**Note** + +The Tyk Classic API Designer does not provide options to configure `use_session` or `proxy_on_error`, but you can do this from the Raw Definition editor. +{{< /note >}} \ No newline at end of file diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md new file mode 100644 index 0000000000..95fa849db1 --- /dev/null +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -0,0 +1,151 @@ +--- +title: Using the Virtual Endpoint middleware with Tyk OAS APIs +date: 2024-02-29 +description: "Using the Virtual Endpoint middleware with Tyk OAS APIs" +tags: ["virtual endpoint", "middleware", "per-endpoint", "Tyk OAS", "Tyk OAS API"] +--- + +The [virtual endpoint]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}) middleware provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself, without the need to proxy the request to an upstream service. This functionality is particularly useful for a variety of use cases, including request transformation, aggregation of responses from multiple services, or implementing custom authentication mechanisms. + +The middleware is configured in the [Tyk OAS API Definition]({{< ref "tyk-apis/tyk-gateway-api/oas/x-tyk-oas-doc#operation" >}}). You can do this via the Tyk Dashboard API or in the API Designer. + +If you're using the legacy Tyk Classic APIs, then check out the [Tyk Classic]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic" >}}) page. + +## Configuring the middleware in the Tyk OAS API Definition +The design of the Tyk OAS API Definition takes advantage of the `operationID` defined in the OpenAPI Document that declares both the path and method for which the middleware should be added. + +The virtual endpoint middleware (`virtualEndpoint`) can be added to the `operations` section of the Tyk OAS Extension (`x-tyk-api-gateway`) in your Tyk OAS API Definition for the appropriate `operationId` (as configured in the `paths` section of your OpenAPI Document). + +The `virtualEndpoint` object has the following configuration: + - `enabled`: enable the middleware for the endpoint + - `name`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered + - `body`: [optional] a `base64` encoded string containing the JavaScript code + - `path`: [optional] the relative path to the source file containing the JavaScript code + - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response; defaults to `false` + - `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable; defaults to `false` + +{{< note success >}} +**Note** + +One of either `path` or `body` must be provided, depending on whether you are providing the JavaScript code in a file or inline within the API definition. If both are provided then `body` will take precedence. +{{< /note >}} + +For example: +```.json {hl_lines=["39-50", "54-58"],linenos=true, linenostart=1} +{ + "components": {}, + "info": { + "title": "example-virtual-endpoint", + "version": "1.0.0" + }, + "openapi": "3.0.3", + "paths": { + "/anything": { + "get": { + "operationId": "anythingget", + "responses": { + "200": { + "description": "" + } + } + } + } + }, + "x-tyk-api-gateway": { + "info": { + "name": "example-virtual-endpoint", + "state": { + "active": true, + "internal": false + } + }, + "upstream": { + "url": "http://httpbin.org/" + }, + "server": { + "listenPath": { + "value": "/example-virtual-endpoint/", + "strip": true + } + }, + "middleware": { + "global": { + "pluginConfig": { + "data": { + "enabled": true, + "value": { + "map": { + " key": 3 + }, + "num": 4, + "string": "example" + } + } + } + }, + "operations": { + "anythingget": { + "virtualEndpoint": { + "enabled": true, + "name": "myVirtualHandler", + "body": "ZnVuY3Rpb24gbXlWaXJ0dWFsSGFuZGxlciAocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7ICAgICAgCiAgdmFyIHJlc3BvbnNlT2JqZWN0ID0gewogICAgQm9keTogIlZpcnR1YWwgRW5kcG9pbnQgIitjb25maWcuY29uZmlnX2RhdGEuc3RyaW5nLAogICAgSGVhZGVyczogewogICAgICAiZm9vLWhlYWRlciI6ICJiYXIiLAogICAgICAibWFwLWhlYWRlciI6IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5jb25maWdfZGF0YS5tYXApLAogICAgICAic3RyaW5nLWhlYWRlciI6IGNvbmZpZy5jb25maWdfZGF0YS5zdHJpbmcsCiAgICAgICJudW0taGVhZGVyIjogSlNPTi5zdHJpbmdpZnkoY29uZmlnLmNvbmZpZ19kYXRhLm51bSkKICAgIH0sCiAgICAgIENvZGU6IDIwMAogIH0KICByZXR1cm4gVHlrSnNSZXNwb25zZShyZXNwb25zZU9iamVjdCwgc2Vzc2lvbi5tZXRhX2RhdGEpCn0=" + } + } + } + } + } +} +``` + +In this example the virtual endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. We have also configured the following custom attributes in the `pluginConfig` section of the API definition: +``` .json +{ + "map": { + " key": 3 + }, + "num": 4, + "string": "example" +} +``` + +The `body` field value is a `base64` encoded string containing this JavaScript code, which will be invoked by the virtual endpoint middleware: +``` .js +function myVirtualHandler (request, session, config) { + var responseObject = { + Body: "Virtual Endpoint "+config.config_data.string, + 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) +} +``` + +A call to the `GET /anything` endpoint returns: +``` +HTTP/1.1 200 OK +Date: Fri, 01 Mar 2024 12:14:36 GMT +Foo-Header: bar +Map-Header: {" key":3} +Num-Header: 4 +Server: tyk +String-Header: example +X-Ratelimit-Limit: 0 +X-Ratelimit-Remaining: 0 +X-Ratelimit-Reset: 0 +Content-Length: 24 +Content-Type: text/plain; charset=utf-8 + +Virtual Endpoint example +``` + +The configuration above is a complete and valid Tyk OAS API Definition that you can import into Tyk to try out the virtual endpoint middleware. + +## Configuring the middleware in the API Designer +Adding a Virtual Endpoint to your API endpoints is easy when using the API Designer in the Tyk Dashboard, simply follow the steps taken in this short video: + + < placeholder for video > diff --git a/tyk-docs/data/menu.yaml b/tyk-docs/data/menu.yaml index f7f485e841..f8efccdb95 100644 --- a/tyk-docs/data/menu.yaml +++ b/tyk-docs/data/menu.yaml @@ -1968,36 +1968,32 @@ menu: path: /plugins/supported-languages/golang category: Page show: True - - title: "Javascript" + - title: "JavaScript" category: Directory show: True menu: - - title: "JavaScript Middleware" + - title: "Overview" path: /plugins/supported-languages/javascript-middleware category: Page show: True - - title: "Install Middleware" - path: /plugins/supported-languages/javascript-middleware/install-middleware/install-middleware - category: Page - show: True - - title: "Install Middleware on Tyk OSS" - path: /plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce + - title: "JS Scripting Guide" + path: /plugins/supported-languages/javascript-middleware/middleware-scripting-guide category: Page - show: True - - title: "Install Middleware on Tyk Multi-Cloud" - path: /plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid + show: True + - title: "JavaScript API" + path: /plugins/supported-languages/javascript-middleware/javascript-api category: Page - show: True - - title: "Install Middleware on Tyk Pro" + show: True + - title: "Using JS plugins with Tyk Self-Managed" path: /plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro category: Page show: True - - title: "JavaScript API" - path: /plugins/supported-languages/javascript-middleware/javascript-api + - title: "Using JS plugins with Tyk Hybrid" + path: /plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid category: Page - show: True - - title: "Middleware Scripting Guide" - path: /plugins/supported-languages/javascript-middleware/middleware-scripting-guide + show: True + - title: "Using JS plugins with Tyk OSS" + path: /plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce category: Page show: True - title: "WAF (OSS) ModSecurity Plugin example" @@ -2088,26 +2084,30 @@ menu: path: /plugins/supported-languages/rich-plugins/luajit/tutorial-add-demo-plugin-api category: Page show: True - - title: "Compose APIs" + - title: "Virtual Endpoints" category: Directory show: True menu: - - title: "Compose APIs" - path: /advanced-configuration/compose-apis + - title: "Overview" + path: /advanced-configuration/compose-apis/virtual-endpoints category: Page show: True - - title: "Virtual Endpoint Demonstration" - path: /advanced-configuration/compose-apis/demo-virtual-endpoint + - title: "Tyk OAS configuration" + path: /product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas category: Page show: True - - title: "Example Batch Processing Aggregate Function" - path: /advanced-configuration/compose-apis/sample-batch-funtion + - title: "Tyk Classic configuration" + path: /product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic category: Page show: True - - title: "Virtual Endpoints" - path: /advanced-configuration/compose-apis/virtual-endpoints + - title: "Examples" + path: /advanced-configuration/compose-apis/demo-virtual-endpoint category: Page show: True + - title: "Running multiple instances of Tyk Gateway" + path: /deployment-and-operations/tyk-open-source-api-gateway/setup-multiple-gateways + category: Page + show: True - title: "Error Templates" path: /advanced-configuration/error-templates category: Page From 4d8907c1fd409376461121311b8c0c74b3616ab7 Mon Sep 17 00:00:00 2001 From: andyo-tyk <99968932+andyo-tyk@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:18:09 +0000 Subject: [PATCH 02/35] Adjusted for new contract For consistency with API-level plugin middleware, the `name` field has been updated to `functionName`. --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 95fa849db1..9089bef957 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -18,7 +18,7 @@ The virtual endpoint middleware (`virtualEndpoint`) can be added to the `operati The `virtualEndpoint` object has the following configuration: - `enabled`: enable the middleware for the endpoint - - `name`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered + - `functionName`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered - `body`: [optional] a `base64` encoded string containing the JavaScript code - `path`: [optional] the relative path to the source file containing the JavaScript code - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response; defaults to `false` @@ -87,7 +87,7 @@ For example: "anythingget": { "virtualEndpoint": { "enabled": true, - "name": "myVirtualHandler", + "functionName": "myVirtualHandler", "body": "ZnVuY3Rpb24gbXlWaXJ0dWFsSGFuZGxlciAocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7ICAgICAgCiAgdmFyIHJlc3BvbnNlT2JqZWN0ID0gewogICAgQm9keTogIlZpcnR1YWwgRW5kcG9pbnQgIitjb25maWcuY29uZmlnX2RhdGEuc3RyaW5nLAogICAgSGVhZGVyczogewogICAgICAiZm9vLWhlYWRlciI6ICJiYXIiLAogICAgICAibWFwLWhlYWRlciI6IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5jb25maWdfZGF0YS5tYXApLAogICAgICAic3RyaW5nLWhlYWRlciI6IGNvbmZpZy5jb25maWdfZGF0YS5zdHJpbmcsCiAgICAgICJudW0taGVhZGVyIjogSlNPTi5zdHJpbmdpZnkoY29uZmlnLmNvbmZpZ19kYXRhLm51bSkKICAgIH0sCiAgICAgIENvZGU6IDIwMAogIH0KICByZXR1cm4gVHlrSnNSZXNwb25zZShyZXNwb25zZU9iamVjdCwgc2Vzc2lvbi5tZXRhX2RhdGEpCn0=" } } From d3a8a9abd631b4f0a59af5e8cde1317badf96c08 Mon Sep 17 00:00:00 2001 From: andyo-tyk <99968932+andyo-tyk@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:21:10 +0000 Subject: [PATCH 03/35] Added detail on the JSVM --- .../plugins/supported-languages/javascript-middleware.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware.md index f1a51da806..41bc727fbd 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware.md @@ -27,6 +27,8 @@ The JavaScript (JS) [scripting guide]({{< ref "plugins/supported-languages/javas JavaScript functions are available globally in the same namespace. So, if you include two or more JSVM plugins that call the same function, the last declared plugin implementation of the function will be returned. ## Enabling the JavaScript Virtual Machine (JSVM) +The JavaScript Virtual Machine (JSVM) provided in the Gateway is a traditional ECMAScript5 compatible environment. + Before you can use JavaScript customisation in any component you will need to enable the JSVM. You do this by setting `enable_jsvm` to `true` in your `tyk.conf` [file]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}). From bfe1edde82b75fd8faa36db18d5951ddd82b199a Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:16:10 +0000 Subject: [PATCH 04/35] Update tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md --- .../compose-apis/demo-virtual-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index ed61b159b0..92b8797751 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -20,7 +20,7 @@ function myFirstVirtualHandler (request, session, config) { log("Request Body: " + request.Body) log("Session: " + JSON.stringify(session.allowance)) log("Config: " + JSON.stringify(config.APIID)) - log("param-1: " + request.Params["param1"]) // case matters + log("param-1: " + request.Params["param1"]) // case sensitive log("auth Header: " + request.Headers["Authorization"]) // case matters var responseObject = { From db33c412c1694b1f34ef17b6502edc9330456783 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:16:17 +0000 Subject: [PATCH 05/35] Update tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md --- .../compose-apis/demo-virtual-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index 92b8797751..f6e0bc72f9 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -21,7 +21,7 @@ function myFirstVirtualHandler (request, session, config) { log("Session: " + JSON.stringify(session.allowance)) log("Config: " + JSON.stringify(config.APIID)) log("param-1: " + request.Params["param1"]) // case sensitive - log("auth Header: " + request.Headers["Authorization"]) // case matters + log("auth Header: " + request.Headers["Authorization"]) // case sensitive var responseObject = { Body: "VIRTUAL ENDPOINT EXAMPLE #1", From 46bea3ab3d8127b8d3253f0227e250091c429ac8 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:16:36 +0000 Subject: [PATCH 06/35] Update tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md --- .../compose-apis/demo-virtual-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index f6e0bc72f9..3847aba264 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -69,7 +69,7 @@ time="" level=info msg="auth Header: " prefix=jsvm type=log-ms You can add [custom attributes]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#passing-custom-attributes-to-middleware" >}}) to the API definition and access these from within your Virtual Endpoint. 1. Add the following custom attributes to your API definition: -```{.json} +```json { "string": "string", "map": { From dc7ca59a1f8a137cd2610eefd76d8eb1397149f7 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:17:14 +0000 Subject: [PATCH 07/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 5242c4d2b9..56e764e9bf 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -150,7 +150,7 @@ For different middleware to be able to transfer data between each other, the ses {{< note success >}} **Note** -A new JSVM instance is created for _each_ API that is managed, this means that inter-API communication is not possible via shared methods (they have different bounds), however it _is_ possible using the session object if a key is shared across APIs. +A new JSVM instance is created for _each_ API that is managed. Consequently, inter-API communication is not possible via shared methods, since they have different bounds. However, it _is_ possible using the session object if a key is shared across APIs. {{< /note >}} ### The `config` object From 6d1092af109c206d3ed435a69766f7b444dd85ce Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:18:04 +0000 Subject: [PATCH 08/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 56e764e9bf..7f5c482fcf 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -191,7 +191,7 @@ When working with Tyk Classic APIs, you simply add the attributes in the `config ``` ### Underscore.js Library -In addition to our Tyk JavaScript API functions, you also have access to all the functions from the http://underscorejs.org/ library. +In addition to our Tyk JavaScript API functions, you also have access to all the functions from the [underscore](http://underscorejs.org) library. Underscore.js is a JavaScript library that provides a lot of useful functional programming helpers without extending any built-in objects. Underscore provides over 100 functions that support your favourite functional helpers: From 7d5ce103fd45762b9cf202dcff3532f1d1d0bed6 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:19:23 +0000 Subject: [PATCH 09/35] Update tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md --- .../advanced-configuration/compose-apis/virtual-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md index 9ef3c97034..8ffdd0b257 100755 --- a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md @@ -15,7 +15,7 @@ The Virtual Endpoint is an extremely powerful feature that is unique to Tyk and ## When to use virtual endpoints #### Aggregating data from multiple services -From a virtual endpoint, you can make calls out to other internal and upstream APIs. You can then aggregate and process the responses, returning a single response object to the originating client. This allows you to configure a single externally facing API to simplify interaction with multiple internal services, leaving the heavy lifting to Tyk rather than standing up an aggregation service within your stack. +From a virtual endpoint, you can make calls out to other internal and upstream APIs. You can then aggregate and process the responses, returning a single response object to the originating client. This allows you to configure a single externally facing API to simplify interaction with multiple internal services, leaving the heavy lifting to Tyk rather than starting up an aggregation service within your stack. #### Enforcing custom policies Tyk provides a very flexible [middleware chain]({{< ref "concepts/middleware-execution-order" >}}) where you can combine functions to implement the access controls you require to protect your upstream services. Of course, not all scenarios can be covered by Tyk's standard middleware functions, but you can use a virtual endpoint to apply whatever custom logic you require to optimise your API experience. From bf3e8b04c5bff3f52bd34fcc878003fb38cc198d Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:21:12 +0000 Subject: [PATCH 10/35] Update tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md --- .../compose-apis/demo-virtual-endpoint.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index 3847aba264..3254bfef94 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -80,7 +80,7 @@ You can add [custom attributes]({{< ref "plugins/supported-languages/javascript- ``` 2. Enable the Virtual Endpoint middleware on an endpoint of your API and paste this JavaScript into the API Designer (or save in a file and reference it from the middleware config): -```.js +```js function mySecondVirtualHandler (request, session, config) { var responseObject = { Body: "VIRTUAL ENDPOINT EXAMPLE #2", From 6513c9066b358bc346a6b3c5949cb9a622852eb7 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:22:24 +0000 Subject: [PATCH 11/35] Update tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md --- .../tyk-gateway/middleware/virtual-endpoint-tyk-classic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md index e863ed1849..22cb267587 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -84,7 +84,7 @@ Content-Length: 99 } ``` -If we set `proxy_on_error` to `true` and keep the error in the Javascript, the request will be forwarded to the upstream and Tyk will return the response received that service. +If we set `proxy_on_error` to `true` and keep the error in the Javascript, the request will be forwarded to the upstream and Tyk will return the response received from that service. ## Configuring the middleware in the API Designer You can use the API Designer in the Tyk Dashboard to configure the internal endpoint middleware for your Tyk Classic API by following these steps. From dce7e9f65dd7683ab0d5d28c7335272dff5d6613 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:23:33 +0000 Subject: [PATCH 12/35] Update tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 9089bef957..e6d13c1155 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -21,7 +21,7 @@ The `virtualEndpoint` object has the following configuration: - `functionName`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered - `body`: [optional] a `base64` encoded string containing the JavaScript code - `path`: [optional] the relative path to the source file containing the JavaScript code - - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response; defaults to `false` + - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response. Defaults to `false` - `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable; defaults to `false` {{< note success >}} From c2136386ad4b7aaeb26038e90a5d6b55c4d71d3c Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:23:56 +0000 Subject: [PATCH 13/35] Update tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index e6d13c1155..d817c29154 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -22,7 +22,7 @@ The `virtualEndpoint` object has the following configuration: - `body`: [optional] a `base64` encoded string containing the JavaScript code - `path`: [optional] the relative path to the source file containing the JavaScript code - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response. Defaults to `false` - - `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable; defaults to `false` + - `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable. Defaults to `false` {{< note success >}} **Note** From 4383ab2533a91b28b7293d9fdec21df2bfe4af84 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:24:20 +0000 Subject: [PATCH 14/35] Update tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index d817c29154..5aa6a3de1d 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -98,7 +98,7 @@ For example: ``` In this example the virtual endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. We have also configured the following custom attributes in the `pluginConfig` section of the API definition: -``` .json +```json { "map": { " key": 3 From 8e0699b15eb14d1e39cec099c6326052db3bcaed Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:24:42 +0000 Subject: [PATCH 15/35] Update tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 5aa6a3de1d..b6f38c10cd 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -109,7 +109,7 @@ In this example the virtual endpoint middleware has been configured for HTTP `GE ``` The `body` field value is a `base64` encoded string containing this JavaScript code, which will be invoked by the virtual endpoint middleware: -``` .js +```js function myVirtualHandler (request, session, config) { var responseObject = { Body: "Virtual Endpoint "+config.config_data.string, From e222e2c7125df69edd7f250505b3f2fa04a2571e Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:25:16 +0000 Subject: [PATCH 16/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 7f5c482fcf..c382d46edf 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -28,7 +28,7 @@ There are other ways of accessing and editing a session object using the [Tyk Ja {{< /note >}} ### Creating a middleware component -Tyk injects a `TykJS` namespace into the JSVM, this namespace can be used to initialise a new middleware component. The JS for each middleware component should be in its own `*.js` file. +Tyk injects a `TykJS` namespace into the JSVM, which can be used to initialise a new middleware component. The JS for each middleware component should be in its own `*.js` file. You create a middleware object by calling the `TykJS.TykMiddleware.NewMiddleware({})` constructor with an empty object and then initialising it with your function using the `NewProcessRequest()` closure syntax. This is where you expose the [external data objects]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#accessing-external-and-dynamic-data" >}}) to your custom function. From ff55358ce9914747523190271f4ad0ca1f50af20 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:25:58 +0000 Subject: [PATCH 17/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index c382d46edf..278c9e2d70 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -35,7 +35,7 @@ You create a middleware object by calling the `TykJS.TykMiddleware.NewMiddleware {{< note success >}} **Note** - - For Custom JS plugins and Dynamic Event Handlers, the filename of the file containing the source code must match the function name + - For Custom JS plugins and Dynamic Event Handlers, the source code filename must match the function name - Virtual Endpoints do not have this limitation {{< /note >}} From 3c4a8d0dc225c69ae7b3bad23ab15c94f55d954c Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:26:22 +0000 Subject: [PATCH 18/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 278c9e2d70..1d5032149b 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -46,7 +46,7 @@ When returning from the middleware, you provide specific return data depending u A custom JS plugin can modify fields in the API request and the session metadata, however this is not performed directly within the JSVM so the required updates must be passed out of the JSVM for Tyk to apply the changes. This is a requirement and omitting them can cause the middleware to fail. The JS function must provide the `request` and `session.meta_data` objects in the `ReturnData` as follows: -``` .js +```js return sampleMiddleware.ReturnData(request, session.meta_data); ``` From 1746db2bc3a4d13a75b4d8b8bb6db63f67e20079 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:27:12 +0000 Subject: [PATCH 19/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 1d5032149b..40957e8395 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -79,7 +79,7 @@ The `request` object provides a set of arrays that describe the API request. The The structure of the `request` object is: -``` .go +```go { Headers map[string][]string SetHeaders map[string]string From 36c910ce12b558cb1659b3cdf613d03882c57218 Mon Sep 17 00:00:00 2001 From: dcs3spp Date: Tue, 19 Mar 2024 11:28:09 +0000 Subject: [PATCH 20/35] Update tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md --- .../javascript-middleware/middleware-scripting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 40957e8395..19cd58ad05 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -139,7 +139,7 @@ testJSVMData.NewProcessRequest(function(request, session, config) { ``` ### The `session` object -Tyk uses an internal [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) to handle the quota, rate limits, access allowances and auth data of a specific key. JS middleware can be granted access to the session object but have the option to disable it as deserialising it into the JSVM is computationally expensive and can add latency. Other than the `meta_data` field, the session object itself cannot be directly edited as it is crucial to the correct functioning of Tyk. +Tyk uses an internal [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) to handle the quota, rate limits, access allowances and auth data of a specific key. JS middleware can be granted access to the session object but there is also the option to disable it as deserialising it into the JSVM is computationally expensive and can add latency. Other than the `meta_data` field, the session object itself cannot be directly edited as it is crucial to the correct functioning of Tyk. #### Limitations - Custom JS plugins at the [pre-]({{< ref "" >}}) stage do not have access to the session object (as it has not been created yet) From 57bc1289ea1199d235d09fa543bb8b3fc316cae4 Mon Sep 17 00:00:00 2001 From: Simon Pears Date: Thu, 21 Mar 2024 12:08:23 +0000 Subject: [PATCH 21/35] fix CI check caused by unpublished page in menu.yaml --- tyk-docs/data/menu.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tyk-docs/data/menu.yaml b/tyk-docs/data/menu.yaml index f8efccdb95..c90e1369b0 100644 --- a/tyk-docs/data/menu.yaml +++ b/tyk-docs/data/menu.yaml @@ -2104,10 +2104,6 @@ menu: path: /advanced-configuration/compose-apis/demo-virtual-endpoint category: Page show: True - - title: "Running multiple instances of Tyk Gateway" - path: /deployment-and-operations/tyk-open-source-api-gateway/setup-multiple-gateways - category: Page - show: True - title: "Error Templates" path: /advanced-configuration/error-templates category: Page From eb163ac1fffea83e7962dab5d1589f42338b7488 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 15:58:59 +0100 Subject: [PATCH 22/35] Sanitize virtual endpoints docs in product-stack --- .../virtual-endpoint-tyk-classic.md | 62 +++++++++++-------- .../middleware/virtual-endpoint-tyk-oas.md | 41 +++++++----- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md index 22cb267587..18a867282a 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -1,8 +1,13 @@ --- title: Using the Virtual Endpoint middleware with Tyk Classic APIs -date: 2024-02-29 -description: "Using the Virtual Endpoint middleware with Tyk Classic APIs" -tags: ["virtual endpoint", "middleware", "per-endpoint", "Tyk Classic", "Tyk Classic API"] +tags: + - virtual endpoint + - middleware + - per-endpoint + - Tyk Classic + - Tyk Classic API +description: Using the Virtual Endpoint middleware with Tyk Classic APIs +date: "2024-02-29" --- The [virtual endpoint]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}) middleware provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself, without the need to proxy the request to an upstream service. This functionality is particularly useful for a variety of use cases, including request transformation, aggregation of responses from multiple services, or implementing custom authentication mechanisms. @@ -12,21 +17,24 @@ This middleware is configured in the Tyk Classic API Definition. You can do this If you're using the newer Tyk OAS APIs, then check out the [Tyk OAS]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas" >}}) page. ## Configuring the middleware in the Tyk Classic API Definition + If you want to use Virtual Endpoints, you must [enable Tyk's JavaScript Virtual Machine]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}) by setting `enable_jsvm` to `true` in your `tyk.conf` file. To enable the middleware you must add a new `virtual` object to the `extended_paths` section of your API definition. The `virtual` object has the following configuration: - - `path`: the path to match on - - `method`: the method to match on - - `response_function_name`: this is the name of the JavaScript function that will be executed when the virtual endpoint is triggered - - `function_source_type`: instructs the middleware to look for the JavaScript code either in a `file` or in a base64 encoded `blob`; the actual file location (or base64 encoded code) is provided in `function_source_uri` - - `function_source_uri`: if `function_source_type` is set to `file`, this will be the relative path to the source file containing the JavaScript code; if `function_source_type` if set to `blob`, this will be a `base64` encoded string containing the JavaScript code - - `use_session`: a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable - - `proxy_on_error`: a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response + +- `path`: the path to match on +- `method`: the method to match on +- `response_function_name`: this is the name of the JavaScript function that will be executed when the virtual endpoint is triggered +- `function_source_type`: instructs the middleware to look for the JavaScript code either in a `file` or in a base64 encoded `blob`; the actual file location (or base64 encoded code) is provided in `function_source_uri` +- `function_source_uri`: if `function_source_type` is set to `file`, this will be the relative path to the source file containing the JavaScript code; if `function_source_type` if set to `blob`, this will be a `base64` encoded string containing the JavaScript code +- `use_session`: a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable +- `proxy_on_error`: a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response For example: -```.json {linenos=true, linenostart=1} + +```json {linenos=true, linenostart=1} { "extended_paths": { "virtual": [ @@ -47,7 +55,8 @@ For example: In this example the Virtual Endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. For any call made to this endpoint, Tyk will invoke the function `myUniqueFunctionName` that is `base64` encoded in the `function_source_uri` field. This virtual endpoint does not require access to the session data and will not proxy the request on to the upstream if there is an error when processing the `myUniqueFunctionName` function. Decoding the value in `function_source_uri` we can see that the JavaScript code is: -``` .js {linenos=true, linenostart=1} + +```js {linenos=true, linenostart=1} function myUniqueFunctionName(request, session, config) { var responseObject = { Body: "THIS IS A VIRTUAL RESPONSE", @@ -58,7 +67,8 @@ Decoding the value in `function_source_uri` we can see that the JavaScript code ``` This function will terminate the request without proxying it to the upstream returning `HTTP 200` as follows: -``` {linenos=true, linenostart=1} + +```http {linenos=true, linenostart=1} HTTP/1.1 200 OK Date: Wed, 28 Feb 2024 20:52:30 GMT Server: tyk @@ -72,7 +82,8 @@ THIS IS A VIRTUAL RESPONSE ``` If, however, we introduce an error to the JavaScript, such that Tyk fails to process the function, we will receive an `HTTP 500 Internal Server Error` as follows: -``` {linenos=true, linenostart=1} + +```http {linenos=true, linenostart=1} HTTP/1.1 500 Internal Server Error Content-Type: application/json X-Generator: tyk.io @@ -84,32 +95,33 @@ Content-Length: 99 } ``` -If we set `proxy_on_error` to `true` and keep the error in the Javascript, the request will be forwarded to the upstream and Tyk will return the response received from that service. +If we set `proxy_on_error` to `true` and keep the error in the Javascript, the request will be forwarded to the upstream and Tyk will return the response received from that service. ## Configuring the middleware in the API Designer + You can use the API Designer in the Tyk Dashboard to configure the internal endpoint middleware for your Tyk Classic API by following these steps. #### Step 1: Add an endpoint for the path and select the plugin + From the **Endpoint Designer** add an endpoint that matches the path for which you want to trigger the virtual endpoint. Select the **Virtual Endpoint** plugin. {{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-middleware.png" alt="Selecting the middleware" >}} #### Step 2: Configure the middleware + Once you have selected the virtual endpoint middleware for the endpoint, you need to supply: - - JS function to call - - Source type (`file` or `inline`) -If you select source type `file` you must provide the path to the file: -{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-file.png" alt="Configuring file based JS code" >}} +- JS function to call +- Source type (`file` or `inline`) -If you select `inline` you can enter the JavaScript code in the Code Editor window. -{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-inline.png" alt="Configuring inline JS code" >}} +If you select source type `file` you must provide the path to the file: {{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-file.png" alt="Configuring file based JS code" >}} + +If you select `inline` you can enter the JavaScript code in the Code Editor window. {{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-inline.png" alt="Configuring inline JS code" >}} #### Step 3: Save the API + Use the *save* or *create* buttons to save the changes and activate the Virtual Endpoint middleware. -{{< note success >}} -**Note** +{{< note success >}} **Note** -The Tyk Classic API Designer does not provide options to configure `use_session` or `proxy_on_error`, but you can do this from the Raw Definition editor. -{{< /note >}} \ No newline at end of file +The Tyk Classic API Designer does not provide options to configure `use_session` or `proxy_on_error`, but you can do this from the Raw Definition editor. {{< /note >}} diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index b6f38c10cd..908f26b3b6 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -1,8 +1,13 @@ --- title: Using the Virtual Endpoint middleware with Tyk OAS APIs -date: 2024-02-29 -description: "Using the Virtual Endpoint middleware with Tyk OAS APIs" -tags: ["virtual endpoint", "middleware", "per-endpoint", "Tyk OAS", "Tyk OAS API"] +tags: + - virtual endpoint + - middleware + - per-endpoint + - Tyk OAS + - Tyk OAS API +description: Using the Virtual Endpoint middleware with Tyk OAS APIs +date: "2024-02-29" --- The [virtual endpoint]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}) middleware provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself, without the need to proxy the request to an upstream service. This functionality is particularly useful for a variety of use cases, including request transformation, aggregation of responses from multiple services, or implementing custom authentication mechanisms. @@ -12,26 +17,26 @@ The middleware is configured in the [Tyk OAS API Definition]({{< ref "tyk-apis/t If you're using the legacy Tyk Classic APIs, then check out the [Tyk Classic]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic" >}}) page. ## Configuring the middleware in the Tyk OAS API Definition + The design of the Tyk OAS API Definition takes advantage of the `operationID` defined in the OpenAPI Document that declares both the path and method for which the middleware should be added. The virtual endpoint middleware (`virtualEndpoint`) can be added to the `operations` section of the Tyk OAS Extension (`x-tyk-api-gateway`) in your Tyk OAS API Definition for the appropriate `operationId` (as configured in the `paths` section of your OpenAPI Document). The `virtualEndpoint` object has the following configuration: - - `enabled`: enable the middleware for the endpoint - - `functionName`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered - - `body`: [optional] a `base64` encoded string containing the JavaScript code - - `path`: [optional] the relative path to the source file containing the JavaScript code - - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response. Defaults to `false` - - `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable. Defaults to `false` +- `enabled`: enable the middleware for the endpoint +- `functionName`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered +- `body`: [optional] a `base64` encoded string containing the JavaScript code +- `path`: [optional] the relative path to the source file containing the JavaScript code +- `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response. Defaults to `false` +- `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable. Defaults to `false` -{{< note success >}} -**Note** +{{< note success >}} **Note** -One of either `path` or `body` must be provided, depending on whether you are providing the JavaScript code in a file or inline within the API definition. If both are provided then `body` will take precedence. -{{< /note >}} +One of either `path` or `body` must be provided, depending on whether you are providing the JavaScript code in a file or inline within the API definition. If both are provided then `body` will take precedence. {{< /note >}} For example: -```.json {hl_lines=["39-50", "54-58"],linenos=true, linenostart=1} + +```json {hl_lines=["39-50", "54-58"],linenos=true, linenostart=1} { "components": {}, "info": { @@ -98,6 +103,7 @@ For example: ``` In this example the virtual endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. We have also configured the following custom attributes in the `pluginConfig` section of the API definition: + ```json { "map": { @@ -109,6 +115,7 @@ In this example the virtual endpoint middleware has been configured for HTTP `GE ``` The `body` field value is a `base64` encoded string containing this JavaScript code, which will be invoked by the virtual endpoint middleware: + ```js function myVirtualHandler (request, session, config) { var responseObject = { @@ -126,7 +133,8 @@ function myVirtualHandler (request, session, config) { ``` A call to the `GET /anything` endpoint returns: -``` + +```http HTTP/1.1 200 OK Date: Fri, 01 Mar 2024 12:14:36 GMT Foo-Header: bar @@ -146,6 +154,7 @@ Virtual Endpoint example The configuration above is a complete and valid Tyk OAS API Definition that you can import into Tyk to try out the virtual endpoint middleware. ## Configuring the middleware in the API Designer + Adding a Virtual Endpoint to your API endpoints is easy when using the API Designer in the Tyk Dashboard, simply follow the steps taken in this short video: - < placeholder for video > +< placeholder for video > From d4159ae01308dd3fe2c26e9bd95ce08237f1b818 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 16:18:27 +0100 Subject: [PATCH 23/35] Get rid of x-ratelimit headers in examples, proof function in tyk classic --- .../virtual-endpoint-tyk-classic.md | 29 +++++++++---------- .../middleware/virtual-endpoint-tyk-oas.md | 3 -- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md index 18a867282a..8377df7b1c 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -41,7 +41,7 @@ For example: { "response_function_name": "myUniqueFunctionName", "function_source_type": "blob", - "function_source_uri": "ZnVuY3Rpb24gbXlVbmlxdWVGdW5jdGlvbk5hbWUocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7CiAgdmFyIHJlc3BvbnNlT2JqZWN0ID0geyAKICAgIEJvZHk6ICJUSElTIElTIEEgIFZJUlRVQUwgUkVTUE9OU0UiLCAKICAgIENvZGU6IDIwMCAKICB9CiAgcmV0dXJuIFR5a0pzUmVzcG9uc2UocmVzcG9uc2VPYmplY3QsIHNlc3Npb24ubWV0YV9kYXRhKQp9", + "function_source_uri": "ZnVuY3Rpb24gbXlVbmlxdWVGdW5jdGlvbk5hbWUocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7CiB2YXIgcmVzcG9uc2VPYmplY3QgPSB7IAogIEJvZHk6ICJUSElTIElTIEEgVklSVFVBTCBSRVNQT05TRSIsIAogIENvZGU6IDIwMCAKIH0KIHJldHVybiBUeWtKc1Jlc3BvbnNlKHJlc3BvbnNlT2JqZWN0LCBzZXNzaW9uLm1ldGFfZGF0YSkKfQ==", "path": "/anything", "method": "GET", "use_session": false, @@ -57,37 +57,34 @@ In this example the Virtual Endpoint middleware has been configured for HTTP `GE Decoding the value in `function_source_uri` we can see that the JavaScript code is: ```js {linenos=true, linenostart=1} - function myUniqueFunctionName(request, session, config) { - var responseObject = { - Body: "THIS IS A VIRTUAL RESPONSE", - Code: 200 - } - return TykJsResponse(responseObject, session.meta_data) - } +function myUniqueFunctionName(request, session, config) { + var responseObject = { + Body: "THIS IS A VIRTUAL RESPONSE", + Code: 200 + } + return TykJsResponse(responseObject, session.meta_data) +} ``` This function will terminate the request without proxying it to the upstream returning `HTTP 200` as follows: -```http {linenos=true, linenostart=1} +```http HTTP/1.1 200 OK Date: Wed, 28 Feb 2024 20:52:30 GMT Server: tyk -X-Ratelimit-Limit: 0 -X-Ratelimit-Remaining: 0 -X-Ratelimit-Reset: 0 -Content-Length: 27 Content-Type: text/plain; charset=utf-8 +Content-Length: 26 THIS IS A VIRTUAL RESPONSE ``` If, however, we introduce an error to the JavaScript, such that Tyk fails to process the function, we will receive an `HTTP 500 Internal Server Error` as follows: -```http {linenos=true, linenostart=1} +```http HTTP/1.1 500 Internal Server Error -Content-Type: application/json -X-Generator: tyk.io Date: Wed, 28 Feb 2024 20:55:27 GMT +Server: tyk +Content-Type: application/json Content-Length: 99 { diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 908f26b3b6..6d2f725359 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -142,9 +142,6 @@ Map-Header: {" key":3} Num-Header: 4 Server: tyk String-Header: example -X-Ratelimit-Limit: 0 -X-Ratelimit-Remaining: 0 -X-Ratelimit-Reset: 0 Content-Length: 24 Content-Type: text/plain; charset=utf-8 From ae8994e549c90e0669358b71a908307fc3a99a68 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 16:21:18 +0100 Subject: [PATCH 24/35] Fix indentation on tyk-oas javascript example --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 6d2f725359..fe235fc463 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -93,7 +93,7 @@ For example: "virtualEndpoint": { "enabled": true, "functionName": "myVirtualHandler", - "body": "ZnVuY3Rpb24gbXlWaXJ0dWFsSGFuZGxlciAocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7ICAgICAgCiAgdmFyIHJlc3BvbnNlT2JqZWN0ID0gewogICAgQm9keTogIlZpcnR1YWwgRW5kcG9pbnQgIitjb25maWcuY29uZmlnX2RhdGEuc3RyaW5nLAogICAgSGVhZGVyczogewogICAgICAiZm9vLWhlYWRlciI6ICJiYXIiLAogICAgICAibWFwLWhlYWRlciI6IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5jb25maWdfZGF0YS5tYXApLAogICAgICAic3RyaW5nLWhlYWRlciI6IGNvbmZpZy5jb25maWdfZGF0YS5zdHJpbmcsCiAgICAgICJudW0taGVhZGVyIjogSlNPTi5zdHJpbmdpZnkoY29uZmlnLmNvbmZpZ19kYXRhLm51bSkKICAgIH0sCiAgICAgIENvZGU6IDIwMAogIH0KICByZXR1cm4gVHlrSnNSZXNwb25zZShyZXNwb25zZU9iamVjdCwgc2Vzc2lvbi5tZXRhX2RhdGEpCn0=" + "body": "ZnVuY3Rpb24gbXlWaXJ0dWFsSGFuZGxlciAocmVxdWVzdCwgc2Vzc2lvbiwgY29uZmlnKSB7ICAgICAgCiAgdmFyIHJlc3BvbnNlT2JqZWN0ID0gewogICAgQm9keTogIlZpcnR1YWwgRW5kcG9pbnQgIitjb25maWcuY29uZmlnX2RhdGEuc3RyaW5nLAogICAgSGVhZGVyczogewogICAgICAiZm9vLWhlYWRlciI6ICJiYXIiLAogICAgICAibWFwLWhlYWRlciI6IEpTT04uc3RyaW5naWZ5KGNvbmZpZy5jb25maWdfZGF0YS5tYXApLAogICAgICAic3RyaW5nLWhlYWRlciI6IGNvbmZpZy5jb25maWdfZGF0YS5zdHJpbmcsCiAgICAgICJudW0taGVhZGVyIjogSlNPTi5zdHJpbmdpZnkoY29uZmlnLmNvbmZpZ19kYXRhLm51bSkKICAgIH0sCiAgICBDb2RlOiAyMDAKICB9CiAgcmV0dXJuIFR5a0pzUmVzcG9uc2UocmVzcG9uc2VPYmplY3QsIHNlc3Npb24ubWV0YV9kYXRhKQp9" } } } @@ -126,7 +126,7 @@ function myVirtualHandler (request, session, config) { "string-header": config.config_data.string, "num-header": JSON.stringify(config.config_data.num) }, - Code: 200 + Code: 200 } return TykJsResponse(responseObject, session.meta_data) } From 8e6e01d171b2a97f9363cbdccde0d8bbc6b33fb5 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 16:25:43 +0100 Subject: [PATCH 25/35] Add before list spacing --- .../tyk-gateway/middleware/virtual-endpoint-tyk-oas.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index fe235fc463..1cc5fdb5d6 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -23,6 +23,7 @@ The design of the Tyk OAS API Definition takes advantage of the `operationID` de The virtual endpoint middleware (`virtualEndpoint`) can be added to the `operations` section of the Tyk OAS Extension (`x-tyk-api-gateway`) in your Tyk OAS API Definition for the appropriate `operationId` (as configured in the `paths` section of your OpenAPI Document). The `virtualEndpoint` object has the following configuration: + - `enabled`: enable the middleware for the endpoint - `functionName`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered - `body`: [optional] a `base64` encoded string containing the JavaScript code From b5f3fe19c6d10344a64d4b18043e0b5d595f75e9 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 17:33:39 +0100 Subject: [PATCH 26/35] Update advanced-configuration, compose apis --- .../compose-apis/demo-virtual-endpoint.md | 46 ++++++++++++++----- .../compose-apis/virtual-endpoints.md | 25 +++++++--- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index 3254bfef94..4e9f26ac3e 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -1,18 +1,27 @@ --- -date: 2017-03-23T18:08:16Z title: Virtual Endpoint examples -description: "Examples of Virtual Endpoints" -tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "examples", "virtual endpoint"] +tags: + - JavaScript + - JS + - middleware + - scripting + - JSVM + - examples + - virtual endpoint +description: Examples of Virtual Endpoints +date: "2017-03-23T18:08:16Z" aliases: - - /advanced-configuration/compose-apis/sample-batch-funtion/ + - /advanced-configuration/compose-apis/sample-batch-funtion/ --- Here we offer some examples to demonstrate valid use of JavaScript within Virtual Endpoints. You can either copy and paste the JavaScript code into the code editor in the Tyk Dashboard API Designer, or create a file and place it in a subdirectory of the Tyk configuration environment (for example under the `middleware` folder in your Tyk installation). ## Example 1: Accessing Tyk data objects + In this example, we demonstrate how you can access different [external Tyk objects]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#accessing-external-and-dynamic-data" >}}) (API request, session key, API definition). 1. Enable the Virtual Endpoint middleware on an endpoint of your API and paste this JavaScript into the API Designer (or save in a file and reference it from the middleware config): + ```javascript function myFirstVirtualHandler (request, session, config) { log("Virtual Test running") @@ -40,6 +49,7 @@ log("Virtual Test initialised") 2. Make a call to your API endpoint passing a request body, a value in the `Authorization` header and a query parameter `param1`. 3. The virtual endpoint will terminate the request and return this response: + ``` HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:39:00 GMT @@ -56,6 +66,7 @@ VIRTUAL ENDPOINT EXAMPLE #1 ``` 4. The gateway logs will include: + ``` time="" level=info msg="Virtual Test running" prefix=jsvm type=log-msg time="" level=info msg="Request Body: " prefix=jsvm type=log-msg @@ -66,9 +77,11 @@ time="" level=info msg="auth Header: " prefix=jsvm type=log-ms ``` ## Example 2: Accessing custom attributes in the API Definition + You can add [custom attributes]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#passing-custom-attributes-to-middleware" >}}) to the API definition and access these from within your Virtual Endpoint. 1. Add the following custom attributes to your API definition: + ```json { "string": "string", @@ -80,6 +93,7 @@ You can add [custom attributes]({{< ref "plugins/supported-languages/javascript- ``` 2. Enable the Virtual Endpoint middleware on an endpoint of your API and paste this JavaScript into the API Designer (or save in a file and reference it from the middleware config): + ```js function mySecondVirtualHandler (request, session, config) { var responseObject = { @@ -99,6 +113,7 @@ function mySecondVirtualHandler (request, session, config) { 3. Make a call to your API endpoint. 4. The virtual endpoint will terminate the request and return this response: + ``` HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:29:12 GMT @@ -117,12 +132,13 @@ VIRTUAL ENDPOINT EXAMPLE #2 ``` ## Example 3: Advanced example + In this example, every line in the script gives an example of a functionality usage, including: - - how to get form param - - how to get to a specific key inside a JSON variable - - the structure of the request object - - using `TykMakeHttpRequest` to make an HTTP request from within the virtual endpoint, and the json it returns - `.Code` and `.Body`. +- how to get form param +- how to get to a specific key inside a JSON variable +- the structure of the request object +- using `TykMakeHttpRequest` to make an HTTP request from within the virtual endpoint, and the json it returns - `.Code` and `.Body`. ```{.json} function myVirtualHandlerGetHeaders (request, session, config) { @@ -175,10 +191,14 @@ function myVirtualHandlerGetHeaders (request, session, config) { ``` #### Running the Advanced example + You can find a Tyk Classic API definition [here](https://gist.github.com/letzya/5b5edb3f9f59ab8e0c3c614219c40747) that includes the advanced example, with the JS encoded `inline` within the middleware config for the `GET /headers` endpoint. -Create a new Tyk Classic API using that API definition and then run the following command to send a request to the API endpoint where the : -`curl http://tyk-gateway:8080/testvirtualendpoint2/headers -H "location: /get" -v` +Create a new Tyk Classic API using that API definition and then run the following command to send a request to the API endpoint: + +``` +curl http://tyk-gateway:8080/testvirtualendpoint2/headers -H "location: /get" -v +``` This should return the following: @@ -209,6 +229,7 @@ yo yo ``` #### Checking the Tyk Gateway Logs + The `log` and `rawlog` commands in the JS function write to the Tyk Gateway logs. If you check the logs you should see the following: ``` @@ -234,9 +255,10 @@ Virtual Test ended ``` ## Example 4: Aggregating upstream calls using batch processing + One of the most common use cases for virtual endpoints is to provide some form of aggregate data to your users, combining the responses from multiple upstream service calls. This virtual endpoint function will do just that using the batch processing function from the [JavaScript API]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api" >}}) -``` .js +```js function batchTest(request, session, config) { // Set up a response object var response = { @@ -288,4 +310,4 @@ function batchTest(request, session, config) { } log("Batch Test initialised") -``` \ No newline at end of file +``` diff --git a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md index 8ffdd0b257..2da0f37ba4 100755 --- a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md @@ -1,10 +1,15 @@ --- -date: 2017-03-23T18:08:16Z title: Tyk Virtual Endpoints -description: "Virtual Endpoint middleware" -tags: ["virtual endpoint", "middleware", "per-endpoint", "JavaScript", "JS"] +tags: + - virtual endpoint + - middleware + - per-endpoint + - JavaScript + - JS +description: Virtual Endpoint middleware +date: "2017-03-23T18:08:16Z" aliases: - - /compose-apis/virtual-endpoints/ + - /compose-apis/virtual-endpoints/ --- Tyk's Virtual Endpoint is a programmable middleware component that is invoked towards the end of the request processing chain. It can be enabled at the per-endpoint level and can perform complex interactions with your upstream service(s) that cannot be handled by one of the other middleware components. @@ -14,39 +19,47 @@ Virtual endpoint middleware provides a serverless compute function that allows f The Virtual Endpoint is an extremely powerful feature that is unique to Tyk and provides exceptional flexibility to your APIs. ## When to use virtual endpoints + #### Aggregating data from multiple services + From a virtual endpoint, you can make calls out to other internal and upstream APIs. You can then aggregate and process the responses, returning a single response object to the originating client. This allows you to configure a single externally facing API to simplify interaction with multiple internal services, leaving the heavy lifting to Tyk rather than starting up an aggregation service within your stack. #### Enforcing custom policies + Tyk provides a very flexible [middleware chain]({{< ref "concepts/middleware-execution-order" >}}) where you can combine functions to implement the access controls you require to protect your upstream services. Of course, not all scenarios can be covered by Tyk's standard middleware functions, but you can use a virtual endpoint to apply whatever custom logic you require to optimise your API experience. #### Dynamic Routing + With a virtual endpoint you can implement complex dynamic routing of requests made to a single external endpoint on to different upstream services. The flexibility of the virtual endpoint gives access to data within the request (including the key session) and also the ability to make calls to other APIs to make decisions on the routing of the request. It can operate as a super-powered [URL rewrite]({{< ref "transform-traffic/url-rewriting" >}}) middleware. ## How virtual endpoints work + The virtual endpoint middleware provides a JavaScript engine that runs the custom code that you provide either inline within the API definition or in a source code file accessible to the Gateway. The JavaScript Virtual Machine (JSVM) provided in the middleware is a traditional ECMAScript5 compatible environment which does not offer the more expressive power of something like Node.js. The virtual endpoint terminates the request, so the JavaScript function must provide the response to be passed to the client. When a request hits a virtual endpoint, the JSVM executes the JavaScript code which can modify the request, make calls to other APIs or upstream services, process data, and ultimately determines the response returned to the client. {{< note success >}} -**Note** +**Note** You will need to enable Tyk's JavaScript Virtual Machine by setting `enable_jsvm` to `true` in your `tyk.conf` [file]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}) for your virtual endpoints to work. {{< /note >}} ## Scripting virtual endpoint functions + The [middleware scripting guide]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide" >}}) provides guidance on writing JS functions for your virtual endpoints, including how to access key session data and custom attributes from the API definition. #### Function naming + The virtual endpoint middleware will invoke a named function within the JS code that you provide (either inline or in a file). Both the filename and function name are configurable per endpoint, but note that function names must be unique across your API portfolio because all plugins run in the same virtual machine. This means that you can share a single function definition across multiple endpoints and APIs but you cannot have two different functions with the same name (this applies across all [JavaScript middleware components]({{< ref "plugins/supported-languages/javascript-middleware" >}})). Inline mode is mainly used by the dashboard to make code injection easier on multiple node deployments. ## Virtual endpoint library + We have put together a [library](https://github.com/TykTechnologies/custom-plugins#virtual-endpoints) of JS functions that you could use in your virtual endpoints. We welcome submissions from the Tyk community so if you've created a function that you think would be useful to other users, please open an issue in the Github repository and we can discuss bringing it into the library. {{< note success >}} -**Note** +**Note** Virtual endpoints are not available in Tyk Cloud Classic. {{< /note >}} From d432fe32048db4be93f8d17ebd78d7ed058f634e Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 17:40:46 +0100 Subject: [PATCH 27/35] Fix indenting on code snippets for javascript-api.md --- .../javascript-middleware/javascript-api.md | 75 +++++++++++-------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md index 960b25eb2a..ea90d73161 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md @@ -1,11 +1,18 @@ --- -date: 2017-03-24T14:54:24Z title: JavaScript API -description: "Tyk JavaScript system API" -tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "plugins", "javascript API"] +tags: + - JavaScript + - JS + - middleware + - scripting + - JSVM + - plugins + - javascript API +description: Tyk JavaScript system API +date: "2017-03-24T14:54:24Z" aliases: - - /customise-tyk/plugins/javascript-middleware/javascript-api/ - - /plugins/javascript-middleware/javascript-api + - /customise-tyk/plugins/javascript-middleware/javascript-api/ + - /plugins/javascript-middleware/javascript-api --- This system API provides access to resources outside of the JavaScript Virtual Machine sandbox, the ability to make outbound HTTP requests and access to the key management REST API functions. @@ -16,12 +23,12 @@ This list is regularly revised and any new suggestions should be made in our [Gi Below is the list of functions currently provided by Tyk. -* `log(string)`: Calling `log("this message")` will cause Tyk to log the string to Tyk's default logger output in the form `JSVM Log: this message` as an INFO statement. This function is especially useful for debugging your scripts. It is recommended to put a `log()` call at the end of your middleware and event handler module definitions to indicate on load that they have been loaded successfully - see the [example scripts](https://github.com/TykTechnologies/tyk/tree/master/middleware) in your Tyk installation `middleware` directory for more details. -* `rawlog(string)`: Calling `rawlog("this message")` will cause Tyk to log the string to Tyk's default logger output without any additional formatting, like adding prefix or date. This function can be used if you want to have own log format, and parse it later with custom tooling. -* `b64enc` - Encode string to base64 -* `b64dec` - Decode base64 string -* `TykBatchRequest` this function is similar to `TykMakeHttpRequest` but makes use of the Tyk Batch API. See the Batch Requests section of the [Tyk Gateway API]({{< ref "tyk-gateway-api" >}}) for more details. -* `TykMakeHttpRequest(JSON.stringify(requestObject))`: This method is used to make an HTTP request, requests are encoded as JSON for deserialisation in the min binary and translation to a system HTTP call. The request object has the following structure: +- `log(string)`: Calling `log("this message")` will cause Tyk to log the string to Tyk's default logger output in the form `JSVM Log: this message` as an INFO statement. This function is especially useful for debugging your scripts. It is recommended to put a `log()` call at the end of your middleware and event handler module definitions to indicate on load that they have been loaded successfully - see the [example scripts](https://github.com/TykTechnologies/tyk/tree/master/middleware) in your Tyk installation `middleware` directory for more details. +- `rawlog(string)`: Calling `rawlog("this message")` will cause Tyk to log the string to Tyk's default logger output without any additional formatting, like adding prefix or date. This function can be used if you want to have own log format, and parse it later with custom tooling. +- `b64enc` - Encode string to base64 +- `b64dec` - Decode base64 string +- `TykBatchRequest` this function is similar to `TykMakeHttpRequest` but makes use of the Tyk Batch API. See the Batch Requests section of the [Tyk Gateway API]({{< ref "tyk-gateway-api" >}}) for more details. +- `TykMakeHttpRequest(JSON.stringify(requestObject))`: This method is used to make an HTTP request, requests are encoded as JSON for deserialisation in the min binary and translation to a system HTTP call. The request object has the following structure: ```{.javascript} newRequest = { @@ -33,49 +40,53 @@ newRequest = { "FormData": {"field": "value"} }; ``` + {{< note success >}} -**Note** +**Note** If you want to include querystring values, add them as part of the `Domain` property. {{< /note >}} - + Tyk passes a simplified response back which looks like this: -```{.copyWrapper} +```go type TykJSHttpResponse struct { Code int Body string Headers map[string][]string } ``` - + The response is JSON string encoded, and so will need to be decoded again before it is usable: - -```{.copyWrapper} + +```js usableResponse = JSON.parse(response); log("Response code: " + usableResponse.Code); log("Response body: " + usableResponse.Body); ``` - + This method does not execute asynchronously, so execution will block until a response is received. ### Working with the key session object -* `TykGetKeyData(api_key, api_id)`: Use this method to retrieve a [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) for the key and the API provided: -```{.copyWrapper} -// In an event handler, we can get the key idea from the event, and the API ID from the context variable. -var thisSession = JSON.parse(TykGetKeyData(event.EventMetaData.Key, context.APIID)) -log("Expires: " + thisSession.expires) -``` +To work with the key session object, two functions are provided: `TykGetKeyData` and `TykSetKeyData`: + +- `TykGetKeyData(api_key, api_id)`: Use this method to retrieve a [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) for the key and the API provided: + + ```jq + // In an event handler, we can get the key idea from the event, and the API ID from the context variable. + var thisSession = JSON.parse(TykGetKeyData(event.EventMetaData.Key, context.APIID)) + log("Expires: " + thisSession.expires) + ``` -* `TykSetKeyData(api_key, api_id)`: Use this method to write data back into the Tyk session store: +- `TykSetKeyData(api_key, api_id)`: Use this method to write data back into the Tyk session store: -```{.copyWrapper} -// You can modify the object just like with the REST API -thisSession.expires = thisSession.expires + 1000; + ```jq + // You can modify the object just like with the REST API + thisSession.expires = thisSession.expires + 1000; -// Use TykSetKeyData to set the key data back in the session store -TykSetKeyData(event.EventMetaData.Key, JSON.stringify(thisSession)); -``` - + // Use TykSetKeyData to set the key data back in the session store + TykSetKeyData(event.EventMetaData.Key, JSON.stringify(thisSession)); + ``` + All of these methods are described in functional examples in the Tyk `middleware/` and `event_handlers/` folders. From da063ccaf34ee67e5bccb8a73384dcb366ea0fef Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 17:41:43 +0100 Subject: [PATCH 28/35] Fix note layout, missed newline - reindent TykJSHttpResponse --- .../javascript-middleware.md | 42 ++++--- .../install-middleware/tyk-ce.md | 44 +++---- .../install-middleware/tyk-hybrid.md | 13 +- .../install-middleware/tyk-pro.md | 14 +-- .../javascript-middleware/javascript-api.md | 8 +- .../middleware-scripting-guide.md | 112 +++++++++++------- .../virtual-endpoint-tyk-classic.md | 12 +- .../middleware/virtual-endpoint-tyk-oas.md | 6 +- 8 files changed, 151 insertions(+), 100 deletions(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware.md index 41bc727fbd..f1e0e27350 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware.md @@ -1,16 +1,26 @@ --- -date: 2017-03-24T14:45:20Z title: JavaScript Middleware -description: "Using JavaScript with Tyk" -tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "plugins", "virtual endpoint", "JSVM", "JavaScript Virtual Machine", "dynamic event handler"] +tags: + - JavaScript + - JS + - middleware + - scripting + - JSVM + - plugins + - virtual endpoint + - JSVM + - JavaScript Virtual Machine + - dynamic event handler +description: Using JavaScript with Tyk +date: "2017-03-24T14:45:20Z" aliases: - - /customise-tyk/plugins/javascript-middleware/ - - /customise-tyk/plugins/javascript-middleware/middleware-execution-order/ - - /plugins/javascript-middleware - - /plugins/supported-languages/javascript-middleware/ - - /plugins/supported-languages/javascript-middleware/ - - /plugins/supported-languages/javascript-middleware/install-middleware/install-middleware - - /plugins/javascript-middleware/install-middleware + - /customise-tyk/plugins/javascript-middleware/ + - /customise-tyk/plugins/javascript-middleware/middleware-execution-order/ + - /plugins/javascript-middleware + - /plugins/supported-languages/javascript-middleware/ + - /plugins/supported-languages/javascript-middleware/ + - /plugins/supported-languages/javascript-middleware/install-middleware/install-middleware + - /plugins/javascript-middleware/install-middleware --- There are three middleware components that can be scripted with Tyk: @@ -24,9 +34,11 @@ There are three middleware components that can be scripted with Tyk: The JavaScript (JS) [scripting guide]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide" >}}) provides details of how to access dynamic data (such as the key session object) from your JS functions. Combining these resources provides you with a powerful set of tools for shaping and structuring inbound traffic to your API. ### Declared plugin functions + JavaScript functions are available globally in the same namespace. So, if you include two or more JSVM plugins that call the same function, the last declared plugin implementation of the function will be returned. ## Enabling the JavaScript Virtual Machine (JSVM) + The JavaScript Virtual Machine (JSVM) provided in the Gateway is a traditional ECMAScript5 compatible environment. Before you can use JavaScript customisation in any component you will need to enable the JSVM. @@ -34,15 +46,17 @@ Before you can use JavaScript customisation in any component you will need to en You do this by setting `enable_jsvm` to `true` in your `tyk.conf` [file]({{< ref "tyk-oss-gateway/configuration#enable_jsvm" >}}). ## Installing JavaScript middleware + Installing middleware is different for different Tyk deployments, for example, in Tyk OSS it is possible to directly specify a path to a file in the API Definition, while in Tyk Self-Managed, we recommend using a directory-based loader. We've provided the following guides: - - [Tyk OSS]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce" >}}) - - [Tyk Self-Managed]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro" >}}) - - [Tyk Hybrid]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid" >}}) + +- [Tyk OSS]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce" >}}) +- [Tyk Self-Managed]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro" >}}) +- [Tyk Hybrid]({{< ref "plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid" >}}) {{< note success >}} -**Note** +**Note** Tyk Cloud Classic does not support custom middleware. {{< /note >}} diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md index f5b97a12d9..fecded3368 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md @@ -1,22 +1,25 @@ --- -date: 2017-03-24T15:38:11Z +weight: 0 title: Installing Middleware on Tyk OSS -tags: ["Tyk OSS JS plugin", "jave script plugin", "Javascript Middleware"] +tags: + - Tyk OSS JS plugin + - jave script plugin + - Javascript Middleware menu: - main: - parent: "Install Middleware" -weight: 0 + main: + parent: Install Middleware +date: "2017-03-24T15:38:11Z" aliases: - - /plugins/javascript-middleware/install-middleware/tyk-ce + - /plugins/javascript-middleware/install-middleware/tyk-ce --- In order to activate middleware when using Tyk OSS or when using a file-based setup, the middleware needs to be registered as part of your API Definition. Registration of middleware components is relatively simple. {{< note success >}} -**Note** +**Note** It is important that your object names are unique. {{< /note >}}{{< note success >}} -**Note** +**Note** This functionality may change in subsequent releases. {{< /note >}} @@ -29,7 +32,6 @@ You can do this by setting `enable_jsvm` to `true` in your `tyk.conf` file. Adding the middleware plugin is as simple as adding it to your definition file in the middleware sections: - ```yaml // sample_api.conf @@ -57,22 +59,22 @@ Adding the middleware plugin is as simple as adding it to your definition file i As you can see, the parameters are all dynamic, so you will need to ensure that the path to your middleware is correct. The configuration sections are as follows: -* `pre`: Defines a list of custom middleware objects to run *in order* from top to bottom. That will be executed *before* any authentication information is extracted from the header or parameter list of the request. Use middleware in this section to pre-process a request before feeding it through the Tyk middleware. +- `pre`: Defines a list of custom middleware objects to run *in order* from top to bottom. That will be executed *before* any authentication information is extracted from the header or parameter list of the request. Use middleware in this section to pre-process a request before feeding it through the Tyk middleware. + +- `pre[].name`: The name of the middleware object to call. This is case sensitive, and **must** match the name of the middleware object that was created, so in our example - we created `sampleMiddleware` by calling: + + `var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({});` -* `pre[].name`: The name of the middleware object to call. This is case sensitive, and **must** match the name of the middleware object that was created, so in our example - we created `sampleMiddleware` by calling: - - `var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({});` +- `pre[].path`: The path to the middleware component, this will be loaded into the JSVM when the API is initialised. This means that if you reload an API configuration, the middleware will also be re-loaded. You can hot-swap middleware on reload with no service interruption. -* `pre[].path`: The path to the middleware component, this will be loaded into the JSVM when the API is initialised. This means that if you reload an API configuration, the middleware will also be re-loaded. You can hot-swap middleware on reload with no service interruption. +- `pre[].require_session`: Irrelevant for pre-processor middleware, since no auth data has been extracted by the authentication middleware, it cannot be made available to the middleware. -* `pre[].require_session`: Irrelevant for pre-processor middleware, since no auth data has been extracted by the authentication middleware, it cannot be made available to the middleware. +- `post`: Defines a list of custom middleware objects to run *in order* from top to bottom. That will be executed *after* the authentication, validation, throttling, and quota-limiting middleware has been executed, just before the request is proxied upstream. Use middleware in this section to post-process a request before sending it to your upstream API. -* `post`: Defines a list of custom middleware objects to run *in order* from top to bottom. That will be executed *after* the authentication, validation, throttling, and quota-limiting middleware has been executed, just before the request is proxied upstream. Use middleware in this section to post-process a request before sending it to your upstream API. +- `post[].name`: The name of the middleware object to call. This is case sensitive, and **must** match the name of the middleware object that was created, so in our example - we created `sampleMiddleware` by calling: -* `post[].name`: The name of the middleware object to call. This is case sensitive, and **must** match the name of the middleware object that was created, so in our example - we created `sampleMiddleware` by calling: - - `var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({});` + `var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({});` -* `post[].path`: The path to the middleware component, this will be loaded into the JSVM when the API is initialised. This means that if you reload an API configuration, the middleware will also be re-loaded. You can hot-swap middleware on reload with no service interruption. +- `post[].path`: The path to the middleware component, this will be loaded into the JSVM when the API is initialised. This means that if you reload an API configuration, the middleware will also be re-loaded. You can hot-swap middleware on reload with no service interruption. -* `post[].require_session`: Defaults to `false`, if you require access to the session object, it will be supplied as a `session` variable to your middleware processor function. \ No newline at end of file +- `post[].require_session`: Defaults to `false`, if you require access to the session object, it will be supplied as a `session` variable to your middleware processor function. diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md index 11c01dd2b0..9ae84c880e 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md @@ -1,12 +1,12 @@ --- -date: 2017-03-24T15:41:38Z +weight: 0 title: Installing Middleware on Tyk Hybrid menu: - main: - parent: "Install Middleware" -weight: 0 + main: + parent: Install Middleware +date: "2017-03-24T15:41:38Z" aliases: - - /plugins/javascript-middleware/install-middleware/tyk-hybrid + - /plugins/javascript-middleware/install-middleware/tyk-hybrid --- In some cases middleware references can't be directly embedded in API Definitions (for example, when using the dashboard in a Hybrid install). However, there is an easy way to distribute and enable custom middleware for an API on a Tyk node. @@ -29,12 +29,11 @@ middleware Tyk will check for a folder that matches the `{API Id}` being loaded, and then load the `pre` and `post` middleware from the respective folders. {{< note success >}} -**Note** +**Note** The filename MUST match the object to be loaded exactly. {{< /note >}} - If your middleware requires session injection, then append `_with_session` to the filename. ### Enable the JSVM diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md index ad2959d51b..db6bd8a4f6 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md @@ -1,12 +1,12 @@ --- -date: 2017-03-24T15:40:54Z +weight: 0 title: Installing Middleware on Tyk Self-Managed menu: - main: - parent: "Install Middleware" -weight: 0 + main: + parent: Install Middleware +date: "2017-03-24T15:40:54Z" aliases: - - /plugins/javascript-middleware/install-middleware/tyk-pro + - /plugins/javascript-middleware/install-middleware/tyk-pro --- In some cases middleware references can't be directly embedded in API Definitions (for example, when using the Tyk Dashboard in an Self-Managed installation). However, there is an easy way to distribute and enable custom middleware for an API in a Tyk node by adding them as a directory structure. @@ -29,7 +29,7 @@ middleware Tyk will check for a folder that matches the `API Id` being loaded, and then load the `pre` and `post` middleware from the respective directories. {{< note success >}} -**Note** +**Note** The filename MUST match the object to be loaded exactly. {{< /note >}} @@ -40,4 +40,4 @@ If your middleware requires session injection, then append `_with_session` to th Before you can use Javascript Middleware you will need to enable the JSVM. -You can do this by setting `enable_jsvm` to `true` in your `tyk.conf` file. \ No newline at end of file +You can do this by setting `enable_jsvm` to `true` in your `tyk.conf` file. diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md index ea90d73161..06efc52509 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md @@ -51,9 +51,9 @@ Tyk passes a simplified response back which looks like this: ```go type TykJSHttpResponse struct { - Code int - Body string - Headers map[string][]string + Code int + Body string + Headers map[string][]string } ``` @@ -84,7 +84,7 @@ To work with the key session object, two functions are provided: `TykGetKeyData` ```jq // You can modify the object just like with the REST API thisSession.expires = thisSession.expires + 1000; - + // Use TykSetKeyData to set the key data back in the session store TykSetKeyData(event.EventMetaData.Key, JSON.stringify(thisSession)); ``` diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 19cd58ad05..8087e6c62e 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -1,11 +1,18 @@ --- -date: 2017-03-24T14:51:42Z title: Using JavaScript with Tyk -description: "Writing custom JS functions for Tyk middleware" -tags: ["JavaScript", "JS", "middleware", "scripting", "JSVM", "plugins", "virtual endpoint"] +tags: + - JavaScript + - JS + - middleware + - scripting + - JSVM + - plugins + - virtual endpoint +description: Writing custom JS functions for Tyk middleware +date: "2017-03-24T14:51:42Z" aliases: - - /tyk-api-gateway-v1-9/javascript-plugins/middleware-scripting/ - - /plugins/javascript-middleware/middleware-scripting-guide + - /tyk-api-gateway-v1-9/javascript-plugins/middleware-scripting/ + - /plugins/javascript-middleware/middleware-scripting-guide --- Tyk's JavaScript Virtual Machine (JSVM) provides a serverless compute function that allows for the execution of custom logic directly within the gateway itself. This can be accessed from [multiple locations]({{< ref "plugins/supported-languages/javascript-middleware" >}}) in the API processing chain and allows significant customisation and optimisation of your request handling. @@ -13,39 +20,46 @@ Tyk's JavaScript Virtual Machine (JSVM) provides a serverless compute function t In this guide we will cover the features and resources available to you when creating custom functions, highlighting where there are limitations for the different middleware stages. ## Scripting basics + Here we cover various facets that you need to be aware of when creating custom functions for Tyk. ### Accessing external and dynamic data + JS functions can be given access to external data objects relating to the API request. These allow for the modification of both the request itself and the session: - - `request`: an [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-request-object" >}}) describing the API request that invoked the middleware - - `session`: the key session [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-session-object" >}}) provided by the client when making the API request - - `config`: an [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-config-object" >}}) containing fields from the API definition + +- `request`: an [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-request-object" >}}) describing the API request that invoked the middleware +- `session`: the key session [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-session-object" >}}) provided by the client when making the API request +- `config`: an [object]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#the-config-object" >}}) containing fields from the API definition {{< note success >}} -**Note** +**Note** There are other ways of accessing and editing a session object using the [Tyk JavaScript API functions]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api#Working-with-the-key-session-object" >}}). {{< /note >}} ### Creating a middleware component + Tyk injects a `TykJS` namespace into the JSVM, which can be used to initialise a new middleware component. The JS for each middleware component should be in its own `*.js` file. You create a middleware object by calling the `TykJS.TykMiddleware.NewMiddleware({})` constructor with an empty object and then initialising it with your function using the `NewProcessRequest()` closure syntax. This is where you expose the [external data objects]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#accessing-external-and-dynamic-data" >}}) to your custom function. {{< note success >}} -**Note** +**Note** - - For Custom JS plugins and Dynamic Event Handlers, the source code filename must match the function name - - Virtual Endpoints do not have this limitation +- For Custom JS plugins and Dynamic Event Handlers, the source code filename must match the function name +- Virtual Endpoints do not have this limitation {{< /note >}} ### Returning from the middleware + When returning from the middleware, you provide specific return data depending upon the type of middleware. #### Returning from Custom JS plugin + A custom JS plugin can modify fields in the API request and the session metadata, however this is not performed directly within the JSVM so the required updates must be passed out of the JSVM for Tyk to apply the changes. This is a requirement and omitting them can cause the middleware to fail. The JS function must provide the `request` and `session.meta_data` objects in the `ReturnData` as follows: + ```js return sampleMiddleware.ReturnData(request, session.meta_data); ``` @@ -53,29 +67,34 @@ return sampleMiddleware.ReturnData(request, session.meta_data); Custom JS plugins sit in the [middleware processing chain]({{< ref "concepts/middleware-execution-order" >}}) and pass the request onto the next middleware before it is proxied to the upstream. If required, however, a custom JS plugin can terminate the request and provide a custom response to the client if you configure the `ReturnOverrides` in the `request` object, as described [here]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#using-returnoverrides" >}}). #### Returning from Virtual Endpoint + Unlike custom JS plugins, Virtual Endpoints always [terminate the request]({{< ref "advanced-configuration/compose-apis/virtual-endpoints#how-virtual-endpoints-work" >}}) so have a different method of returning from the JS function. The function must return a `responseObject`. This is crucial as it determines the HTTP response that will be sent back to the client. The structure of this object is defined to ensure that the virtual endpoint can communicate the necessary response details back to the Tyk Gateway, which then forwards it to the client. The `responseObject` has the following structure: - - `code`: an integer representing the HTTP status code of the response - - `headers`: an object containing key-value pairs representing the HTTP headers of the response - - `body`: a string that represents the body of the response which can be plain text, JSON, or XML, depending on what your API client expects to receive + +- `code`: an integer representing the HTTP status code of the response +- `headers`: an object containing key-value pairs representing the HTTP headers of the response +- `body`: a string that represents the body of the response which can be plain text, JSON, or XML, depending on what your API client expects to receive You must provide the `responseObject` together with the `session.meta_data` as parameters in a call to `TykJsResponse` as follows: -``` .js + +```js return TykJsResponse(responseObject, session.meta_data); ``` You can find some examples of how this works [here]({{< ref "advanced-configuration/compose-apis/demo-virtual-endpoint" >}}). ## JavaScript resources + JavaScript (JS) functions have access to a [system API]({{< ref "plugins/supported-languages/javascript-middleware/javascript-api" >}}) and [library of functions]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#underscorejs-library" >}}). They can also be given access to certain Tyk data objects relating to the API request. The system API provides access to resources outside of the JavaScript Virtual Machine sandbox, the ability to make outbound HTTP requests and access to the key management REST API functions. ### The `request` object -The `request` object provides a set of arrays that describe the API request. These can be manipulated and, when changed, will affect the request as it passes through the middleware pipeline. + +The `request` object provides a set of arrays that describe the API request. These can be manipulated and, when changed, will affect the request as it passes through the middleware pipeline. The structure of the `request` object is: @@ -114,16 +133,18 @@ The structure of the `request` object is: - `Scheme`: contains the URL scheme, e.g. `http`, `https` #### Using `ReturnOverrides` + If you configure values in `request.ReturnOverrides` then Tyk will terminate the request and provide a response to the client when the function completes. The request will not be proxied to the upstream. The response will use the parameters configured in `ReturnOverrides`: - - `ResponseCode` - - `ResponseBody` - - `ResponseHeaders` + +- `ResponseCode` +- `ResponseBody` +- `ResponseHeaders` In this example, if the condition is met, Tyk will return `HTTP 403 Access Denied` with the custom header `"X-Error":"the-condition"`: -``` .js +```js var testJSVMData = new TykJS.TykMiddleware.NewMiddleware({}); testJSVMData.NewProcessRequest(function(request, session, config) { @@ -139,30 +160,36 @@ testJSVMData.NewProcessRequest(function(request, session, config) { ``` ### The `session` object + Tyk uses an internal [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) to handle the quota, rate limits, access allowances and auth data of a specific key. JS middleware can be granted access to the session object but there is also the option to disable it as deserialising it into the JSVM is computationally expensive and can add latency. Other than the `meta_data` field, the session object itself cannot be directly edited as it is crucial to the correct functioning of Tyk. #### Limitations - - Custom JS plugins at the [pre-]({{< ref "" >}}) stage do not have access to the session object (as it has not been created yet) - - When scripting for Virtual Endpoints, the `session` data will only be available to the JS function if enabled in the middleware configuration. +- Custom JS plugins at the [pre-]({{< ref "" >}}) stage do not have access to the session object (as it has not been created yet) +- When scripting for Virtual Endpoints, the `session` data will only be available to the JS function if enabled in the middleware configuration. #### Sharing data between middleware using the `session` object + For different middleware to be able to transfer data between each other, the session object makes available a `meta_data` key/value field that is written back to the session store (and can be retrieved by the middleware down the line) - this data is permanent, and can also be retrieved by the REST API from outside of Tyk using the `/tyk/keys/` method. {{< note success >}} -**Note** -A new JSVM instance is created for _each_ API that is managed. Consequently, inter-API communication is not possible via shared methods, since they have different bounds. However, it _is_ possible using the session object if a key is shared across APIs. +**Note** + +A new JSVM instance is created for *each* API that is managed. Consequently, inter-API communication is not possible via shared methods, since they have different bounds. However, it *is* possible using the session object if a key is shared across APIs. {{< /note >}} ### The `config` object + The third Tyk data object that is made available to the script running in the JSVM contains data from the API Definition. This is read-only and cannot be modified by the JS function. The structure of this object is: - - `APIID`: the unique identifier for the API - - `OrgID`: the organisation identifier - - `config_data`: custom attributes defined in the API description + +- `APIID`: the unique identifier for the API +- `OrgID`: the organisation identifier +- `config_data`: custom attributes defined in the API description #### Adding custom attributes to the API Definition + When working with Tyk OAS APIs, you can add custom attributes in the `data` object in the `x-tyk-api-gateway.middleware.global.pluginConfig` section of the API definition, for example: -```.json {linenos=true, linenostart=1} +```json {linenos=true, linenostart=1} { "x-tyk-api-gateway": { "middleware": { @@ -182,7 +209,8 @@ When working with Tyk OAS APIs, you can add custom attributes in the `data` obje ``` When working with Tyk Classic APIs, you simply add the attributes in the `config_data` object in the root of the API definition: -```.json {linenos=true, linenostart=1} + +```json {linenos=true, linenostart=1} { "config_data": { "foo": "bar" @@ -191,25 +219,27 @@ When working with Tyk Classic APIs, you simply add the attributes in the `config ``` ### Underscore.js Library + In addition to our Tyk JavaScript API functions, you also have access to all the functions from the [underscore](http://underscorejs.org) library. -Underscore.js is a JavaScript library that provides a lot of useful functional programming helpers without extending any built-in objects. Underscore provides over 100 functions that support your favourite functional helpers: +Underscore.js is a JavaScript library that provides a lot of useful functional programming helpers without extending any built-in objects. Underscore provides over 100 functions that support your favourite functional helpers: -* map -* filter -* invoke +- map +- filter +- invoke -There are also more specialised goodies, including: +There are also more specialised goodies, including: -* function binding -* JavaScript templating -* creating quick indexes -* deep equality testing +- function binding +- JavaScript templating +- creating quick indexes +- deep equality testing ## Example + In this basic example, we show the creation and initialisation of a middleware object. Note how the three Tyk data objects (`request`, `session`, `config`) are made available to the function and the two objects that are returned from the function (in case the external objects need to be updated). -``` .js {linenos=true, linenostart=1} +```js {linenos=true, linenostart=1} /* --- sampleMiddleware.js --- */ // Create new middleware object @@ -224,4 +254,4 @@ sampleMiddleware.NewProcessRequest(function(request, session, config) { // You MUST return both the request and session metadata return sampleMiddleware.ReturnData(request, session.meta_data); }); -``` \ No newline at end of file +``` diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md index 8377df7b1c..0a4ac658ad 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -111,14 +111,18 @@ Once you have selected the virtual endpoint middleware for the endpoint, you nee - JS function to call - Source type (`file` or `inline`) -If you select source type `file` you must provide the path to the file: {{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-file.png" alt="Configuring file based JS code" >}} +If you select source type `file` you must provide the path to the file: +{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-file.png" alt="Configuring file based JS code" >}} -If you select `inline` you can enter the JavaScript code in the Code Editor window. {{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-inline.png" alt="Configuring inline JS code" >}} +If you select `inline` you can enter the JavaScript code in the Code Editor window. +{{< img src="/img/dashboard/endpoint-designer/virtual-endpoint-inline.png" alt="Configuring inline JS code" >}} #### Step 3: Save the API Use the *save* or *create* buttons to save the changes and activate the Virtual Endpoint middleware. -{{< note success >}} **Note** +{{< note success >}} +**Note** -The Tyk Classic API Designer does not provide options to configure `use_session` or `proxy_on_error`, but you can do this from the Raw Definition editor. {{< /note >}} +The Tyk Classic API Designer does not provide options to configure `use_session` or `proxy_on_error`, but you can do this from the Raw Definition editor. +{{< /note >}} diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 1cc5fdb5d6..4f1445b703 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -31,9 +31,11 @@ The `virtualEndpoint` object has the following configuration: - `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response. Defaults to `false` - `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable. Defaults to `false` -{{< note success >}} **Note** +{{< note success >}} +**Note** -One of either `path` or `body` must be provided, depending on whether you are providing the JavaScript code in a file or inline within the API definition. If both are provided then `body` will take precedence. {{< /note >}} +One of either `path` or `body` must be provided, depending on whether you are providing the JavaScript code in a file or inline within the API definition. If both are provided then `body` will take precedence. +{{< /note >}} For example: From 877c470ac8b70bd13f4bc99be52c789a1a59a7f3 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 17:45:34 +0100 Subject: [PATCH 29/35] Remove x-ratelimit headers from examples, not essential/valuable --- .../compose-apis/demo-virtual-endpoint.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index 4e9f26ac3e..e24bd3d4af 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -54,9 +54,6 @@ log("Virtual Test initialised") HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:39:00 GMT Server: tyk -X-Ratelimit-Limit: 0 -X-Ratelimit-Remaining: 0 -X-Ratelimit-Reset: 0 X-Test: virtual-header X-Test-2: virtual-header-2 Content-Length: 27 @@ -122,9 +119,6 @@ Map-Header: {" key":3} Num-Header: 4 Server: tyk String-Header: string -X-Ratelimit-Limit: 0 -X-Ratelimit-Remaining: 0 -X-Ratelimit-Reset: 0 Content-Length: 26 Content-Type: text/plain; charset=utf-8 @@ -218,9 +212,6 @@ Date: Fri, 08 Jun 2018 21:53:57 GMT Server: tyk Test: virtual Test-2: virtual -X-Ratelimit-Limit: 0 -X-Ratelimit-Remaining: 0 -X-Ratelimit-Reset: 0 Content-Length: 5 Content-Type: text/plain; charset=utf-8 From db12583b14512d48b886bac2c8fa80ee3593b0d9 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 17:46:58 +0100 Subject: [PATCH 30/35] More code block highlighting fixes --- .../compose-apis/demo-virtual-endpoint.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index e24bd3d4af..3064c0da7a 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -50,7 +50,7 @@ log("Virtual Test initialised") 3. The virtual endpoint will terminate the request and return this response: -``` +```http HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:39:00 GMT Server: tyk @@ -64,7 +64,7 @@ VIRTUAL ENDPOINT EXAMPLE #1 4. The gateway logs will include: -``` +```text time="" level=info msg="Virtual Test running" prefix=jsvm type=log-msg time="" level=info msg="Request Body: " prefix=jsvm type=log-msg time="" level=info msg="Session: " prefix=jsvm type=log-msg @@ -111,7 +111,7 @@ function mySecondVirtualHandler (request, session, config) { 4. The virtual endpoint will terminate the request and return this response: -``` +```http HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:29:12 GMT Foo-Header: bar @@ -134,7 +134,7 @@ In this example, every line in the script gives an example of a functionality us - the structure of the request object - using `TykMakeHttpRequest` to make an HTTP request from within the virtual endpoint, and the json it returns - `.Code` and `.Body`. -```{.json} +```js function myVirtualHandlerGetHeaders (request, session, config) { rawlog("Virtual Test running") @@ -190,13 +190,13 @@ You can find a Tyk Classic API definition [here](https://gist.github.com/letzya/ Create a new Tyk Classic API using that API definition and then run the following command to send a request to the API endpoint: -``` +```bash curl http://tyk-gateway:8080/testvirtualendpoint2/headers -H "location: /get" -v ``` This should return the following: -``` +```http Trying 127.0.0.1... TCP_NODELAY set Connected to tyk-gateway (127.0.0.1) port 8080 (#0) @@ -223,7 +223,7 @@ yo yo The `log` and `rawlog` commands in the JS function write to the Tyk Gateway logs. If you check the logs you should see the following: -``` +```text [Jun 13 14:45:21] DEBUG jsvm: Running: myVirtualHandlerGetHeaders Virtual Test running [Jun 13 14:45:21] INFO jsvm-logmsg: Request Session: {"access_rights":null,"alias":"","allowance":0,"apply_policies":null,"apply_policy_id":"","basic_auth_data":{"hash_type":"","password":""},"certificate":"","data_expires":0,"enable_detail_recording":false,"expires":0,"hmac_enabled":false,"hmac_string":"","id_extractor_deadline":0,"is_inactive":false,"jwt_data":{"secret":""},"last_check":0,"last_updated":"","meta_data":null,"monitor":{"trigger_limits":null},"oauth_client_id":"","oauth_keys":null,"org_id":"","per":0,"quota_max":0,"quota_remaining":0,"quota_renewal_rate":0,"quota_renews":0,"rate":0,"session_lifetime":0,"tags":null} type=log-msg From dfafc30ef3a53acc48bf5c47a6d89adc3423a49e Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 18:41:31 +0100 Subject: [PATCH 31/35] Fix code block highlight for javascript apis --- .../javascript-middleware/javascript-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md index 06efc52509..faf05bf48a 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md @@ -73,7 +73,7 @@ To work with the key session object, two functions are provided: `TykGetKeyData` - `TykGetKeyData(api_key, api_id)`: Use this method to retrieve a [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) for the key and the API provided: - ```jq + ```js // In an event handler, we can get the key idea from the event, and the API ID from the context variable. var thisSession = JSON.parse(TykGetKeyData(event.EventMetaData.Key, context.APIID)) log("Expires: " + thisSession.expires) @@ -81,7 +81,7 @@ To work with the key session object, two functions are provided: `TykGetKeyData` - `TykSetKeyData(api_key, api_id)`: Use this method to write data back into the Tyk session store: - ```jq + ```js // You can modify the object just like with the REST API thisSession.expires = thisSession.expires + 1000; From 66af1a7b68b41ce46b5561eef08d694322b4e9b3 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 18:53:15 +0100 Subject: [PATCH 32/35] Sanitize all code blocks on modified files --- .../javascript-middleware/install-middleware/tyk-ce.md | 9 +++++---- .../install-middleware/tyk-hybrid.md | 2 +- .../javascript-middleware/install-middleware/tyk-pro.md | 2 +- .../javascript-middleware/javascript-api.md | 2 +- .../javascript-middleware/middleware-scripting-guide.md | 2 +- .../middleware/virtual-endpoint-tyk-classic.md | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md index fecded3368..2c048a1287 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-ce.md @@ -14,11 +14,14 @@ aliases: --- In order to activate middleware when using Tyk OSS or when using a file-based setup, the middleware needs to be registered as part of your API Definition. Registration of middleware components is relatively simple. + {{< note success >}} **Note** It is important that your object names are unique. -{{< /note >}}{{< note success >}} +{{< /note >}} + +{{< note success >}} **Note** This functionality may change in subsequent releases. @@ -32,9 +35,7 @@ You can do this by setting `enable_jsvm` to `true` in your `tyk.conf` file. Adding the middleware plugin is as simple as adding it to your definition file in the middleware sections: -```yaml -// sample_api.conf - +```json ... "event_handlers": {}, "custom_middleware": { diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md index 9ae84c880e..a38b2efefa 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-hybrid.md @@ -15,7 +15,7 @@ A second method of loading API Definitions in Tyk nodes is to add them as a dire The directory structure looks as follows: -```{.copyWrapper} +```text middleware / {API Id} / pre diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md index db6bd8a4f6..8130694c14 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/install-middleware/tyk-pro.md @@ -15,7 +15,7 @@ Tyk will load the middleware plugins dynamically on host-reload without needing The directory structure should look like this: -```{.copyWrapper} +```text middleware / {API Id} / pre diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md index faf05bf48a..d3e60bb7d9 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/javascript-api.md @@ -30,7 +30,7 @@ Below is the list of functions currently provided by Tyk. - `TykBatchRequest` this function is similar to `TykMakeHttpRequest` but makes use of the Tyk Batch API. See the Batch Requests section of the [Tyk Gateway API]({{< ref "tyk-gateway-api" >}}) for more details. - `TykMakeHttpRequest(JSON.stringify(requestObject))`: This method is used to make an HTTP request, requests are encoded as JSON for deserialisation in the min binary and translation to a system HTTP call. The request object has the following structure: -```{.javascript} +```js newRequest = { "Method": "POST", "Body": JSON.stringify(event), diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 8087e6c62e..0323ef657c 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -81,7 +81,7 @@ The `responseObject` has the following structure: You must provide the `responseObject` together with the `session.meta_data` as parameters in a call to `TykJsResponse` as follows: ```js - return TykJsResponse(responseObject, session.meta_data); +return TykJsResponse(responseObject, session.meta_data); ``` You can find some examples of how this works [here]({{< ref "advanced-configuration/compose-apis/demo-virtual-endpoint" >}}). diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md index 0a4ac658ad..5d1ad1cce1 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -34,7 +34,7 @@ The `virtual` object has the following configuration: For example: -```json {linenos=true, linenostart=1} +```json {linenos=true, linenostart=1} { "extended_paths": { "virtual": [ From cbd1049a58a279b7ab1ca9d0569da0992418e092 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 22 Mar 2024 19:23:16 +0100 Subject: [PATCH 33/35] Update use of console.log to log --- .../javascript-middleware/middleware-scripting-guide.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 0323ef657c..34c182ea43 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -248,8 +248,7 @@ var sampleMiddleware = new TykJS.TykMiddleware.NewMiddleware({}); // Initialise the object with your functionality by passing a closure that accepts // two objects into the NewProcessRequest() function: sampleMiddleware.NewProcessRequest(function(request, session, config) { - - console.log("This middleware does nothing, but will print this to your terminal.") + log("This middleware does nothing, but will print this to your terminal.") // You MUST return both the request and session metadata return sampleMiddleware.ReturnData(request, session.meta_data); From 20d5708ae8140619aa3841ffa6318d6beaab3c6b Mon Sep 17 00:00:00 2001 From: Simon Pears Date: Thu, 28 Mar 2024 14:29:55 +0000 Subject: [PATCH 34/35] Remove tyk-docs/content/advanced-configuration/compose-apis.md --- tyk-docs/content/advanced-configuration.md | 2 +- .../content/advanced-configuration/compose-apis.md | 11 ----------- .../compose-apis/virtual-endpoints.md | 1 + 3 files changed, 2 insertions(+), 12 deletions(-) delete mode 100755 tyk-docs/content/advanced-configuration/compose-apis.md diff --git a/tyk-docs/content/advanced-configuration.md b/tyk-docs/content/advanced-configuration.md index 04d9ea5307..921aabf855 100644 --- a/tyk-docs/content/advanced-configuration.md +++ b/tyk-docs/content/advanced-configuration.md @@ -10,7 +10,7 @@ weight: 60 This section covers less common settings, some of which require custom code. Areas include: * [Transform Traffic]({{< ref "advanced-configuration/transform-traffic" >}}). How to use request and response headers and bodies, URL rewriting, request method transforms, the validation of JSON, JQ transforms and how to use our API Endpoint Designer. -* [Compose APIs]({{< ref "advanced-configuration/compose-apis" >}}). How to make multiple API calls and the batch processing. +* [Compose APIs]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}). How to make multiple API calls and the batch processing. * [Integration Options]({{< ref "advanced-configuration/integrate" >}}). How you can integrate Tyk with 3rd party providers for plugins, API Authentication, and Single Sign On. * [Manage Multiple Environments]({{< ref "advanced-configuration/manage-multiple-environments" >}}). How to configure Tyk Multi-Cloud and Self-Managed installations to work with multiple geographically or physically separate installations. * [WebSockets]({{< ref "advanced-configuration/websockets" >}}). How to use WebSockets connections with Tyk. diff --git a/tyk-docs/content/advanced-configuration/compose-apis.md b/tyk-docs/content/advanced-configuration/compose-apis.md deleted file mode 100755 index 615160ed3f..0000000000 --- a/tyk-docs/content/advanced-configuration/compose-apis.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -date: 2017-03-23T18:07:31Z -title: Compose APIs -weight: 2 -menu: - main: - parent: "Advanced Configuration" ---- - -In some cases you may want to compose multiple API calls or multiple APIs into a bundled or batched request. This is possible with Tyk and can be easily achieved using our [Virtual Endpoint]({{< ref "advanced-configuration/compose-apis/virtual-endpoints" >}}) and the Batch Request section of the [Tyk Gateway API]({{< ref "tyk-gateway-api" >}}) features. - diff --git a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md index 2da0f37ba4..f36d5f2b7c 100755 --- a/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/virtual-endpoints.md @@ -10,6 +10,7 @@ description: Virtual Endpoint middleware date: "2017-03-23T18:08:16Z" aliases: - /compose-apis/virtual-endpoints/ + - /advanced-configuration/compose-apis --- Tyk's Virtual Endpoint is a programmable middleware component that is invoked towards the end of the request processing chain. It can be enabled at the per-endpoint level and can perform complex interactions with your upstream service(s) that cannot be handled by one of the other middleware components. From 71a9204dffdce9fc839070b3706a657f5bea4b23 Mon Sep 17 00:00:00 2001 From: Andy Ost Date: Sun, 31 Mar 2024 15:39:55 +0100 Subject: [PATCH 35/35] Added screenshots, responses to review feedback --- .../tyk-oas-virtual-endpoint-config.png | Bin 0 -> 122152 bytes .../api-designer/tyk-oas-virtual-endpoint.png | Bin 0 -> 10867 bytes .../compose-apis/demo-virtual-endpoint.md | 12 +++-- .../middleware-scripting-guide.md | 3 +- .../virtual-endpoint-tyk-classic.md | 12 ++--- .../middleware/virtual-endpoint-tyk-oas.md | 48 ++++++++++++++---- 6 files changed, 54 insertions(+), 21 deletions(-) create mode 100644 tyk-docs/assets/img/dashboard/api-designer/tyk-oas-virtual-endpoint-config.png create mode 100644 tyk-docs/assets/img/dashboard/api-designer/tyk-oas-virtual-endpoint.png diff --git a/tyk-docs/assets/img/dashboard/api-designer/tyk-oas-virtual-endpoint-config.png b/tyk-docs/assets/img/dashboard/api-designer/tyk-oas-virtual-endpoint-config.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7ca3558808bf3ef3d01164b1d2c85e45904a3 GIT binary patch literal 122152 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

7ReF3UJ{Y%+e1h=^%D@Lsr+Xj3xuzvf66 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∓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 literal 0 HcmV?d00001 diff --git a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md index 3064c0da7a..34771dacad 100644 --- a/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md +++ b/tyk-docs/content/advanced-configuration/compose-apis/demo-virtual-endpoint.md @@ -16,6 +16,10 @@ aliases: Here we offer some examples to demonstrate valid use of JavaScript within Virtual Endpoints. You can either copy and paste the JavaScript code into the code editor in the Tyk Dashboard API Designer, or create a file and place it in a subdirectory of the Tyk configuration environment (for example under the `middleware` folder in your Tyk installation). +For instruction on how to configure the Virtual Endpoint middleware for your APIs, please see the appropriate documentation for the format of API that you are using: +- [Tyk OAS API]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas" >}}) +- [Tyk Classic API]({{< ref "product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic" >}}) + ## Example 1: Accessing Tyk data objects In this example, we demonstrate how you can access different [external Tyk objects]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#accessing-external-and-dynamic-data" >}}) (API request, session key, API definition). @@ -50,7 +54,7 @@ log("Virtual Test initialised") 3. The virtual endpoint will terminate the request and return this response: -```http +```bash HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:39:00 GMT Server: tyk @@ -75,7 +79,7 @@ time="" level=info msg="auth Header: " prefix=jsvm type=log-ms ## Example 2: Accessing custom attributes in the API Definition -You can add [custom attributes]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#passing-custom-attributes-to-middleware" >}}) to the API definition and access these from within your Virtual Endpoint. +You can add [custom attributes]({{< ref "plugins/supported-languages/javascript-middleware/middleware-scripting-guide#adding-custom-attributes-to-the-api-definition" >}}) to the API definition and access these from within your Virtual Endpoint. 1. Add the following custom attributes to your API definition: @@ -111,7 +115,7 @@ function mySecondVirtualHandler (request, session, config) { 4. The virtual endpoint will terminate the request and return this response: -```http +```bash HTTP/1.1 200 OK Date: Thu, 29 Feb 2024 17:29:12 GMT Foo-Header: bar @@ -196,7 +200,7 @@ curl http://tyk-gateway:8080/testvirtualendpoint2/headers -H "location: /get" -v This should return the following: -```http +```bash Trying 127.0.0.1... TCP_NODELAY set Connected to tyk-gateway (127.0.0.1) port 8080 (#0) diff --git a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md index 34c182ea43..87213eed8d 100755 --- a/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md +++ b/tyk-docs/content/plugins/supported-languages/javascript-middleware/middleware-scripting-guide.md @@ -164,7 +164,8 @@ testJSVMData.NewProcessRequest(function(request, session, config) { Tyk uses an internal [session object]({{< ref "getting-started/key-concepts/what-is-a-session-object" >}}) to handle the quota, rate limits, access allowances and auth data of a specific key. JS middleware can be granted access to the session object but there is also the option to disable it as deserialising it into the JSVM is computationally expensive and can add latency. Other than the `meta_data` field, the session object itself cannot be directly edited as it is crucial to the correct functioning of Tyk. #### Limitations -- Custom JS plugins at the [pre-]({{< ref "" >}}) stage do not have access to the session object (as it has not been created yet) + +- Custom JS plugins at the [pre-]({{< ref "plugins/plugin-types/request-plugins" >}}) stage do not have access to the session object (as it has not been created yet) - When scripting for Virtual Endpoints, the `session` data will only be available to the JS function if enabled in the middleware configuration. #### Sharing data between middleware using the `session` object diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md index 5d1ad1cce1..05a19b04cb 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-classic.md @@ -24,8 +24,8 @@ To enable the middleware you must add a new `virtual` object to the `extended_pa The `virtual` object has the following configuration: -- `path`: the path to match on -- `method`: the method to match on +- `path`: the endpoint path +- `method`: the endpoint HTTP method - `response_function_name`: this is the name of the JavaScript function that will be executed when the virtual endpoint is triggered - `function_source_type`: instructs the middleware to look for the JavaScript code either in a `file` or in a base64 encoded `blob`; the actual file location (or base64 encoded code) is provided in `function_source_uri` - `function_source_uri`: if `function_source_type` is set to `file`, this will be the relative path to the source file containing the JavaScript code; if `function_source_type` if set to `blob`, this will be a `base64` encoded string containing the JavaScript code @@ -52,7 +52,7 @@ For example: } ``` -In this example the Virtual Endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. For any call made to this endpoint, Tyk will invoke the function `myUniqueFunctionName` that is `base64` encoded in the `function_source_uri` field. This virtual endpoint does not require access to the session data and will not proxy the request on to the upstream if there is an error when processing the `myUniqueFunctionName` function. +In this example the Virtual Endpoint middleware has been configured for requests to the `GET /anything` endpoint. For any call made to this endpoint, Tyk will invoke the function `myUniqueFunctionName` that is `base64` encoded in the `function_source_uri` field. This virtual endpoint does not require access to the session data and will not proxy the request on to the upstream if there is an error when processing the `myUniqueFunctionName` function. Decoding the value in `function_source_uri` we can see that the JavaScript code is: @@ -68,7 +68,7 @@ function myUniqueFunctionName(request, session, config) { This function will terminate the request without proxying it to the upstream returning `HTTP 200` as follows: -```http +```bash HTTP/1.1 200 OK Date: Wed, 28 Feb 2024 20:52:30 GMT Server: tyk @@ -80,7 +80,7 @@ THIS IS A VIRTUAL RESPONSE If, however, we introduce an error to the JavaScript, such that Tyk fails to process the function, we will receive an `HTTP 500 Internal Server Error` as follows: -```http +```bash HTTP/1.1 500 Internal Server Error Date: Wed, 28 Feb 2024 20:55:27 GMT Server: tyk @@ -96,7 +96,7 @@ If we set `proxy_on_error` to `true` and keep the error in the Javascript, the r ## Configuring the middleware in the API Designer -You can use the API Designer in the Tyk Dashboard to configure the internal endpoint middleware for your Tyk Classic API by following these steps. +You can use the API Designer in the Tyk Dashboard to configure a virtual endpoint for your Tyk Classic API by following these steps. #### Step 1: Add an endpoint for the path and select the plugin diff --git a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md index 4f1445b703..8fa5662719 100644 --- a/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md +++ b/tyk-docs/content/product-stack/tyk-gateway/middleware/virtual-endpoint-tyk-oas.md @@ -18,7 +18,7 @@ If you're using the legacy Tyk Classic APIs, then check out the [Tyk Classic]({{ ## Configuring the middleware in the Tyk OAS API Definition -The design of the Tyk OAS API Definition takes advantage of the `operationID` defined in the OpenAPI Document that declares both the path and method for which the middleware should be added. +The design of the Tyk OAS API Definition takes advantage of the `operationId` defined in the OpenAPI Document that declares both the path and method for which the middleware should be added. Endpoint `paths` entries (and the associated `operationId`) can contain wildcards in the form of any string bracketed by curly braces, for example `/status/{code}`. These wildcards are so they are human readable and do not translate to variable names. Under the hood, a wildcard translates to the “match everything” regex of: `(.*)`. The virtual endpoint middleware (`virtualEndpoint`) can be added to the `operations` section of the Tyk OAS Extension (`x-tyk-api-gateway`) in your Tyk OAS API Definition for the appropriate `operationId` (as configured in the `paths` section of your OpenAPI Document). @@ -28,8 +28,8 @@ The `virtualEndpoint` object has the following configuration: - `functionName`: the name of the JavaScript function that will be executed when the virtual endpoint is triggered - `body`: [optional] a `base64` encoded string containing the JavaScript code - `path`: [optional] the relative path to the source file containing the JavaScript code -- `proxyOnError`: [optional] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response. Defaults to `false` -- `requireSession`: [optional] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable. Defaults to `false` +- `proxyOnError`: [optional, defaults to `false`] a boolean that determines the behaviour of the gateway if an error occurs during the execution of the virtual endpoint's function; if set to `true` the request will be proxied to upstream if the function errors, if set to `false` the request will not be proxied and Tyk will return an error response +- `requireSession`: [optional defaults to `false`] a boolean that indicates whether the virtual endpoint should have access to the session object; if `true` then the key session data will be provided to the function as the `session` variable {{< note success >}} **Note** @@ -83,7 +83,7 @@ For example: "enabled": true, "value": { "map": { - " key": 3 + "key": 3 }, "num": 4, "string": "example" @@ -105,12 +105,12 @@ For example: } ``` -In this example the virtual endpoint middleware has been configured for HTTP `GET` requests to the `/anything` endpoint. We have also configured the following custom attributes in the `pluginConfig` section of the API definition: +In this example the virtual endpoint middleware has been configured for requests to the `GET /anything` endpoint. We have also configured the following custom attributes in the `pluginConfig` section of the API definition: ```json { "map": { - " key": 3 + "key": 3 }, "num": 4, "string": "example" @@ -137,11 +137,11 @@ function myVirtualHandler (request, session, config) { A call to the `GET /anything` endpoint returns: -```http +```bash HTTP/1.1 200 OK Date: Fri, 01 Mar 2024 12:14:36 GMT Foo-Header: bar -Map-Header: {" key":3} +Map-Header: {"key":3} Num-Header: 4 Server: tyk String-Header: example @@ -155,6 +155,34 @@ The configuration above is a complete and valid Tyk OAS API Definition that you ## Configuring the middleware in the API Designer -Adding a Virtual Endpoint to your API endpoints is easy when using the API Designer in the Tyk Dashboard, simply follow the steps taken in this short video: +Adding a Virtual Endpoint to your API endpoints is easy when using the API Designer in the Tyk Dashboard, simply follow these steps: -< placeholder for video > +#### Step 1: Add an endpoint + +From the **API Designer** add an endpoint that matches the path and method to which you want to apply the middleware. + +{{< img src="/img/dashboard/api-designer/tyk-oas-no-endpoints.png" alt="Tyk OAS API Designer showing no endpoints created" >}} + +{{< img src="/img/dashboard/api-designer/tyk-oas-add-endpoint.png" alt="Adding an endpoint to an API using the Tyk OAS API Designer" >}} + +{{< img src="/img/dashboard/api-designer/tyk-oas-no-middleware.png" alt="Tyk OAS API Designer showing no middleware enabled on endpoint" >}} + +#### Step 2: Select the Virtual Endpoint middleware + +Select **ADD MIDDLEWARE** and choose **Virtual Endpoint** from the *Add Middleware* screen. + +{{< img src="/img/dashboard/api-designer/tyk-oas-virtual-endpoint.png" alt="Adding the Virtual Endpoint middleware" >}} + +#### Step 3: Configure the middleware + +Now you can provide either the path to a file containing the JavaScript function to be run by the middleare, or you can directly enter the JavaScript in the code editor. + +For both sources, you must provide the **function name** that should be called when the middleware executes. + +You can also optionally configure the behaviour required if the function should return an error and also indicate to Tyk whether the virtual middleware requires access to the key session metadata. + +{{< img src="/img/dashboard/api-designer/tyk-oas-virtual-endpoint-config.png" alt="Configuring the Virtual Endpoint middleware" >}} + +#### Step 4: Save the API + +Select **ADD MIDDLEWARE** to save the middleware configuration. Remember to select **SAVE API** to apply the changes.