@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
140 lines • 12.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBluebeamClientWithToken = exports.createBluebeamClient = exports.loadFromEnvironment = void 0;
const auth_1 = require("./auth");
const http_client_1 = require("./http-client");
const sessions_1 = require("./sessions");
const sessions_markups_1 = require("./sessions-markups");
const storage_1 = require("./storage");
const loadFromEnvironment = () => ({
client_id: process.env.BLUEBEAM_CLIENT_ID,
client_secret: process.env.BLUEBEAM_CLIENT_SECRET,
access_token: process.env.BLUEBEAM_ACCESS_TOKEN,
redirect_uri: process.env.BLUEBEAM_REDIRECT_URI,
scope: process.env.BLUEBEAM_SCOPE,
base_url: process.env.BLUEBEAM_BASE_URL,
});
exports.loadFromEnvironment = loadFromEnvironment;
const createBluebeamClient = (config = {}) => {
// Merge environment variables with provided config
const envConfig = (0, exports.loadFromEnvironment)();
const mergedConfig = Object.assign(Object.assign({}, envConfig), config);
// Extract client and OAuth configs
const clientConfig = {
client_id: mergedConfig.client_id || '',
access_token: mergedConfig.access_token,
base_url: mergedConfig.base_url,
};
const oauthConfig = {
client_id: mergedConfig.client_id || '',
client_secret: mergedConfig.client_secret || '',
redirect_uri: mergedConfig.redirect_uri || '',
scope: mergedConfig.scope || '',
base_url: mergedConfig.base_url,
};
// Validate required OAuth configuration
if (!oauthConfig.client_id || !oauthConfig.client_secret) {
return Promise.reject(new Error('OAuth configuration is required'));
}
/**
* Internal interceptor that handles automatic token refresh on 401 errors
*/
class AuthInterceptor {
constructor(config, auth, storage, autoRefresh) {
this.config = config;
this.auth = auth;
this.storage = storage;
this.autoRefresh = autoRefresh;
this.httpClient = (0, http_client_1.createHttpClient)(config);
}
async get(endpoint) {
return this.executeWithRetry(() => this.httpClient.get(endpoint));
}
async post(endpoint, data, isFormData) {
return this.executeWithRetry(() => this.httpClient.post(endpoint, data, isFormData));
}
async put(endpoint, data) {
return this.executeWithRetry(() => this.httpClient.put(endpoint, data));
}
async delete(endpoint) {
return this.executeWithRetry(() => this.httpClient.delete(endpoint));
}
async executeWithRetry(requestFn) {
try {
return await requestFn();
}
catch (error) {
// Only retry on 401 if autoRefresh is enabled
if (!this.autoRefresh || error.status !== 401) {
throw error;
}
try {
// Refresh token
await this.auth.refreshAccessToken();
// Get fresh token from storage
const tokens = await this.storage.getTokens();
// Create new HTTP client with fresh token
this.httpClient = (0, http_client_1.createHttpClient)(Object.assign(Object.assign({}, this.config), { access_token: tokens === null || tokens === void 0 ? void 0 : tokens.access_token }));
// Retry request once
return await requestFn();
}
catch (refreshError) {
// Refresh failed, throw original error
throw error;
}
}
}
}
const createClientWithConfig = async (config) => {
// Load existing tokens from storage first
const storage = mergedConfig.tokenStorage || (0, storage_1.createMemoryStorage)();
const existingTokens = await storage.getTokens();
// Use token from storage if available, otherwise use provided token
const configWithToken = Object.assign(Object.assign({}, config), { access_token: (existingTokens === null || existingTokens === void 0 ? void 0 : existingTokens.access_token) || config.access_token });
// Create HTTP client first
const httpClient = (0, http_client_1.createHttpClient)(configWithToken);
// Create auth client
const auth = await (0, auth_1.createOAuthClient)({
client_id: oauthConfig.client_id,
client_secret: oauthConfig.client_secret,
redirect_uri: oauthConfig.redirect_uri,
scope: oauthConfig.scope,
base_url: oauthConfig.base_url,
tokenStorage: storage,
httpClient,
});
// Use interceptor if autoRefresh is enabled (default true)
const autoRefresh = mergedConfig.autoRefresh !== false;
const clientForApi = autoRefresh
? new AuthInterceptor(configWithToken, auth, storage, autoRefresh)
: httpClient;
const sessions = (0, sessions_1.createSessionsClient)(clientForApi);
const markups = (0, sessions_markups_1.createSessionsMarkupsClient)(clientForApi);
const updateAccessToken = (accessToken) => {
const newConfig = Object.assign(Object.assign({}, config), { access_token: accessToken });
return createClientWithConfig(newConfig);
};
return {
auth,
sessions,
markups,
httpClient,
updateAccessToken,
};
};
return createClientWithConfig(clientConfig);
};
exports.createBluebeamClient = createBluebeamClient;
const createBluebeamClientWithToken = (clientId, accessToken, options) => {
const config = Object.assign({ client_id: clientId, access_token: accessToken }, options);
const httpClient = (0, http_client_1.createHttpClient)(config);
const sessions = (0, sessions_1.createSessionsClient)(httpClient);
const markups = (0, sessions_markups_1.createSessionsMarkupsClient)(httpClient);
return {
sessions,
markups,
httpClient,
};
};
exports.createBluebeamClientWithToken = createBluebeamClientWithToken;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsaUNBQXdEO0FBQ3hELCtDQUEyRTtBQUMzRSx5Q0FBa0U7QUFDbEUseURBRzRCO0FBQzVCLHVDQUFnRDtBQTJCekMsTUFBTSxtQkFBbUIsR0FBRyxHQUFtQixFQUFFLENBQUMsQ0FBQztJQUN4RCxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7SUFDekMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCO0lBQ2pELFlBQVksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQjtJQUMvQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUI7SUFDL0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztJQUNqQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7Q0FDeEMsQ0FBQyxDQUFDO0FBUFUsUUFBQSxtQkFBbUIsdUJBTzdCO0FBRUksTUFBTSxvQkFBb0IsR0FBRyxDQUNsQyxTQUF5QixFQUFFLEVBQ0YsRUFBRTtJQUMzQixtREFBbUQ7SUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBQSwyQkFBbUIsR0FBRSxDQUFDO0lBQ3hDLE1BQU0sWUFBWSxtQ0FDYixTQUFTLEdBQ1QsTUFBTSxDQUNWLENBQUM7SUFFRixtQ0FBbUM7SUFDbkMsTUFBTSxZQUFZLEdBQWlCO1FBQ2pDLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUU7UUFDdkMsWUFBWSxFQUFFLFlBQVksQ0FBQyxZQUFZO1FBQ3ZDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtLQUNoQyxDQUFDO0lBRUYsTUFBTSxXQUFXLEdBQUc7UUFDbEIsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLElBQUksRUFBRTtRQUN2QyxhQUFhLEVBQUUsWUFB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