Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/soundcloud/intervene
A machine-in-the-middle proxy for development, enabling mocking and/or modification of API endpoints
https://github.com/soundcloud/intervene
Last synced: about 1 month ago
JSON representation
A machine-in-the-middle proxy for development, enabling mocking and/or modification of API endpoints
- Host: GitHub
- URL: https://github.com/soundcloud/intervene
- Owner: soundcloud
- License: mit
- Created: 2020-04-01T16:25:15.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-09-19T13:50:26.000Z (about 2 months ago)
- Last Synced: 2024-09-27T11:42:09.563Z (about 2 months ago)
- Language: JavaScript
- Homepage:
- Size: 1.39 MB
- Stars: 82
- Watchers: 76
- Forks: 12
- Open Issues: 23
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Intervene [![npm version](https://img.shields.io/npm/v/intervene)](https://www.npmjs.com/package/intervene) [![build status](https://img.shields.io/github/actions/workflow/status/soundcloud/intervene/run-tests.yml)](https://github.com/soundcloud/intervene/actions/workflows/run-tests.yml)
_Hassle free HTTP(S) API proxying for development_
Quickly mock endpoints in HTTP(S) APIs, edit requests and responses, proxy everything else to the real API.
https://intervene.dev
## Example
Let's say you've got a website that accesses your API at https://mycompany.com/api. There's a `GET /api/cat` that returns some JSON information (`name`, `color`, `image`) about a cat. You're planning a major update in the backend to add `GET /api/dog`. It's going to take the backend developers a few days to get that implemented, but you want to start work on the frontend already.
Run this on the command line (Mac or Linux)
`intervene create https://mycompany.com`
It's going to ask for admin privileges because it needs to override some things. It creates a file called `mycompany.com.ts`, which is an `intervene` config. Leave the process running and open the file.
```typescript
import { ProxyConfig, routeBuilder } from '/Users/foo/Library/node_modules/intervene';const config: ProxyConfig = {
target: 'https://mycompany.com',routes: {
// Some example configurations follow
// ...}
};export default config;
```(Don't worry about path in the `import` statement. It's going to depend on how you installed `intervene`, but it is smart enough to automatically patch the path at runtime when importing the config)
You should see the site still works as normal (in chrome at least, you'll get a certificate warning in Firefox which you'll need to accept). `GET /api/cat` still responds the same.
Now let's change the configuration to include a new route:
```typescriptconst config: ProxyConfig = {
target: 'https://mycompany.com',routes: {
'/api/dog': {
name: 'Fido',
color: 'Beige',
image: 'https://dogimages.com/bestdog.jpg'
}}
};
```Save the file (no need to restart the `intervene` process, it will notice and restart itself.
Now, if you `curl -k https://mycompany.com/api/dog`, you'll get the JSON specified in the file. `curl -k https://mycompany.com/api/cat` still responds the same, because it proxies through to the real `https://mycompany.com`.
### Altering responses
Another update is planned to also return the `age` of the cat. You don't want to mock the whole endpoint, you just want to add the `age` property to whatever the real backend returns.
Let's make a method endpoint.
```typescript
const config: ProxyConfig = {
target: 'https://mycompany.com',routes: {
'/api/dog': {
name: 'Fido',
color: 'Beige',
image: 'https://dogimages.com/bestdog.jpg'
},'/api/cat': async (req, h, proxy) => {
const response = await proxy();
response.body.age = 7;
return response;
}}
};
```
Save the file again, and the https://mycompany.com/api/cat endpoint now has an added `age` property, with the rest of the response exactly as returned by the real server.### Documentation
See the documentation at https://intervene.dev