UNPKG

@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
"use strict"; 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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