@lineai/bluebeam-api
Version:
Your unofficial library for Bluebeam API for human and AI developers. Provides TypeScript support, entity classes, and developer-friendly features. Perfect for AI coders, construction professionals, and document management tasks. Includes comprehensive JS
136 lines • 11.4 kB
JavaScript
import { DEFAULT_BASE_URL } from './constants';
export const createHttpClient = (config) => {
const baseUrl = config.base_url || DEFAULT_BASE_URL;
const getHeaders = (endpoint, isFormData = false) => {
const isOAuth = endpoint.startsWith('/oauth2/');
const baseHeaders = { client_id: config.client_id };
const contentTypeHeaders = isFormData
? { 'Content-Type': 'application/x-www-form-urlencoded' }
: { 'Content-Type': 'application/json' };
const authHeaders = !isOAuth && config.access_token
? { Authorization: `Bearer ${config.access_token}` }
: {};
return { ...baseHeaders, ...contentTypeHeaders, ...authHeaders };
};
const createApiError = (response, error) => {
const baseError = {
error: response?.statusText ||
(error instanceof Error ? error.message : 'Network error'),
status: response?.status || 0,
};
return baseError;
};
const parseResponseHeaders = (response) => {
const headerEntries = Array.from(response.headers.entries());
return Object.fromEntries(headerEntries);
};
const parseResponseData = async (response) => {
const contentType = response.headers.get('content-type');
if (contentType && contentType.includes('application/json')) {
return response.json();
}
return response.text();
};
const makeRequest = async (options) => {
const { method, url, headers = {}, body } = options;
const requestInit = {
method,
headers: { ...headers },
...(body && { body }),
};
try {
const response = await fetch(url, requestInit);
if (!response.ok) {
const errorData = createApiError(response);
try {
const errorJson = (await response.json());
const errorObj = { ...errorData, ...errorJson };
const error = new Error(errorObj.error || `HTTP ${response.status}`);
// eslint-disable-next-line functional/immutable-data
Object.assign(error, errorObj);
return Promise.reject(error);
}
catch {
const error = new Error(errorData.error || `HTTP ${response.status}`);
// eslint-disable-next-line functional/immutable-data
Object.assign(error, errorData);
return Promise.reject(error);
}
}
const data = await parseResponseData(response);
const responseHeaders = parseResponseHeaders(response);
return {
data,
status: response.status,
headers: responseHeaders,
};
}
catch (error) {
if (error && typeof error === 'object' && 'status' in error) {
return Promise.reject(error);
}
const apiError = createApiError({}, error);
return Promise.reject(apiError);
}
};
const getBaseUrl = () => {
return baseUrl;
};
const prepareRequestBody = (data, isFormData) => {
if (!data)
return undefined;
if (isFormData && data instanceof FormData) {
return data;
}
if (isFormData) {
const params = new URLSearchParams();
Object.entries(data).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
params.append(key, value);
}
});
return params.toString();
}
return JSON.stringify(data);
};
return {
async get(endpoint) {
const baseUrl = getBaseUrl();
return makeRequest({
method: 'GET',
url: `${baseUrl}${endpoint}`,
headers: getHeaders(endpoint),
});
},
async post(endpoint, data, isFormData = false) {
const baseUrl = getBaseUrl();
const body = prepareRequestBody(data, isFormData);
return makeRequest({
method: 'POST',
url: `${baseUrl}${endpoint}`,
headers: getHeaders(endpoint, isFormData),
body,
isFormData,
});
},
async put(endpoint, data) {
const baseUrl = getBaseUrl();
const body = data ? JSON.stringify(data) : undefined;
return makeRequest({
method: 'PUT',
url: `${baseUrl}${endpoint}`,
headers: getHeaders(endpoint),
body,
});
},
async delete(endpoint) {
const baseUrl = getBaseUrl();
return makeRequest({
method: 'DELETE',
url: `${baseUrl}${endpoint}`,
headers: getHeaders(endpoint),
});
},
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2h0dHAtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWdCL0MsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxNQUFvQixFQUFFLEVBQUU7SUFDdkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQztJQUVwRCxNQUFNLFVBQVUsR0FBRyxDQUNqQixRQUFnQixFQUNoQixVQUFVLEdBQUcsS0FBSyxFQUNNLEVBQUU7UUFDMUIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBMkIsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sa0JBQWtCLEdBQTJCLFVBQVU7WUFDM0QsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLG1DQUFtQyxFQUFFO1lBQ3pELENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUNmLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZO1lBQzdCLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxVQUFVLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNwRCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVQsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUNuRSxDQUFDLENBQUM7SUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQWtCLEVBQUUsS0FBZSxFQUFZLEVBQUU7UUFDdkUsTUFBTSxTQUFTLEdBQWE7WUFDMUIsS0FBSyxFQUNILFFBQVEsRUFBRSxVQUFVO2dC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