@sethub/sdk
Version:
<div align="center"> <h1> SetHub SDK </h1>
217 lines (216 loc) • 11.3 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SetHub = void 0;
const client_1 = require("./http/client");
const version_1 = require("./version");
const index_1 = require("./services/activity/index");
const index_2 = require("./services/admin/index");
const index_3 = require("./services/applications/index");
const index_4 = require("./services/authentication/index");
const index_5 = require("./services/invitations/index");
const index_6 = require("./services/members/index");
const index_7 = require("./services/projects/index");
const index_8 = require("./services/update-sets/index");
const profiles_1 = require("./services/profiles");
__exportStar(require("./services/activity/protocols/activity"), exports);
__exportStar(require("./services/activity/protocols/list.protocol"), exports);
__exportStar(require("./services/admin/protocols/get-overview.protocol"), exports);
__exportStar(require("./services/applications/protocols/application"), exports);
__exportStar(require("./services/applications/protocols/create.protocol"), exports);
__exportStar(require("./services/applications/protocols/delete.protocol"), exports);
__exportStar(require("./services/applications/protocols/get-details.protocol"), exports);
__exportStar(require("./services/applications/protocols/list.protocol"), exports);
__exportStar(require("./services/applications/protocols/update.protocol"), exports);
__exportStar(require("./services/authentication/protocols/authentication"), exports);
__exportStar(require("./services/authentication/protocols/sign-in-with-email-and-password.protocols"), exports);
__exportStar(require("./services/authentication/protocols/sign-up.protocols"), exports);
__exportStar(require("./services/invitations/protocols/invitation"), exports);
__exportStar(require("./services/invitations/protocols/accept.protocol"), exports);
__exportStar(require("./services/invitations/protocols/create.protocol"), exports);
__exportStar(require("./services/invitations/protocols/delete.protocol"), exports);
__exportStar(require("./services/invitations/protocols/list.protocol"), exports);
__exportStar(require("./services/invitations/protocols/reject.protocol"), exports);
__exportStar(require("./services/invitations/protocols/update-role.protocol"), exports);
__exportStar(require("./services/members/protocols/member"), exports);
__exportStar(require("./services/members/protocols/activate-access.protocol"), exports);
__exportStar(require("./services/members/protocols/deactivate-access.protocol"), exports);
__exportStar(require("./services/members/protocols/list-editors.protocol"), exports);
__exportStar(require("./services/members/protocols/list.protocol"), exports);
__exportStar(require("./services/members/protocols/update-role.protocol"), exports);
__exportStar(require("./services/profiles/protocols/profile"), exports);
__exportStar(require("./services/profiles/protocols/get-my.protocol"), exports);
__exportStar(require("./services/projects/protocols/project"), exports);
__exportStar(require("./services/projects/protocols/create.protocol"), exports);
__exportStar(require("./services/projects/protocols/delete.protocol"), exports);
__exportStar(require("./services/projects/protocols/get-details.protocol"), exports);
__exportStar(require("./services/projects/protocols/list-mine.protocol"), exports);
__exportStar(require("./services/projects/protocols/update.protocol"), exports);
__exportStar(require("./services/update-sets/protocols/update-set"), exports);
__exportStar(require("./services/update-sets/protocols/get-details.protocol"), exports);
__exportStar(require("./services/update-sets/protocols/create.protocol"), exports);
__exportStar(require("./services/update-sets/protocols/delete.protocol"), exports);
__exportStar(require("./services/update-sets/protocols/list.protocol"), exports);
__exportStar(require("./services/update-sets/protocols/update.protocol"), exports);
const AUTHENTICATION_ROUTES = [
'/v1/auth/login',
'/v1/auth/refresh',
];
class SetHub {
constructor(options) {
this.options = options;
this.isRefreshingAccessToken = false;
this.failedRequestsQueue = [];
this.accessToken = null;
this.refreshToken = null;
this.httpClient = new client_1.HttpClient({
baseURL: options.baseURL,
requestInterceptors: [
this.setupMetaHeadersInterceptor.bind(this),
this.authenticatedRoutesInterceptor.bind(this)
],
responseInterceptors: [
this.refreshAuthenticationInterceptor.bind(this),
this.storeAuthenticationOutputInterceptor.bind(this)
]
});
this.admin = new index_2.Admin(this.httpClient);
this.authentication = new index_4.Authentication(this.httpClient);
this.projects = new index_7.Projects(this.httpClient);
this.projectActivity = new index_1.ProjectActivity(this.httpClient);
this.projectApplications = new index_3.ProjectApplication(this.httpClient);
this.projectInvitations = new index_5.ProjectInvitations(this.httpClient);
this.projectMembers = new index_6.ProjectMembers(this.httpClient);
this.projectUpdateSets = new index_8.ProjectUpdateSets(this.httpClient);
this.profiles = new profiles_1.Profiles(this.httpClient);
}
async setupMetaHeadersInterceptor(config) {
config.headers.set('X-Client-ID', String(this.options.client.id || "").trim() || 'unknown');
config.headers.set('X-Client-Name', String(this.options.client.name || "").trim() || 'unknown');
config.headers.set('X-Client-Version', String(this.options.client.version || "").trim() || 'unknown');
config.headers.set('X-SDK-Version', version_1.sdkVersion);
config.headers.set('X-Platform', String(this.options.platform.name || "").trim() || 'unknown');
config.headers.set('X-Platform-Version', String(this.options.platform.version || "").trim() || 'unknown');
return config;
}
async authenticatedRoutesInterceptor(config) {
if (this.options.logRequests) {
console.log(`${config.method} ${config.url} ${this.accessToken ? '(with auth)' : ''}`);
}
const urlPathname = new URL(config.url, this.options.baseURL).pathname;
const routeRequiresAuthentication = !AUTHENTICATION_ROUTES.includes(urlPathname);
if (routeRequiresAuthentication) {
if (this.options.authenticationStore) {
const storedAuthentication = await this.options.authenticationStore.get();
if (storedAuthentication) {
this.accessToken = storedAuthentication.accessToken;
this.refreshToken = storedAuthentication.refreshToken;
}
}
if (this.accessToken) {
// TODO: Só incluir o token se forem rotas privadas
config.headers.set('Authorization', `Bearer ${this.accessToken}`);
}
}
return config;
}
async refreshAuthenticationInterceptor(config, response) {
var _a;
if (response.ok) {
return response;
}
const errorResponse = response;
const authenticationExpired = errorResponse.statusCode === 401
&& ((_a = errorResponse.body) === null || _a === void 0 ? void 0 : _a.code) === 'token.expired';
if (!authenticationExpired) {
return response;
}
if (!this.refreshToken) {
return response;
}
if (!this.isRefreshingAccessToken) {
this.isRefreshingAccessToken = true;
this.refreshAccessToken()
.then((refreshTokenResponse) => {
if (!refreshTokenResponse.ok) {
throw refreshTokenResponse;
}
return refreshTokenResponse.body;
})
.then(async (refreshTokenResponse) => {
this.accessToken = refreshTokenResponse.access_token;
this.refreshToken = refreshTokenResponse.refresh_token;
if (this.options.authenticationStore) {
await this.options.authenticationStore.store({
accessToken: refreshTokenResponse.access_token,
refreshToken: refreshTokenResponse.refresh_token
});
}
this.failedRequestsQueue.forEach((request) => {
request.onSuccess(refreshTokenResponse.access_token);
});
this.failedRequestsQueue = [];
})
.catch(async (refreshTokenError) => {
if (this.options.authenticationStore) {
await this.options.authenticationStore.remove();
}
this.failedRequestsQueue.forEach((request) => {
request.onFailure(refreshTokenError);
});
this.failedRequestsQueue = [];
if (this.options.onLogout) {
this.options.onLogout();
}
})
.finally(() => {
this.isRefreshingAccessToken = false;
});
return new Promise((resolve, reject) => {
this.failedRequestsQueue.push({
onSuccess: (updatedAccessToken) => {
config.headers.set('Authorization', `Bearer ${updatedAccessToken}`);
resolve(this.httpClient.request(config));
},
onFailure: reject
});
});
}
return errorResponse;
}
async storeAuthenticationOutputInterceptor(config, response) {
if (!response.ok) {
return response;
}
const isAuthenticationResponse = AUTHENTICATION_ROUTES.includes(config.url);
if (isAuthenticationResponse) {
const body = response.body;
if (this.options.authenticationStore) {
await this.options.authenticationStore.store({
accessToken: body.access_token,
refreshToken: body.refresh_token
});
}
this.accessToken = body.access_token;
this.refreshToken = body.refresh_token;
}
return response;
}
async refreshAccessToken() {
return this.httpClient.post('/v1/auth/refresh', { refresh_token: this.refreshToken });
}
}
exports.SetHub = SetHub;