apollo-link-persisted-queries
Advanced tools
Comparing version 0.0.1-beta.3 to 0.1.0
@@ -5,2 +5,5 @@ # Change log | ||
### 0.1.0 | ||
- handle network errors correctly for 400 and 500 | ||
### 0.0.1-beta.3 | ||
@@ -7,0 +10,0 @@ - change default error handling to only disable on 400 error, not >= 500 |
@@ -7,19 +7,2 @@ (function (global, factory) { | ||
var __assign = (undefined && undefined.__assign) || Object.assign || function(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
var __rest = (undefined && undefined.__rest) || function (s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) | ||
t[p[i]] = s[p[i]]; | ||
return t; | ||
}; | ||
var sha256 = require('hash.js/lib/hash/sha/256'); | ||
@@ -34,12 +17,15 @@ var VERSION = 1; | ||
generateHash: defaultGenerateHash, | ||
disable: function (_a, _b) { | ||
var errors = _a.errors; | ||
var response = _b.response; | ||
if (errors.some(function (_a) { | ||
var message = _a.message; | ||
return message === 'PersistedQueryNotSupported'; | ||
})) { | ||
disable: function (_a) { | ||
var graphQLErrors = _a.graphQLErrors, operation = _a.operation; | ||
if (graphQLErrors && | ||
graphQLErrors.some(function (_a) { | ||
var message = _a.message; | ||
return message === 'PersistedQueryNotSupported'; | ||
})) { | ||
return true; | ||
} | ||
if (response && response.statusCode && response.statusCode === 400) { | ||
var response = operation.getContext().response; | ||
if (response && | ||
response.status && | ||
(response.status === 400 || response.status === 500)) { | ||
return true; | ||
@@ -79,29 +65,41 @@ } | ||
var subscription; | ||
var tried = false; | ||
var handler = { | ||
next: function (_a) { | ||
var data = _a.data, errors = _a.errors, rest = __rest(_a, ["data", "errors"]); | ||
if (!tried && errors) { | ||
tried = true; | ||
supportsPersistedQueries = !disable(__assign({ data: data, errors: errors }, rest), operation.getContext()); | ||
if (errors.some(function (_a) { | ||
var retried = false; | ||
var retry = function (_a, cb) { | ||
var response = _a.response, networkError = _a.networkError; | ||
if ((!retried && (response && response.errors)) || networkError) { | ||
retried = true; | ||
var disablePayload = { | ||
response: response, | ||
networkError: networkError, | ||
operation: operation, | ||
graphQLErrors: response ? response.errors : null, | ||
}; | ||
supportsPersistedQueries = !disable(disablePayload); | ||
if ((response && | ||
response.errors.some(function (_a) { | ||
var message = _a.message; | ||
return message === 'PersistedQueryNotFound'; | ||
}) || | ||
!supportsPersistedQueries) { | ||
if (subscription) | ||
subscription.unsubscribe(); | ||
operation.setContext({ | ||
http: { | ||
includeQuery: true, | ||
includeExtensions: supportsPersistedQueries, | ||
}, | ||
}); | ||
subscription = forward(operation).subscribe(handler); | ||
return; | ||
} | ||
})) || | ||
!supportsPersistedQueries) { | ||
if (subscription) | ||
subscription.unsubscribe(); | ||
operation.setContext({ | ||
http: { | ||
includeQuery: true, | ||
includeExtensions: supportsPersistedQueries, | ||
}, | ||
}); | ||
subscription = forward(operation).subscribe(handler); | ||
return; | ||
} | ||
observer.next(__assign({ data: data, errors: errors }, rest)); | ||
} | ||
cb(); | ||
}; | ||
var handler = { | ||
next: function (response) { | ||
retry({ response: response }, function () { return observer.next(response); }); | ||
}, | ||
error: observer.error.bind(observer), | ||
error: function (networkError) { | ||
retry({ networkError: networkError }, function () { return observer.error(networkError); }); | ||
}, | ||
complete: observer.complete.bind(observer), | ||
@@ -108,0 +106,0 @@ }; |
@@ -1,16 +0,18 @@ | ||
import { ApolloLink } from 'apollo-link'; | ||
import { ExecutionResult } from 'graphql'; | ||
import { ApolloLink, Operation } from 'apollo-link'; | ||
import { ExecutionResult, GraphQLError } from 'graphql'; | ||
export declare const VERSION = 1; | ||
export interface ErrorResponse { | ||
graphQLErrors?: GraphQLError[]; | ||
networkError?: Error; | ||
response?: ExecutionResult; | ||
operation: Operation; | ||
} | ||
export declare const defaultGenerateHash: (query: any) => any; | ||
export declare const defaultOptions: { | ||
generateHash: (query: any) => any; | ||
disable: ({errors}: { | ||
errors: any; | ||
}, {response}: { | ||
response: any; | ||
}) => boolean; | ||
disable: ({graphQLErrors, operation}: ErrorResponse) => boolean; | ||
}; | ||
export declare const createPersistedQueryLink: ({generateHash, disable}?: { | ||
generateHash?: (DocumentNode: any) => string; | ||
disable?: (result: ExecutionResult, context: any) => boolean; | ||
disable?: (error: ErrorResponse) => boolean; | ||
}) => ApolloLink; |
@@ -1,18 +0,1 @@ | ||
var __assign = (this && this.__assign) || Object.assign || function(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
var __rest = (this && this.__rest) || function (s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) | ||
t[p[i]] = s[p[i]]; | ||
return t; | ||
}; | ||
import { ApolloLink, Observable } from 'apollo-link'; | ||
@@ -29,12 +12,15 @@ var sha256 = require('hash.js/lib/hash/sha/256'); | ||
generateHash: defaultGenerateHash, | ||
disable: function (_a, _b) { | ||
var errors = _a.errors; | ||
var response = _b.response; | ||
if (errors.some(function (_a) { | ||
var message = _a.message; | ||
return message === 'PersistedQueryNotSupported'; | ||
})) { | ||
disable: function (_a) { | ||
var graphQLErrors = _a.graphQLErrors, operation = _a.operation; | ||
if (graphQLErrors && | ||
graphQLErrors.some(function (_a) { | ||
var message = _a.message; | ||
return message === 'PersistedQueryNotSupported'; | ||
})) { | ||
return true; | ||
} | ||
if (response && response.statusCode && response.statusCode === 400) { | ||
var response = operation.getContext().response; | ||
if (response && | ||
response.status && | ||
(response.status === 400 || response.status === 500)) { | ||
return true; | ||
@@ -74,29 +60,41 @@ } | ||
var subscription; | ||
var tried = false; | ||
var handler = { | ||
next: function (_a) { | ||
var data = _a.data, errors = _a.errors, rest = __rest(_a, ["data", "errors"]); | ||
if (!tried && errors) { | ||
tried = true; | ||
supportsPersistedQueries = !disable(__assign({ data: data, errors: errors }, rest), operation.getContext()); | ||
if (errors.some(function (_a) { | ||
var retried = false; | ||
var retry = function (_a, cb) { | ||
var response = _a.response, networkError = _a.networkError; | ||
if ((!retried && (response && response.errors)) || networkError) { | ||
retried = true; | ||
var disablePayload = { | ||
response: response, | ||
networkError: networkError, | ||
operation: operation, | ||
graphQLErrors: response ? response.errors : null, | ||
}; | ||
supportsPersistedQueries = !disable(disablePayload); | ||
if ((response && | ||
response.errors.some(function (_a) { | ||
var message = _a.message; | ||
return message === 'PersistedQueryNotFound'; | ||
}) || | ||
!supportsPersistedQueries) { | ||
if (subscription) | ||
subscription.unsubscribe(); | ||
operation.setContext({ | ||
http: { | ||
includeQuery: true, | ||
includeExtensions: supportsPersistedQueries, | ||
}, | ||
}); | ||
subscription = forward(operation).subscribe(handler); | ||
return; | ||
} | ||
})) || | ||
!supportsPersistedQueries) { | ||
if (subscription) | ||
subscription.unsubscribe(); | ||
operation.setContext({ | ||
http: { | ||
includeQuery: true, | ||
includeExtensions: supportsPersistedQueries, | ||
}, | ||
}); | ||
subscription = forward(operation).subscribe(handler); | ||
return; | ||
} | ||
observer.next(__assign({ data: data, errors: errors }, rest)); | ||
} | ||
cb(); | ||
}; | ||
var handler = { | ||
next: function (response) { | ||
retry({ response: response }, function () { return observer.next(response); }); | ||
}, | ||
error: observer.error.bind(observer), | ||
error: function (networkError) { | ||
retry({ networkError: networkError }, function () { return observer.error(networkError); }); | ||
}, | ||
complete: observer.complete.bind(observer), | ||
@@ -103,0 +101,0 @@ }; |
{ | ||
"name": "apollo-link-persisted-queries", | ||
"version": "0.0.1-beta.3", | ||
"version": "0.1.0", | ||
"description": "Use persisted queries with Apollo Link", | ||
@@ -5,0 +5,0 @@ "author": "James Baxley <james@meteor.com>", |
@@ -41,4 +41,13 @@ Automatic Persisted Queries | ||
- `generateHash`: a function that takes the query document and returns the hash. If not provided, `generateHash` defaults to a fast implementation of sha256 + hex digest. | ||
- `disable`: a function which takes the response and context (typically including the fetch response as `response`) and returns a boolean to disable any future persited queries for that session. This defaults to disabling on `PersistedQueryNotSupported` or a 500 or greater status code | ||
- `disable`: a function which takes an ErrorResponse (see below) and returns a boolean to disable any future persited queries for that session. This defaults to disabling on `PersistedQueryNotSupported` or a 400 or 500 http error | ||
**ErrorResponse** | ||
The arugment that the optional `disable` function is given is an object with the following keys: | ||
- `operation`: The Operation that errored (contains query, variables, operationName, and context) | ||
- `response`: The Execution of the reponse (contains data and errors as well extensions if sent from the server) | ||
- `graphQLErrors`: An array of errors from the GraphQL endpoint | ||
- `networkError`: any error during the link execution or server response | ||
*Note*: `networkError` is the value from the downlink's `error` callback. In most cases, `graphQLErrors` is the `errors` field of the result from the last `next` call. A `networkError` can contain additional fields, such as a GraphQL object in the case of a failing HTTP status code from `apollo-link-http`. In this situation, `graphQLErrors` is an alias for `networkError.result.errors` if the property exists. | ||
## Apollo Engine | ||
@@ -45,0 +54,0 @@ Apollo Engine supports recieving and fulfulling Automatic Persisted Queries. Simply adding this link into your client app will improve your network response times when using Apollo Engine. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
47738
136
389