@stigg/cache-transport-graphql 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apollo/OperationTimeoutError.d.ts +3 -0
- package/dist/apollo/OperationTimeoutError.js +10 -0
- package/dist/apollo/TimeoutLink.d.ts +7 -0
- package/dist/apollo/TimeoutLink.js +42 -0
- package/dist/apollo/WebSocketLink.d.ts +9 -0
- package/dist/apollo/WebSocketLink.js +34 -0
- package/dist/apollo/initApolloClient.d.ts +9 -0
- package/dist/apollo/initApolloClient.js +79 -0
- package/dist/apollo/types.d.ts +10 -0
- package/dist/apollo/types.js +3 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +25 -0
- package/dist/services/EdgeApiClient.d.ts +39 -0
- package/dist/services/EdgeApiClient.js +131 -0
- package/dist/services/entitlementsApi.d.ts +31 -0
- package/dist/services/entitlementsApi.js +179 -0
- package/dist/services/graphqlErrorClassifier.d.ts +8 -0
- package/dist/services/graphqlErrorClassifier.js +45 -0
- package/dist/services/graphqlTransport.d.ts +21 -0
- package/dist/services/graphqlTransport.js +24 -0
- package/dist/services/osInfo.d.ts +4 -0
- package/dist/services/osInfo.js +18 -0
- package/dist/types/graphqlClient.d.ts +24 -0
- package/dist/types/graphqlClient.js +3 -0
- package/dist/utils/requestHeaders.d.ts +11 -0
- package/dist/utils/requestHeaders.js +9 -0
- package/package.json +43 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OperationTimeoutError = void 0;
|
|
4
|
+
class OperationTimeoutError extends Error {
|
|
5
|
+
constructor(operationName, timeout) {
|
|
6
|
+
super(`Operation ${operationName} timeout after ${timeout} ms`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
exports.OperationTimeoutError = OperationTimeoutError;
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uVGltZW91dEVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fwb2xsby9PcGVyYXRpb25UaW1lb3V0RXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSxxQkFBc0IsU0FBUSxLQUFLO0lBQzlDLFlBQVksYUFBcUIsRUFBRSxPQUFlO1FBQ2hELEtBQUssQ0FBQyxhQUFhLGFBQWEsa0JBQWtCLE9BQU8sS0FBSyxDQUFDLENBQUM7SUFDbEUsQ0FBQztDQUNGO0FBSkQsc0RBSUMifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ApolloLink, FetchResult, Observable, Operation } from '@apollo/client/core';
|
|
2
|
+
import { NextLink } from '@apollo/client/link/core/types';
|
|
3
|
+
export declare class TimeoutLink extends ApolloLink {
|
|
4
|
+
private readonly timeout;
|
|
5
|
+
constructor(timeout?: number);
|
|
6
|
+
request(operation: Operation, forward?: NextLink): Observable<FetchResult>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeoutLink = void 0;
|
|
4
|
+
const core_1 = require("@apollo/client/core");
|
|
5
|
+
const OperationTimeoutError_1 = require("./OperationTimeoutError");
|
|
6
|
+
class TimeoutLink extends core_1.ApolloLink {
|
|
7
|
+
constructor(timeout = 30000) {
|
|
8
|
+
super();
|
|
9
|
+
this.timeout = timeout;
|
|
10
|
+
}
|
|
11
|
+
request(operation, forward) {
|
|
12
|
+
return new core_1.Observable((observer) => {
|
|
13
|
+
const timeout = operation.getContext().timeout || this.timeout;
|
|
14
|
+
const timerHandle = setTimeout(() => {
|
|
15
|
+
observer.error(new OperationTimeoutError_1.OperationTimeoutError(operation.operationName, timeout));
|
|
16
|
+
}, timeout);
|
|
17
|
+
if (!forward) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const subscription = forward(operation).subscribe({
|
|
21
|
+
next: (result) => {
|
|
22
|
+
clearTimeout(timerHandle);
|
|
23
|
+
observer.next(result);
|
|
24
|
+
},
|
|
25
|
+
error: (error) => {
|
|
26
|
+
clearTimeout(timerHandle);
|
|
27
|
+
observer.error(error);
|
|
28
|
+
},
|
|
29
|
+
complete: () => {
|
|
30
|
+
clearTimeout(timerHandle);
|
|
31
|
+
observer.complete();
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
return () => {
|
|
35
|
+
clearTimeout(timerHandle);
|
|
36
|
+
subscription.unsubscribe();
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.TimeoutLink = TimeoutLink;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZW91dExpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBvbGxvL1RpbWVvdXRMaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhDQUFxRjtBQUVyRixtRUFBZ0U7QUFFaEUsTUFBYSxXQUFZLFNBQVEsaUJBQVU7SUFDekMsWUFBNkIsVUFBVSxLQUFNO1FBQzNDLEtBQUssRUFBRSxDQUFDO1FBRG1CLFlBQU8sR0FBUCxPQUFPLENBQVM7SUFFN0MsQ0FBQztJQUVNLE9BQU8sQ0FBQyxTQUFvQixFQUFFLE9BQWtCO1FBQ3JELE9BQU8sSUFBSSxpQkFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQy9ELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSw2Q0FBcUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDOUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRVosSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDaEQsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2YsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNmLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDMUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNiLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDMUIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN0QixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTyxHQUFHLEVBQUU7Z0JBQ1YsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFyQ0Qsa0NBcUNDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ApolloLink, FetchResult, Observable, Operation } from '@apollo/client/core';
|
|
2
|
+
import { ClientOptions } from 'graphql-ws';
|
|
3
|
+
import { SlimLogger } from '@stigg/cache-core';
|
|
4
|
+
export declare class WebSocketLink extends ApolloLink {
|
|
5
|
+
private readonly loggerService;
|
|
6
|
+
private client;
|
|
7
|
+
constructor(options: ClientOptions, loggerService: SlimLogger);
|
|
8
|
+
request(operation: Operation): Observable<FetchResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketLink = void 0;
|
|
4
|
+
const core_1 = require("@apollo/client/core");
|
|
5
|
+
const graphql_ws_1 = require("graphql-ws");
|
|
6
|
+
const graphql_1 = require("graphql");
|
|
7
|
+
class WebSocketLink extends core_1.ApolloLink {
|
|
8
|
+
constructor(options, loggerService) {
|
|
9
|
+
super();
|
|
10
|
+
this.loggerService = loggerService;
|
|
11
|
+
this.client = (0, graphql_ws_1.createClient)(Object.assign({}, options));
|
|
12
|
+
}
|
|
13
|
+
request(operation) {
|
|
14
|
+
return new core_1.Observable((sink) => {
|
|
15
|
+
return this.client.subscribe(Object.assign(Object.assign({}, operation), { query: (0, graphql_1.print)(operation.query) }), {
|
|
16
|
+
next: (value) => sink.next(value),
|
|
17
|
+
complete: sink.complete.bind(sink),
|
|
18
|
+
error: (error) => {
|
|
19
|
+
const errorReason = error.message || error.reason;
|
|
20
|
+
if (errorReason.includes('ThrottlerException')) {
|
|
21
|
+
this.loggerService.log(`Websocket disconnected. reason: Throttle error`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Error can be also a close event.
|
|
25
|
+
this.loggerService.error(`Websocket disconnected. reason: ${errorReason || 'connection closed'}`);
|
|
26
|
+
}
|
|
27
|
+
sink.error(error);
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.WebSocketLink = WebSocketLink;
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0TGluay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcG9sbG8vV2ViU29ja2V0TGluay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBcUY7QUFDckYsMkNBQWlFO0FBRWpFLHFDQUFnQztBQUVoQyxNQUFhLGFBQWMsU0FBUSxpQkFBVTtJQUczQyxZQUNFLE9BQXNCLEVBQ0wsYUFBeUI7UUFFMUMsS0FBSyxFQUFFLENBQUM7UUFGUyxrQkFBYSxHQUFiLGFBQWEsQ0FBWTtRQUcxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUEseUJBQVksb0JBQ3JCLE9BQU8sRUFDVixDQUFDO0lBQ0wsQ0FBQztJQUVNLE9BQU8sQ0FBQyxTQUFvQjtRQUNqQyxPQUFPLElBQUksaUJBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLGlDQUNyQixTQUFTLEtBQUUsS0FBSyxFQUFFLElBQUEsZUFBSyxFQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FDN0M7Z0JBQ0UsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQW9CLENBQUM7Z0JBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUNwQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ2xELElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7d0JBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7b0JBQzNFLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixtQ0FBbUM7d0JBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxXQUFXLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO29CQUNwRyxDQUFDO29CQUVELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLENBQUM7YUFDRixDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5DRCxzQ0FtQ0MifQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ApolloClient } from '@apollo/client/core';
|
|
2
|
+
import { SlimLogger } from '@stigg/cache-core';
|
|
3
|
+
import { ApolloClientConfiguration } from './types';
|
|
4
|
+
declare const initApolloClient: ({ apiKey, baseUri, wsUrl, onConnected, loggerService, source, getInstanceId, clientName, clientVersion, timeout, }: ApolloClientConfiguration & {
|
|
5
|
+
onConnected: () => void;
|
|
6
|
+
loggerService: SlimLogger;
|
|
7
|
+
getInstanceId: () => string | undefined;
|
|
8
|
+
}) => ApolloClient<import("@apollo/client/core").NormalizedCacheObject>;
|
|
9
|
+
export default initApolloClient;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const core_1 = require("@apollo/client/core");
|
|
7
|
+
const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
|
|
8
|
+
const cross_fetch_1 = __importDefault(require("cross-fetch"));
|
|
9
|
+
const utilities_1 = require("@apollo/client/utilities");
|
|
10
|
+
const requestHeaders_1 = require("../utils/requestHeaders");
|
|
11
|
+
const retry_1 = require("@apollo/client/link/retry");
|
|
12
|
+
const WebSocketLink_1 = require("./WebSocketLink");
|
|
13
|
+
const TimeoutLink_1 = require("./TimeoutLink");
|
|
14
|
+
const OperationTimeoutError_1 = require("./OperationTimeoutError");
|
|
15
|
+
const retryIf = (error) => {
|
|
16
|
+
const doNotRetryCodes = [500, 400];
|
|
17
|
+
const errorIsTimeout = error instanceof OperationTimeoutError_1.OperationTimeoutError;
|
|
18
|
+
return !!error && !doNotRetryCodes.includes(error.statusCode) && !errorIsTimeout;
|
|
19
|
+
};
|
|
20
|
+
function getAuthLink(source, apiKey, instanceId) {
|
|
21
|
+
const authLink = new core_1.ApolloLink((operation, forward) => {
|
|
22
|
+
operation.setContext({
|
|
23
|
+
headers: (0, requestHeaders_1.buildRequestHeaders)(source, apiKey, instanceId, operation.operationName),
|
|
24
|
+
});
|
|
25
|
+
return forward(operation);
|
|
26
|
+
});
|
|
27
|
+
return authLink;
|
|
28
|
+
}
|
|
29
|
+
function getHttpLink(baseUri) {
|
|
30
|
+
return new core_1.HttpLink({
|
|
31
|
+
uri: `${baseUri}/graphql`,
|
|
32
|
+
fetch: cross_fetch_1.default,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function getWsLink(source, wsUrl, onConnected, apiKey, loggerService, getInstanceId) {
|
|
36
|
+
return new WebSocketLink_1.WebSocketLink({
|
|
37
|
+
retryAttempts: Infinity,
|
|
38
|
+
isFatalConnectionProblem: () => false,
|
|
39
|
+
connectionAckWaitTimeout: Infinity,
|
|
40
|
+
keepAlive: 10000,
|
|
41
|
+
url: `${wsUrl}/graphql`,
|
|
42
|
+
on: {
|
|
43
|
+
connected: onConnected,
|
|
44
|
+
},
|
|
45
|
+
webSocketImpl: isomorphic_ws_1.default,
|
|
46
|
+
connectionParams: {
|
|
47
|
+
headers: (0, requestHeaders_1.buildRequestHeaders)(source, apiKey, getInstanceId()),
|
|
48
|
+
},
|
|
49
|
+
}, loggerService);
|
|
50
|
+
}
|
|
51
|
+
const initApolloClient = ({ apiKey, baseUri, wsUrl, onConnected, loggerService, source, getInstanceId, clientName, clientVersion, timeout, }) => {
|
|
52
|
+
const authLink = getAuthLink(source, apiKey, getInstanceId());
|
|
53
|
+
const httpLink = getHttpLink(baseUri);
|
|
54
|
+
const timeoutHttpLink = new TimeoutLink_1.TimeoutLink(timeout).concat(httpLink);
|
|
55
|
+
const retryLink = new retry_1.RetryLink({
|
|
56
|
+
attempts: { max: 5, retryIf },
|
|
57
|
+
delay: { initial: 500, max: 2000, jitter: true },
|
|
58
|
+
});
|
|
59
|
+
const wsLink = getWsLink(source, wsUrl, onConnected, apiKey, loggerService, getInstanceId);
|
|
60
|
+
const splitLink = (0, core_1.split)(({ query }) => {
|
|
61
|
+
const definition = (0, utilities_1.getMainDefinition)(query);
|
|
62
|
+
return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
|
|
63
|
+
}, wsLink, retryLink.concat(timeoutHttpLink));
|
|
64
|
+
return new core_1.ApolloClient({
|
|
65
|
+
link: authLink.concat(splitLink),
|
|
66
|
+
cache: new core_1.InMemoryCache(),
|
|
67
|
+
clientAwareness: {
|
|
68
|
+
name: clientName,
|
|
69
|
+
version: clientVersion,
|
|
70
|
+
},
|
|
71
|
+
defaultOptions: {
|
|
72
|
+
query: {
|
|
73
|
+
fetchPolicy: 'no-cache',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
exports.default = initApolloClient;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdEFwb2xsb0NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcG9sbG8vaW5pdEFwb2xsb0NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDhDQUErRjtBQUMvRixrRUFBK0I7QUFDL0IsOERBQWdDO0FBQ2hDLHdEQUE2RDtBQUU3RCw0REFBOEQ7QUFDOUQscURBQXNEO0FBQ3RELG1EQUFnRDtBQUVoRCwrQ0FBNEM7QUFDNUMsbUVBQWdFO0FBRWhFLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7SUFDN0IsTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxjQUFjLEdBQUcsS0FBSyxZQUFZLDZDQUFxQixDQUFDO0lBQzlELE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0FBQ25GLENBQUMsQ0FBQztBQUVGLFNBQVMsV0FBVyxDQUFDLE1BQWtCLEVBQUUsTUFBMEIsRUFBRSxVQUE4QjtJQUNqRyxNQUFNLFFBQVEsR0FBRyxJQUFJLGlCQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckQsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNuQixPQUFPLEVBQUUsSUFBQSxvQ0FBbUIsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDO1NBQ2xGLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQWU7SUFDbEMsT0FBTyxJQUFJLGVBQVEsQ0FBQztRQUNsQixHQUFHLEVBQUUsR0FBRyxP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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBvbGxvL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { default as EntitlementsApi } from './services/entitlementsApi';
|
|
2
|
+
export { EdgeApiClient, EdgeApiClientConfiguration } from './services/EdgeApiClient';
|
|
3
|
+
export { createGraphQLTransport, GraphQLTransport, GraphQLTransportParams } from './services/graphqlTransport';
|
|
4
|
+
export { buildRequestHeaders } from './utils/requestHeaders';
|
|
5
|
+
export { SourceType } from '@stigg/api-client-js';
|
|
6
|
+
export { GraphQLClient, GraphQLObservable, GraphQLOperationResult, GraphQLQueryResult } from './types/graphqlClient';
|
|
7
|
+
export { default as initApolloClient } from './apollo/initApolloClient';
|
|
8
|
+
export { ApolloClientConfiguration } from './apollo/types';
|
|
9
|
+
export { OperationTimeoutError } from './apollo/OperationTimeoutError';
|
|
10
|
+
export { GraphQLErrorClassifier } from './services/graphqlErrorClassifier';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GraphQLErrorClassifier = exports.OperationTimeoutError = exports.initApolloClient = exports.SourceType = exports.buildRequestHeaders = exports.createGraphQLTransport = exports.EdgeApiClient = exports.EntitlementsApi = void 0;
|
|
7
|
+
var entitlementsApi_1 = require("./services/entitlementsApi");
|
|
8
|
+
Object.defineProperty(exports, "EntitlementsApi", { enumerable: true, get: function () { return __importDefault(entitlementsApi_1).default; } });
|
|
9
|
+
var EdgeApiClient_1 = require("./services/EdgeApiClient");
|
|
10
|
+
Object.defineProperty(exports, "EdgeApiClient", { enumerable: true, get: function () { return EdgeApiClient_1.EdgeApiClient; } });
|
|
11
|
+
var graphqlTransport_1 = require("./services/graphqlTransport");
|
|
12
|
+
Object.defineProperty(exports, "createGraphQLTransport", { enumerable: true, get: function () { return graphqlTransport_1.createGraphQLTransport; } });
|
|
13
|
+
var requestHeaders_1 = require("./utils/requestHeaders");
|
|
14
|
+
Object.defineProperty(exports, "buildRequestHeaders", { enumerable: true, get: function () { return requestHeaders_1.buildRequestHeaders; } });
|
|
15
|
+
// `source` is a transport-level header value, so consumers get it from here rather than depending
|
|
16
|
+
// on the generated GraphQL client for one enum.
|
|
17
|
+
var api_client_js_1 = require("@stigg/api-client-js");
|
|
18
|
+
Object.defineProperty(exports, "SourceType", { enumerable: true, get: function () { return api_client_js_1.SourceType; } });
|
|
19
|
+
var initApolloClient_1 = require("./apollo/initApolloClient");
|
|
20
|
+
Object.defineProperty(exports, "initApolloClient", { enumerable: true, get: function () { return __importDefault(initApolloClient_1).default; } });
|
|
21
|
+
var OperationTimeoutError_1 = require("./apollo/OperationTimeoutError");
|
|
22
|
+
Object.defineProperty(exports, "OperationTimeoutError", { enumerable: true, get: function () { return OperationTimeoutError_1.OperationTimeoutError; } });
|
|
23
|
+
var graphqlErrorClassifier_1 = require("./services/graphqlErrorClassifier");
|
|
24
|
+
Object.defineProperty(exports, "GraphQLErrorClassifier", { enumerable: true, get: function () { return graphqlErrorClassifier_1.GraphQLErrorClassifier; } });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQXdFO0FBQS9ELG1JQUFBLE9BQU8sT0FBbUI7QUFDbkMsMERBQXFGO0FBQTVFLDhHQUFBLGFBQWEsT0FBQTtBQUN0QixnRUFBK0c7QUFBdEcsMEhBQUEsc0JBQXNCLE9BQUE7QUFDL0IseURBQTZEO0FBQXBELHFIQUFBLG1CQUFtQixPQUFBO0FBQzVCLGtHQUFrRztBQUNsRyxnREFBZ0Q7QUFDaEQsc0RBQWtEO0FBQXpDLDJHQUFBLFVBQVUsT0FBQTtBQUVuQiw4REFBd0U7QUFBL0QscUlBQUEsT0FBTyxPQUFvQjtBQUVwQyx3RUFBdUU7QUFBOUQsOEhBQUEscUJBQXFCLE9BQUE7QUFDOUIsNEVBQTJFO0FBQWxFLGdJQUFBLHNCQUFzQixPQUFBIn0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { GraphQLQueryResult } from '../types/graphqlClient';
|
|
3
|
+
import { GetActiveSubscriptionsListQuery, GetEntitlementsStateQuery, GetPaywallQuery, GetSdkConfigurationQuery, SourceType } from '@stigg/api-client-js';
|
|
4
|
+
import { SlimLogger } from '@stigg/cache-core';
|
|
5
|
+
export type EdgeApiClientConfiguration = {
|
|
6
|
+
source: SourceType;
|
|
7
|
+
getInstanceId: () => string | undefined;
|
|
8
|
+
apiKey: string;
|
|
9
|
+
baseEdgeUri: string;
|
|
10
|
+
enableEdge: boolean;
|
|
11
|
+
timeout: number;
|
|
12
|
+
entitlementsTimeout: number;
|
|
13
|
+
};
|
|
14
|
+
export declare class EdgeApiClient {
|
|
15
|
+
private readonly config;
|
|
16
|
+
private readonly loggerService;
|
|
17
|
+
private readonly httpClient;
|
|
18
|
+
private constructor();
|
|
19
|
+
static create(config: EdgeApiClientConfiguration, loggerService: SlimLogger): EdgeApiClient | null;
|
|
20
|
+
getPaywall(productId?: string, billingCountryCode?: string, fetchAllCountriesPrices?: boolean, includeHiddenPlans?: boolean): Promise<GraphQLQueryResult<GetPaywallQuery> & {
|
|
21
|
+
errors?: readonly any[];
|
|
22
|
+
}>;
|
|
23
|
+
getEntitlementsState(customerId: string, resourceId: string | undefined): Promise<GraphQLQueryResult<GetEntitlementsStateQuery> & {
|
|
24
|
+
errors?: readonly any[];
|
|
25
|
+
}>;
|
|
26
|
+
getActiveSubscriptionsList(customerId: string, resourceId: string | string[] | undefined): Promise<GraphQLQueryResult<GetActiveSubscriptionsListQuery> & {
|
|
27
|
+
errors?: readonly any[];
|
|
28
|
+
}>;
|
|
29
|
+
getSdkConfiguration(): Promise<GraphQLQueryResult<GetSdkConfigurationQuery> & {
|
|
30
|
+
errors?: readonly any[];
|
|
31
|
+
}>;
|
|
32
|
+
private get;
|
|
33
|
+
private initHttpClient;
|
|
34
|
+
/**
|
|
35
|
+
* Public for mocking in tests
|
|
36
|
+
*/
|
|
37
|
+
enableRetries(axiosInstance: AxiosInstance): void;
|
|
38
|
+
private canRetryRequest;
|
|
39
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.EdgeApiClient = void 0;
|
|
40
|
+
const axios_1 = __importDefault(require("axios"));
|
|
41
|
+
// ApolloError is kept as the thrown type so downstream error extraction, which reads
|
|
42
|
+
// `graphQLErrors` duck-typed, behaves exactly as it did inside node-server-sdk.
|
|
43
|
+
const core_1 = require("@apollo/client/core");
|
|
44
|
+
const requestHeaders_1 = require("../utils/requestHeaders");
|
|
45
|
+
const axios_retry_1 = __importDefault(require("axios-retry"));
|
|
46
|
+
const http = __importStar(require("http"));
|
|
47
|
+
const https = __importStar(require("https"));
|
|
48
|
+
const lodash_1 = require("lodash");
|
|
49
|
+
const REQUEST_RETRY_COUNT = 3;
|
|
50
|
+
class EdgeApiClient {
|
|
51
|
+
constructor(config, loggerService) {
|
|
52
|
+
this.config = config;
|
|
53
|
+
this.loggerService = loggerService;
|
|
54
|
+
const { apiKey, baseEdgeUri } = config;
|
|
55
|
+
this.httpClient = this.initHttpClient(baseEdgeUri, apiKey);
|
|
56
|
+
}
|
|
57
|
+
static create(config, loggerService) {
|
|
58
|
+
return config.enableEdge ? new EdgeApiClient(config, loggerService) : null;
|
|
59
|
+
}
|
|
60
|
+
getPaywall(productId, billingCountryCode, fetchAllCountriesPrices, includeHiddenPlans) {
|
|
61
|
+
const prefix = productId ? `/p/${productId}` : '';
|
|
62
|
+
const fetchAllCountriesPricesQueryParam = `fetchAllCountriesPrices=${fetchAllCountriesPrices}`;
|
|
63
|
+
let url = `/v1${prefix}/paywall.json?${fetchAllCountriesPricesQueryParam}`;
|
|
64
|
+
if (billingCountryCode) {
|
|
65
|
+
url += `&billingCountryCode=${billingCountryCode}`;
|
|
66
|
+
}
|
|
67
|
+
if (includeHiddenPlans) {
|
|
68
|
+
url += `&includeHiddenPlans=${includeHiddenPlans}`;
|
|
69
|
+
}
|
|
70
|
+
return this.get(url);
|
|
71
|
+
}
|
|
72
|
+
getEntitlementsState(customerId, resourceId) {
|
|
73
|
+
const url = `/v1/c/${customerId}/entitlements-state.json${resourceId ? `?resourceId=${resourceId}` : ''}`;
|
|
74
|
+
return this.get(url, {
|
|
75
|
+
timeout: this.config.entitlementsTimeout,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
getActiveSubscriptionsList(customerId, resourceId) {
|
|
79
|
+
const queryString = new URLSearchParams();
|
|
80
|
+
if ((0, lodash_1.isString)(resourceId)) {
|
|
81
|
+
queryString.set('resourceId', resourceId);
|
|
82
|
+
}
|
|
83
|
+
else if ((0, lodash_1.isArray)(resourceId)) {
|
|
84
|
+
resourceId.forEach((x) => queryString.append('resourceIds', x));
|
|
85
|
+
}
|
|
86
|
+
const url = `/v1/c/${customerId}/subscriptions.json?${queryString.toString()}`;
|
|
87
|
+
return this.get(url);
|
|
88
|
+
}
|
|
89
|
+
getSdkConfiguration() {
|
|
90
|
+
return this.get(`/v1/config/server-sdk-configuration.json`);
|
|
91
|
+
}
|
|
92
|
+
async get(url, options) {
|
|
93
|
+
const response = await this.httpClient.get(url, options);
|
|
94
|
+
const { data } = response;
|
|
95
|
+
if (!(0, lodash_1.isEmpty)(data.errors)) {
|
|
96
|
+
throw new core_1.ApolloError({ graphQLErrors: data.errors });
|
|
97
|
+
}
|
|
98
|
+
return data;
|
|
99
|
+
}
|
|
100
|
+
initHttpClient(baseEdgeUri, apiKey) {
|
|
101
|
+
const axiosInstance = axios_1.default.create({
|
|
102
|
+
baseURL: baseEdgeUri,
|
|
103
|
+
headers: Object.assign(Object.assign({}, (0, requestHeaders_1.buildRequestHeaders)(this.config.source, apiKey, this.config.getInstanceId())), { 'X-API-VERSION': '1' }),
|
|
104
|
+
timeout: this.config.timeout,
|
|
105
|
+
httpAgent: new http.Agent({ keepAlive: true }),
|
|
106
|
+
httpsAgent: new https.Agent({ keepAlive: true }),
|
|
107
|
+
});
|
|
108
|
+
this.enableRetries(axiosInstance);
|
|
109
|
+
return axiosInstance;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Public for mocking in tests
|
|
113
|
+
*/
|
|
114
|
+
enableRetries(axiosInstance) {
|
|
115
|
+
(0, axios_retry_1.default)(axiosInstance, {
|
|
116
|
+
retries: REQUEST_RETRY_COUNT,
|
|
117
|
+
retryCondition: (error) => this.canRetryRequest(error),
|
|
118
|
+
retryDelay: (retryNumber, error) => axios_retry_1.default.exponentialDelay(retryNumber, error, 2000),
|
|
119
|
+
shouldResetTimeout: false,
|
|
120
|
+
onRetry: async (retryCount, error, requestConfig) => this.loggerService.log(`Retrying request ${requestConfig.url} - attempt ${retryCount}`, {
|
|
121
|
+
previousError: error.message,
|
|
122
|
+
}),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
canRetryRequest(error) {
|
|
126
|
+
const isTimeoutError = error.code === 'ECONNABORTED' && error.message.includes('timeout');
|
|
127
|
+
return isTimeoutError || axios_retry_1.default.isNetworkOrIdempotentRequestError(error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.EdgeApiClient = EdgeApiClient;
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWRnZUFwaUNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9FZGdlQXBpQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFvRjtBQUNwRixxRkFBcUY7QUFDckYsZ0ZBQWdGO0FBQ2hGLDhDQUFrRDtBQVVsRCw0REFBOEQ7QUFFOUQsOERBQXFDO0FBQ3JDLDJDQUE2QjtBQUM3Qiw2Q0FBK0I7QUFDL0IsbUNBQW9EO0FBRXBELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBYzlCLE1BQWEsYUFBYTtJQUd4QixZQUNtQixNQUFrQyxFQUNsQyxhQUF5QjtRQUR6QixXQUFNLEdBQU4sTUFBTSxDQUE0QjtRQUNsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBWTtRQUUxQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWtDLEVBQUUsYUFBeUI7UUFDekUsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RSxDQUFDO0lBRUQsVUFBVSxDQUNSLFNBQWtCLEVBQ2xCLGtCQUEyQixFQUMzQix1QkFBaUMsRUFDakMsa0JBQTRCO1FBRTVCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0saUNBQWlDLEdBQUcsMkJBQTJCLHVCQUF1QixFQUFFLENBQUM7UUFFL0YsSUFB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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { GraphQLClient, GraphQLOperationResult, GraphQLQueryResult } from '../types/graphqlClient';
|
|
2
|
+
import { EdgeApiClient } from './EdgeApiClient';
|
|
3
|
+
import { GraphQLErrorClassifier } from './graphqlErrorClassifier';
|
|
4
|
+
import { SlimLogger } from '@stigg/cache-core';
|
|
5
|
+
import { CreditConsumptionInput, CreditConsumptionResult, EntitlementsState, EntitlementsTransport, EntitlementsUpdatedEvent, PackagePublishedEvent, TransportObservable, UsageMeasurementBulkInput, UsageMeasurementInput, UsageMeasurementResult, UsageUpdatedEvent } from '@stigg/cache-runtime';
|
|
6
|
+
import { ConsumeCreditInput, ConsumeCreditsAsyncMutation, EntitlementUnionFragment, EstimateEventCostInput, EstimateEventCostQuery, EstimateUsageCostInput, EstimateUsageCostQuery, PackagePublishedPayloadFragment, ReportEventMutation, ReportEventMutationVariables } from '@stigg/api-client-js';
|
|
7
|
+
declare class EntitlementsApi implements EntitlementsTransport<EntitlementUnionFragment, PackagePublishedPayloadFragment> {
|
|
8
|
+
private readonly client;
|
|
9
|
+
private readonly edgeApiClient;
|
|
10
|
+
private readonly loggerService;
|
|
11
|
+
constructor(client: GraphQLClient, edgeApiClient: EdgeApiClient | null, loggerService: SlimLogger);
|
|
12
|
+
readonly classifier: GraphQLErrorClassifier;
|
|
13
|
+
/** The sdk configuration query is the cheapest authenticated round-trip; its response is unused. */
|
|
14
|
+
validateApiKey(): Promise<void>;
|
|
15
|
+
/** Drops results the read policy cannot act on, logging them exactly as it used to. */
|
|
16
|
+
private project;
|
|
17
|
+
getEntitlementsState(customerId: string, resourceId: string | undefined, skipEdge?: boolean, timeout?: number): Promise<EntitlementsState<EntitlementUnionFragment>>;
|
|
18
|
+
private fetchEntitlementsState;
|
|
19
|
+
reportUsage(input: UsageMeasurementInput): Promise<UsageMeasurementResult>;
|
|
20
|
+
reportUsageBulk(input: UsageMeasurementBulkInput): Promise<UsageMeasurementResult[]>;
|
|
21
|
+
consumeCredits(input: CreditConsumptionInput): Promise<CreditConsumptionResult>;
|
|
22
|
+
private toUsageMeasurementVariables;
|
|
23
|
+
consumeCreditsAsync(consumptions: ConsumeCreditInput[]): Promise<GraphQLOperationResult<ConsumeCreditsAsyncMutation>>;
|
|
24
|
+
reportEvent(data: ReportEventMutationVariables['input']['usageEvents']): Promise<GraphQLOperationResult<ReportEventMutation>>;
|
|
25
|
+
estimateEventCost(input: EstimateEventCostInput): Promise<GraphQLQueryResult<EstimateEventCostQuery>>;
|
|
26
|
+
estimateUsageCost(input: EstimateUsageCostInput): Promise<GraphQLQueryResult<EstimateUsageCostQuery>>;
|
|
27
|
+
subscribeEntitlementsUpdated(): TransportObservable<EntitlementsUpdatedEvent<EntitlementUnionFragment>>;
|
|
28
|
+
subscribeUsageUpdated(): TransportObservable<UsageUpdatedEvent>;
|
|
29
|
+
subscribePackagePublished(): TransportObservable<PackagePublishedEvent<PackagePublishedPayloadFragment>>;
|
|
30
|
+
}
|
|
31
|
+
export default EntitlementsApi;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const graphqlErrorClassifier_1 = require("./graphqlErrorClassifier");
|
|
15
|
+
const cache_core_1 = require("@stigg/cache-core");
|
|
16
|
+
const api_client_js_1 = require("@stigg/api-client-js");
|
|
17
|
+
/**
|
|
18
|
+
* cache-core declares its enumerations as literal unions, so carrying one out into an
|
|
19
|
+
* API-typed variable needs an explicit conversion. A `Record` rather than a cast so that
|
|
20
|
+
* adding a member on either side fails to compile.
|
|
21
|
+
*/
|
|
22
|
+
const USAGE_UPDATE_BEHAVIOR = {
|
|
23
|
+
DELTA: api_client_js_1.UsageUpdateBehavior.Delta,
|
|
24
|
+
SET: api_client_js_1.UsageUpdateBehavior.Set,
|
|
25
|
+
};
|
|
26
|
+
class EntitlementsApi {
|
|
27
|
+
constructor(client, edgeApiClient, loggerService) {
|
|
28
|
+
this.client = client;
|
|
29
|
+
this.edgeApiClient = edgeApiClient;
|
|
30
|
+
this.loggerService = loggerService;
|
|
31
|
+
this.classifier = new graphqlErrorClassifier_1.GraphQLErrorClassifier();
|
|
32
|
+
}
|
|
33
|
+
/** The sdk configuration query is the cheapest authenticated round-trip; its response is unused. */
|
|
34
|
+
async validateApiKey() {
|
|
35
|
+
if (this.edgeApiClient) {
|
|
36
|
+
await this.edgeApiClient.getSdkConfiguration();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
await this.client.query({
|
|
40
|
+
query: api_client_js_1.GetSdkConfigurationDocument,
|
|
41
|
+
fetchPolicy: 'no-cache',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Drops results the read policy cannot act on, logging them exactly as it used to. */
|
|
45
|
+
project(source, label, projection) {
|
|
46
|
+
return {
|
|
47
|
+
subscribe: (onNext, onError) => source.subscribe((result) => {
|
|
48
|
+
var _a;
|
|
49
|
+
if (((_a = result.errors) === null || _a === void 0 ? void 0 : _a.length) || !result.data) {
|
|
50
|
+
this.loggerService.error(`Failed to handle ${label} event. Errors: ${result.errors}`, {
|
|
51
|
+
errors: JSON.stringify(result.errors),
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
onNext(projection(result.data));
|
|
56
|
+
}, onError),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async getEntitlementsState(customerId, resourceId, skipEdge = false, timeout) {
|
|
60
|
+
const result = await this.fetchEntitlementsState(customerId, resourceId, skipEdge, timeout);
|
|
61
|
+
const { entitlementsV2, accessDeniedReason } = result.data.entitlementsState;
|
|
62
|
+
return { entitlements: entitlementsV2, accessDeniedReason };
|
|
63
|
+
}
|
|
64
|
+
fetchEntitlementsState(customerId, resourceId, skipEdge, timeout) {
|
|
65
|
+
// fetching entitlements from edge-api instead of graphql-api
|
|
66
|
+
if (this.edgeApiClient && !skipEdge) {
|
|
67
|
+
this.loggerService.debug(`Fetching entitlements from edge`, { customerId, resourceId });
|
|
68
|
+
return this.edgeApiClient.getEntitlementsState(customerId, resourceId);
|
|
69
|
+
}
|
|
70
|
+
this.loggerService.debug(`Fetching entitlements from api`, { customerId });
|
|
71
|
+
return this.client.query({
|
|
72
|
+
query: api_client_js_1.GetEntitlementsStateDocument,
|
|
73
|
+
variables: { query: { customerId, resourceId } },
|
|
74
|
+
fetchPolicy: 'no-cache',
|
|
75
|
+
context: { timeout },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async reportUsage(input) {
|
|
79
|
+
const { data } = await this.client.mutate({
|
|
80
|
+
mutation: api_client_js_1.ReportUsageDocument,
|
|
81
|
+
variables: { input: this.toUsageMeasurementVariables(input) },
|
|
82
|
+
fetchPolicy: 'no-cache',
|
|
83
|
+
});
|
|
84
|
+
if (!(data === null || data === void 0 ? void 0 : data.reportUsage))
|
|
85
|
+
throw new Error('Invalid response');
|
|
86
|
+
return data.reportUsage;
|
|
87
|
+
}
|
|
88
|
+
async reportUsageBulk(input) {
|
|
89
|
+
const { data } = await this.client.mutate({
|
|
90
|
+
mutation: api_client_js_1.ReportUsageBulkDocument,
|
|
91
|
+
variables: { input: { usages: input.usages.map((usage) => this.toUsageMeasurementVariables(usage)) } },
|
|
92
|
+
fetchPolicy: 'no-cache',
|
|
93
|
+
});
|
|
94
|
+
if (!(data === null || data === void 0 ? void 0 : data.reportUsageBulk))
|
|
95
|
+
throw new Error('Invalid response');
|
|
96
|
+
return data.reportUsageBulk;
|
|
97
|
+
}
|
|
98
|
+
async consumeCredits(input) {
|
|
99
|
+
const { data } = await this.client.mutate({
|
|
100
|
+
mutation: api_client_js_1.ConsumeCreditsDocument,
|
|
101
|
+
variables: { input },
|
|
102
|
+
fetchPolicy: 'no-cache',
|
|
103
|
+
});
|
|
104
|
+
if (!(data === null || data === void 0 ? void 0 : data.consumeCredits))
|
|
105
|
+
throw new Error('Invalid response');
|
|
106
|
+
return data.consumeCredits;
|
|
107
|
+
}
|
|
108
|
+
toUsageMeasurementVariables(_a) {
|
|
109
|
+
var { updateBehavior } = _a, rest = __rest(_a, ["updateBehavior"]);
|
|
110
|
+
return Object.assign(Object.assign({}, rest), { updateBehavior: updateBehavior ? USAGE_UPDATE_BEHAVIOR[updateBehavior] : undefined });
|
|
111
|
+
}
|
|
112
|
+
consumeCreditsAsync(consumptions) {
|
|
113
|
+
return this.client.mutate({
|
|
114
|
+
mutation: api_client_js_1.ConsumeCreditsAsyncDocument,
|
|
115
|
+
variables: { input: { consumptions } },
|
|
116
|
+
fetchPolicy: 'no-cache',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
reportEvent(data) {
|
|
120
|
+
return this.client.mutate({
|
|
121
|
+
mutation: api_client_js_1.ReportEventDocument,
|
|
122
|
+
variables: { input: { usageEvents: data } },
|
|
123
|
+
fetchPolicy: 'no-cache',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
estimateEventCost(input) {
|
|
127
|
+
return this.client.query({
|
|
128
|
+
query: api_client_js_1.EstimateEventCostDocument,
|
|
129
|
+
variables: { input },
|
|
130
|
+
fetchPolicy: 'no-cache',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
estimateUsageCost(input) {
|
|
134
|
+
return this.client.query({
|
|
135
|
+
query: api_client_js_1.EstimateUsageCostDocument,
|
|
136
|
+
variables: { input },
|
|
137
|
+
fetchPolicy: 'no-cache',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
subscribeEntitlementsUpdated() {
|
|
141
|
+
const source = this.client.subscribe({ query: api_client_js_1.OnEntitlementsUpdatedV2Document });
|
|
142
|
+
return this.project(source, 'entitlements updated', ({ entitlementsUpdatedV2 }) => ({
|
|
143
|
+
customerId: entitlementsUpdatedV2.customerId,
|
|
144
|
+
resourceId: entitlementsUpdatedV2.resourceId,
|
|
145
|
+
accessDeniedReason: entitlementsUpdatedV2.accessDeniedReason,
|
|
146
|
+
entitlements: entitlementsUpdatedV2.entitlements,
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
subscribeUsageUpdated() {
|
|
150
|
+
const source = this.client.subscribe({
|
|
151
|
+
query: api_client_js_1.OnUsageUpdatedV2Document,
|
|
152
|
+
});
|
|
153
|
+
// These are DateTime on the wire but epoch ms in UsageData, and the fragment's `any` hid
|
|
154
|
+
// the difference. Converted the same way ApiCacheMapper converts the query path's copy of
|
|
155
|
+
// the same fields, so both writers agree on what lands in the cache.
|
|
156
|
+
return this.project(source, 'usage updated', ({ usageUpdatedV2 }) => ({
|
|
157
|
+
customerId: usageUpdatedV2.customerId,
|
|
158
|
+
resourceId: usageUpdatedV2.resourceId,
|
|
159
|
+
entitlementReference: usageUpdatedV2.entitlementReference,
|
|
160
|
+
usage: {
|
|
161
|
+
currentUsage: usageUpdatedV2.usage.currentUsage,
|
|
162
|
+
usagePeriodStart: (0, cache_core_1.toEpochMs)(usageUpdatedV2.usage.usagePeriodStart),
|
|
163
|
+
usagePeriodEnd: (0, cache_core_1.toEpochMs)(usageUpdatedV2.usage.usagePeriodEnd),
|
|
164
|
+
usageUpdatedAt: (0, cache_core_1.toEpochMs)(usageUpdatedV2.usage.usageUpdatedAt),
|
|
165
|
+
},
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
subscribePackagePublished() {
|
|
169
|
+
const source = this.client.subscribe({
|
|
170
|
+
query: api_client_js_1.OnPackagePublishedDocument,
|
|
171
|
+
});
|
|
172
|
+
return this.project(source, 'package published', ({ packagePublished }) => ({
|
|
173
|
+
affectsAllCustomers: packagePublished.migrationType === api_client_js_1.PublishMigrationType.AllCustomers,
|
|
174
|
+
payload: packagePublished,
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.default = EntitlementsApi;
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnRzQXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2VudGl0bGVtZW50c0FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRUEscUVBQWtFO0FBQ2xFLGtEQUFnRztBQWVoRyx3REE0QzhCO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHFCQUFxQixHQUEyRDtJQUNwRixLQUFLLEVBQUUsbUNBQW1CLENBQUMsS0FBSztJQUNoQyxHQUFHLEVBQUUsbUNBQW1CLENBQUMsR0FBRztDQUM3QixDQUFDO0FBRUYsTUFBTSxlQUFlO0lBQ25CLFlBQ21CLE1BQXFCLEVBQ3JCLGFBQW1DLEVBQ25DLGFBQXlCO1FBRnpCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ25DLGtCQUFhLEdBQWIsYUFBYSxDQUFZO1FBR25DLGVBQVUsR0FBRyxJQUFJLCtDQUFzQixFQUFFLENBQUM7SUFGaEQsQ0FBQztJQUlKLG9HQUFvRztJQUNwRyxLQUFLLENBQUMsY0FBYztRQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMvQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQThEO1lBQ25GLEtBQUssRUFBRSwyQ0FBMkI7WUFDbEMsV0FBVyxFQUFFLFVBQVU7U0FDeEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVGQUF1RjtJQUMvRSxPQUFPLENBQ2IsTUFBd0QsRUFDeEQsS0FBYSxFQUNiLFVBQWlDO1FBRWpDLE9BQU87WUFDTCxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FDN0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFOztnQkFDMUIs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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ClassifiedError, TransportErrorClassifier } from '@stigg/cache-runtime';
|
|
2
|
+
/**
|
|
3
|
+
* Reads the GraphQL and HTTP error shapes this transport can produce. Extracted verbatim
|
|
4
|
+
* from node-server-sdk's ApiErrorHandler so both hosts classify failures identically.
|
|
5
|
+
*/
|
|
6
|
+
export declare class GraphQLErrorClassifier implements TransportErrorClassifier {
|
|
7
|
+
classify(err: unknown): ClassifiedError;
|
|
8
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphQLErrorClassifier = void 0;
|
|
4
|
+
const core_1 = require("@apollo/client/core");
|
|
5
|
+
const api_client_js_1 = require("@stigg/api-client-js");
|
|
6
|
+
const lodash_1 = require("lodash");
|
|
7
|
+
const OperationTimeoutError_1 = require("../apollo/OperationTimeoutError");
|
|
8
|
+
/**
|
|
9
|
+
* Reads the GraphQL and HTTP error shapes this transport can produce. Extracted verbatim
|
|
10
|
+
* from node-server-sdk's ApiErrorHandler so both hosts classify failures identically.
|
|
11
|
+
*/
|
|
12
|
+
class GraphQLErrorClassifier {
|
|
13
|
+
classify(err) {
|
|
14
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
15
|
+
const error = err;
|
|
16
|
+
let errorMessage = (error === null || error === void 0 ? void 0 : error.message) || 'unknown error';
|
|
17
|
+
let errorCode;
|
|
18
|
+
let traceId;
|
|
19
|
+
const apolloError = error;
|
|
20
|
+
if (!(0, lodash_1.isEmpty)(apolloError.graphQLErrors)) {
|
|
21
|
+
const gqlError = apolloError.graphQLErrors[0];
|
|
22
|
+
errorMessage = gqlError.message;
|
|
23
|
+
errorCode = (_a = gqlError.extensions) === null || _a === void 0 ? void 0 : _a.code;
|
|
24
|
+
traceId = (_b = gqlError.extensions) === null || _b === void 0 ? void 0 : _b.traceId;
|
|
25
|
+
}
|
|
26
|
+
else if (!(0, lodash_1.isEmpty)(apolloError.networkError)) {
|
|
27
|
+
// @ts-expect-error the original error message is on the result object
|
|
28
|
+
const message = ((_d = (_c = apolloError.networkError) === null || _c === void 0 ? void 0 : _c.result) === null || _d === void 0 ? void 0 : _d.errors) && ((_g = (_f = (_e = apolloError.networkError) === null || _e === void 0 ? void 0 : _e.result) === null || _f === void 0 ? void 0 : _f.errors[0]) === null || _g === void 0 ? void 0 : _g.message);
|
|
29
|
+
errorMessage = message || ((_h = apolloError.networkError) === null || _h === void 0 ? void 0 : _h.message) || 'Network error';
|
|
30
|
+
}
|
|
31
|
+
const axiosError = error.isAxiosError ? error : undefined;
|
|
32
|
+
const response = axiosError === null || axiosError === void 0 ? void 0 : axiosError.response;
|
|
33
|
+
return {
|
|
34
|
+
errorMessage,
|
|
35
|
+
errorCode,
|
|
36
|
+
traceId,
|
|
37
|
+
isUnauthenticated: (response === null || response === void 0 ? void 0 : response.status) === 401 || errorCode === api_client_js_1.ErrorCode.Unauthenticated,
|
|
38
|
+
isTimeout: err instanceof core_1.ApolloError && err.networkError instanceof OperationTimeoutError_1.OperationTimeoutError,
|
|
39
|
+
request: axiosError === null || axiosError === void 0 ? void 0 : axiosError.request,
|
|
40
|
+
response,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.GraphQLErrorClassifier = GraphQLErrorClassifier;
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbEVycm9yQ2xhc3NpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9ncmFwaHFsRXJyb3JDbGFzc2lmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhDQUFrRDtBQUVsRCx3REFBaUQ7QUFDakQsbUNBQWlDO0FBRWpDLDJFQUF3RTtBQUV4RTs7O0dBR0c7QUFDSCxNQUFhLHNCQUFzQjtJQUNqQyxRQUFRLENBQUMsR0FBWTs7UUFDbkIsTUFBTSxLQUFLLEdBQUcsR0FBdUMsQ0FBQztRQUN0RCxJQUFJLFlBQVksR0FBRyxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxPQUFPLEtBQUksZUFBZSxDQUFDO1FBQ3JELElBQUksU0FBNkIsQ0FBQztRQUNsQyxJQUFJLE9BQTJCLENBQUM7UUFFaEMsTUFBTSxXQUFXLEdBQUcsS0FBb0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBQSxnQkFBTyxFQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDaEMsU0FBUyxHQUFHLE1BQUEsUUFBUSxDQUFDLFVBQVUsMENBQUUsSUFBYyxDQUFDO1lBQ2hELE9BQU8sR0FBRyxNQUFBLFFBQVEsQ0FBQyxVQUFVLDBDQUFFLE9BQWlCLENBQUM7UUFDbkQsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFBLGdCQUFPLEVBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUMsc0VBQXNFO1lBQ3RFLE1BQU0sT0FBTyxHQUFHLENBQUEsTUFBQSxNQUFBLFdBQVcsQ0FBQyxZQUFZLDBDQUFFLE1BQU0sMENBQUUsTUFBTSxNQUFJLE1BQUEsTUFBQSxNQUFBLFdBQVcsQ0FBQyxZQUFZLDBDQUFFLE1BQU0sMENBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywwQ0FBRSxPQUFPLENBQUEsQ0FBQztZQUNqSCxZQUFZLEdBQUcsT0FBTyxLQUFJLE1BQUEsV0FBVyxDQUFDLFlBQVksMENBQUUsT0FBTyxDQUFBLElBQUksZUFBZSxDQUFDO1FBQ2pGLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBSSxLQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUUsS0FBb0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxRQUFRLENBQUM7UUFFdEMsT0FBTztZQUNMLFlBQVk7WUFDWixTQUFTO1lBQ1QsT0FBTztZQUNQLGlCQUFpQixFQUFFLENBQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLE1BQU0sTUFBSyxHQUFHLElBQUksU0FBUyxLQUFLLHlCQUFTLENBQUMsZUFBZTtZQUN0RixTQUFTLEVBQUUsR0FBRyxZQUFZLGtCQUFXLElBQUksR0FBRyxDQUFDLFlBQVksWUFBWSw2Q0FBcUI7WUFDMUYsT0FBTyxFQUFFLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxPQUFPO1lBQzVCLFFBQVE7U0FDVCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaENELHdEQWdDQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SlimLogger } from '@stigg/cache-core';
|
|
2
|
+
import initApolloClient from '../apollo/initApolloClient';
|
|
3
|
+
import { ApolloClientConfiguration } from '../apollo/types';
|
|
4
|
+
import { EdgeApiClient, EdgeApiClientConfiguration } from './EdgeApiClient';
|
|
5
|
+
import EntitlementsApi from './entitlementsApi';
|
|
6
|
+
export type GraphQLTransportParams = ApolloClientConfiguration & EdgeApiClientConfiguration & {
|
|
7
|
+
/** Lets the caller clear whatever it caches when the subscription reconnects. */
|
|
8
|
+
onConnected: () => void;
|
|
9
|
+
loggerService: SlimLogger;
|
|
10
|
+
};
|
|
11
|
+
export type GraphQLTransport = {
|
|
12
|
+
/** The concrete client, because a host may run its own operations over it. */
|
|
13
|
+
graphqlClient: ReturnType<typeof initApolloClient>;
|
|
14
|
+
edgeApiClient: EdgeApiClient | null;
|
|
15
|
+
entitlementsApi: EntitlementsApi;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The three pieces are built together because they are not independently useful: the api reads
|
|
19
|
+
* through the edge client and falls back to the graphql one, and both carry the same identity headers.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createGraphQLTransport(params: GraphQLTransportParams): GraphQLTransport;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createGraphQLTransport = createGraphQLTransport;
|
|
7
|
+
const initApolloClient_1 = __importDefault(require("../apollo/initApolloClient"));
|
|
8
|
+
const EdgeApiClient_1 = require("./EdgeApiClient");
|
|
9
|
+
const entitlementsApi_1 = __importDefault(require("./entitlementsApi"));
|
|
10
|
+
/**
|
|
11
|
+
* The three pieces are built together because they are not independently useful: the api reads
|
|
12
|
+
* through the edge client and falls back to the graphql one, and both carry the same identity headers.
|
|
13
|
+
*/
|
|
14
|
+
function createGraphQLTransport(params) {
|
|
15
|
+
const { loggerService } = params;
|
|
16
|
+
const graphqlClient = (0, initApolloClient_1.default)(params);
|
|
17
|
+
const edgeApiClient = EdgeApiClient_1.EdgeApiClient.create(params, loggerService);
|
|
18
|
+
return {
|
|
19
|
+
graphqlClient,
|
|
20
|
+
edgeApiClient,
|
|
21
|
+
entitlementsApi: new entitlementsApi_1.default(graphqlClient, edgeApiClient, loggerService),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbFRyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9ncmFwaHFsVHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBd0JBLHdEQVVDO0FBakNELGtGQUEwRDtBQUUxRCxtREFBNEU7QUFDNUUsd0VBQWdEO0FBZ0JoRDs7O0dBR0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxNQUE4QjtJQUNuRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLE1BQU0sYUFBYSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsNkJBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRWxFLE9BQU87UUFDTCxhQUFhO1FBQ2IsYUFBYTtRQUNiLGVBQWUsRUFBRSxJQUFJLHlCQUFlLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUM7S0FDbEYsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OS_PROCESS_FINGERPRINT = exports.OS_PROCESS_TIMESTAMP = exports.OS_PROCESS_ID = exports.OS_HOSTNAME = void 0;
|
|
7
|
+
const os_1 = __importDefault(require("os"));
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
exports.OS_HOSTNAME = os_1.default.hostname();
|
|
10
|
+
exports.OS_PROCESS_ID = process.pid;
|
|
11
|
+
exports.OS_PROCESS_TIMESTAMP = Date.now();
|
|
12
|
+
function generateProcessFingerprint() {
|
|
13
|
+
const parts = [exports.OS_HOSTNAME, exports.OS_PROCESS_ID, exports.OS_PROCESS_TIMESTAMP];
|
|
14
|
+
const hash = (0, crypto_1.createHash)('md5').update(parts.join(''));
|
|
15
|
+
return hash.digest('hex');
|
|
16
|
+
}
|
|
17
|
+
exports.OS_PROCESS_FINGERPRINT = generateProcessFingerprint();
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NJbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL29zSW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsbUNBQW9DO0FBRXZCLFFBQUEsV0FBVyxHQUFHLFlBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM1QixRQUFBLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQzVCLFFBQUEsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRS9DLFNBQVMsMEJBQTBCO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLENBQUMsbUJBQVcsRUFBRSxxQkFBYSxFQUFFLDRCQUFvQixDQUFDLENBQUM7SUFDakUsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFWSxRQUFBLHNCQUFzQixHQUFHLDBCQUEwQixFQUFFLENBQUMifQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A structural stand-in for Apollo's client. Declared rather than imported because the
|
|
3
|
+
* workspace resolves two incompatible copies of `@apollo/client` (js-client-sdk on 3.4.x,
|
|
4
|
+
* node-server-sdk on 3.14.x); naming either one's types would bind this package to a
|
|
5
|
+
* single caller. A real ApolloClient satisfies this as-is.
|
|
6
|
+
*/
|
|
7
|
+
export interface GraphQLQueryResult<TData> {
|
|
8
|
+
data: TData;
|
|
9
|
+
}
|
|
10
|
+
export interface GraphQLOperationResult<TData> {
|
|
11
|
+
data?: TData | null;
|
|
12
|
+
errors?: readonly unknown[];
|
|
13
|
+
}
|
|
14
|
+
export interface GraphQLSubscription {
|
|
15
|
+
unsubscribe(): void;
|
|
16
|
+
}
|
|
17
|
+
export interface GraphQLObservable<TValue> {
|
|
18
|
+
subscribe(onNext: (value: TValue) => void, onError: (error: any) => void): GraphQLSubscription;
|
|
19
|
+
}
|
|
20
|
+
export interface GraphQLClient {
|
|
21
|
+
query<TData = any, TVariables = any>(options: any): Promise<GraphQLQueryResult<TData>>;
|
|
22
|
+
mutate<TData = any, TVariables = any>(options: any): Promise<GraphQLOperationResult<TData>>;
|
|
23
|
+
subscribe<TData = any, TVariables = any>(options: any): GraphQLObservable<GraphQLOperationResult<TData>>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9ncmFwaHFsQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SourceType } from '@stigg/api-client-js';
|
|
2
|
+
export declare function buildRequestHeaders(source: SourceType, apiKey?: string, instanceId?: string, operationName?: string): {
|
|
3
|
+
'x-graphql-operation-name'?: string | undefined;
|
|
4
|
+
'X-API-KEY': string | undefined;
|
|
5
|
+
source: SourceType;
|
|
6
|
+
'X-SDK-INSTANCE-ID': string | undefined;
|
|
7
|
+
'X-SDK-OS-PROCESS-HOSTNAME': string;
|
|
8
|
+
'X-SDK-OS-PROCESS-ID': number;
|
|
9
|
+
'X-SDK-OS-PROCESS-TIMESTAMP': number;
|
|
10
|
+
'X-SDK-OS-PROCESS-FINGERPRINT': string;
|
|
11
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRequestHeaders = buildRequestHeaders;
|
|
4
|
+
const osInfo_1 = require("../services/osInfo");
|
|
5
|
+
// `source` is per-SDK, so it is passed in rather than imported — this package is shared.
|
|
6
|
+
function buildRequestHeaders(source, apiKey, instanceId, operationName) {
|
|
7
|
+
return Object.assign({ 'X-API-KEY': apiKey, source, 'X-SDK-INSTANCE-ID': instanceId, 'X-SDK-OS-PROCESS-HOSTNAME': osInfo_1.OS_HOSTNAME, 'X-SDK-OS-PROCESS-ID': osInfo_1.OS_PROCESS_ID, 'X-SDK-OS-PROCESS-TIMESTAMP': osInfo_1.OS_PROCESS_TIMESTAMP, 'X-SDK-OS-PROCESS-FINGERPRINT': osInfo_1.OS_PROCESS_FINGERPRINT }, (operationName ? { 'x-graphql-operation-name': operationName } : {}));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdEhlYWRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcmVxdWVzdEhlYWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxrREFXQztBQWRELCtDQUE4RztBQUU5Ryx5RkFBeUY7QUFDekYsU0FBZ0IsbUJBQW1CLENBQUMsTUFBa0IsRUFBRSxNQUFlLEVBQUUsVUFBbUIsRUFBRSxhQUFzQjtJQUNsSCx1QkFDRSxXQUFXLEVBQUUsTUFBTSxFQUNuQixNQUFNLEVBQ04sbUJBQW1CLEVBQUUsVUFBVSxFQUMvQiwyQkFBMkIsRUFBRSxvQkFBVyxFQUN4QyxxQkFBcUIsRUFBRSxzQkFBYSxFQUNwQyw0QkFBNEIsRUFBRSw2QkFBb0IsRUFDbEQsOEJBQThCLEVBQUUsK0JBQXNCLElBQ25ELENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdkU7QUFDSixDQUFDIn0=
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stigg/cache-transport-graphql",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "GraphQL transport for Stigg's client-side cache",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"typings": "dist/index.d.ts",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public",
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"typings": "dist/index.d.ts"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/stiggio/stigg-sdk.git",
|
|
15
|
+
"directory": "packages/cache-transport-graphql"
|
|
16
|
+
},
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "yarn run -T tsc -p tsconfig.build.json",
|
|
20
|
+
"lint": "yarn run -T eslint \"src/**/*.ts\"",
|
|
21
|
+
"test": "yarn run -T jest --forceExit --passWithNoTests"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist/**/*"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@apollo/client": "~3.14.0",
|
|
28
|
+
"@types/ws": "^8.2.3",
|
|
29
|
+
"axios": "^1.18.0",
|
|
30
|
+
"axios-retry": "^4.0.0",
|
|
31
|
+
"cross-fetch": "^3.1.5",
|
|
32
|
+
"graphql": "^15.6.1",
|
|
33
|
+
"graphql-ws": "^5.6.0",
|
|
34
|
+
"isomorphic-ws": "^4.0.1",
|
|
35
|
+
"lodash": "^4.18.1",
|
|
36
|
+
"ws": "^8.21.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@stigg/api-client-js": "6.24.0",
|
|
40
|
+
"@stigg/cache-core": "1.27.0",
|
|
41
|
+
"@stigg/cache-runtime": "2.0.0"
|
|
42
|
+
}
|
|
43
|
+
}
|