mirror of
https://github.com/CamHenlin/MessagesForMacintosh.git
synced 2024-11-29 08:49:40 +00:00
70 lines
2.3 KiB
Markdown
70 lines
2.3 KiB
Markdown
|
# apollo-link
|
||
|
|
||
|
## Purpose
|
||
|
|
||
|
`apollo-link` is a standard interface for modifying control flow of GraphQL requests and fetching GraphQL results, designed to provide a simple GraphQL client that is capable of extensions.
|
||
|
The targeted use cases of `apollo-link` are highlighted below:
|
||
|
|
||
|
* fetch queries directly without normalized cache
|
||
|
* network interface for Apollo Client
|
||
|
* network interface for Relay Modern
|
||
|
* fetcher for
|
||
|
|
||
|
Apollo Link is the interface for creating new links in your application.
|
||
|
|
||
|
The client sends a request as a method call to a link and can recieve one or more (in the case of subscriptions) responses from the server. The responses are returned using the Observer pattern.
|
||
|
|
||
|
![Apollo Link Chain](https://cdn-images-1.medium.com/max/1600/1*62VLGUaU-9ULCoBCGvgdkQ.png)
|
||
|
|
||
|
Results from the server can be provided by calling `next(result)` on the observer. In the case of a network/transport error (not a GraphQL Error) the `error(err)` method can be used to indicate a response will not be recieved. If multiple responses are not supported by the link, `complete()` should be called to inform the client no further data will be provided.
|
||
|
|
||
|
In the case of an intermediate link, a second argument to `request(operation, forward)` is the link to `forward(operation)` to. `forward` returns an observable and it can be returned directly or subscribed to.
|
||
|
|
||
|
```js
|
||
|
forward(operation).subscribe({
|
||
|
next: result => {
|
||
|
handleTheResult(result)
|
||
|
},
|
||
|
error: error => {
|
||
|
handleTheNetworkError(error)
|
||
|
},
|
||
|
});
|
||
|
```
|
||
|
|
||
|
## Implementing a basic custom transport
|
||
|
|
||
|
```js
|
||
|
import { ApolloLink, Observable } from 'apollo-link';
|
||
|
|
||
|
export class CustomApolloLink extends ApolloLink {
|
||
|
request(operation /*, forward*/) {
|
||
|
//Whether no one is listening anymore
|
||
|
let unsubscribed = false;
|
||
|
|
||
|
return new Observable(observer => {
|
||
|
somehowGetOperationToServer(operation, (error, result) => {
|
||
|
if (unsubscribed) return;
|
||
|
if (error) {
|
||
|
//Network error
|
||
|
observer.error(error);
|
||
|
} else {
|
||
|
observer.next(result);
|
||
|
observer.complete(); //If subscriptions not supported
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function unsubscribe() {
|
||
|
unsubscribed = true;
|
||
|
}
|
||
|
|
||
|
return unsubscribe;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
`npm install apollo-link --save`
|
||
|
|