UNPKG

3.83 kBJavaScriptView Raw
1const request = require('request');
2const requestPN = require('request-promise-native');
3const { getPortalConfig } = require('./lib/config');
4const { getRequestOptions } = require('./http/requestOptions');
5const { accessTokenForUserToken } = require('./http/userToken');
6const { getOauthManager } = require('./oauth');
7
8const withOauth = async (portalId, portalConfig, requestOptions) => {
9 const { headers } = requestOptions;
10 const oauth = getOauthManager(portalId, portalConfig);
11 const accessToken = await oauth.accessToken();
12 return {
13 ...requestOptions,
14 headers: {
15 ...headers,
16 Authorization: `Bearer ${accessToken}`,
17 },
18 };
19};
20
21const withUserToken = async (portalId, portalConfig, requestOptions) => {
22 const { headers } = requestOptions;
23 const accessToken = await accessTokenForUserToken(portalId);
24 return {
25 ...requestOptions,
26 headers: {
27 ...headers,
28 Authorization: `Bearer ${accessToken}`,
29 },
30 };
31};
32
33const withPortalId = (portalId, requestOptions) => {
34 const { qs } = requestOptions;
35
36 return {
37 ...requestOptions,
38 qs: {
39 ...qs,
40 portalId,
41 },
42 };
43};
44
45const withAuth = async (portalId, options) => {
46 const portalConfig = getPortalConfig(portalId);
47 const { env, authType, apiKey } = portalConfig;
48 const requestOptions = withPortalId(
49 portalId,
50 getRequestOptions({ env }, options)
51 );
52
53 if (authType === 'usertoken') {
54 return withUserToken(portalId, portalConfig, requestOptions);
55 }
56
57 if (authType === 'oauth2') {
58 return withOauth(portalId, portalConfig, requestOptions);
59 }
60 const { qs } = requestOptions;
61
62 return {
63 ...requestOptions,
64 qs: {
65 ...qs,
66 hapikey: apiKey,
67 },
68 };
69};
70
71const addQueryParams = (requestOptions, params = {}) => {
72 const { qs } = requestOptions;
73 return {
74 ...requestOptions,
75 qs: {
76 ...qs,
77 ...params,
78 },
79 };
80};
81
82const getRequest = async (portalId, options) => {
83 const { query, ...rest } = options;
84 const requestOptions = addQueryParams(rest, query);
85 return requestPN.get(await withAuth(portalId, requestOptions));
86};
87
88const postRequest = async (portalId, options) => {
89 return requestPN.post(await withAuth(portalId, options));
90};
91
92const putRequest = async (portalId, options) => {
93 return requestPN.put(await withAuth(portalId, options));
94};
95
96const deleteRequest = async (portalId, options) => {
97 return requestPN.del(await withAuth(portalId, options));
98};
99
100const createGetRequestStream = ({ contentType }) => async (
101 portalId,
102 options,
103 destination
104) => {
105 const { query, ...rest } = options;
106 const requestOptions = addQueryParams(rest, query);
107 // Using `request` instead of `request-promise` per the docs so
108 // the response can be piped.
109 // https://github.com/request/request-promise#api-in-detail
110 //
111 // eslint-disable-next-line no-async-promise-executor
112 return new Promise(async (resolve, reject) => {
113 try {
114 const { headers, ...opts } = await withAuth(portalId, requestOptions);
115 const req = request.get({
116 ...opts,
117 headers: {
118 ...headers,
119 'content-type': contentType,
120 accept: contentType,
121 },
122 json: false,
123 });
124 let response;
125 req
126 .on('error', reject)
127 .on('response', r => {
128 if (r.statusCode >= 200 && r.statusCode < 300) {
129 response = r;
130 } else {
131 reject(r);
132 }
133 })
134 .on('end', () => resolve(response))
135 .pipe(destination);
136 } catch (err) {
137 reject(err);
138 }
139 });
140};
141
142module.exports = {
143 getRequestOptions,
144 request: requestPN,
145 get: getRequest,
146 getOctetStream: createGetRequestStream({
147 contentType: 'application/octet-stream',
148 }),
149 post: postRequest,
150 put: putRequest,
151 delete: deleteRequest,
152};