@pubby.club/sdk
Version:
Pubby Development Kit
166 lines (165 loc) • 6 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.OAuthClient = exports.TicketGrant = exports.RefreshTokenGrant = exports.ClientCredentialsGrant = void 0;
var qs_1 = require("qs");
var axios_1 = __importDefault(require("axios"));
var jwt_decode_1 = __importDefault(require("jwt-decode"));
var polyfills_1 = require("./polyfills");
function ClientCredentialsGrant(scopes) {
if (scopes === void 0) { scopes = []; }
return function (request) { return (__assign(__assign({}, request), { data: qs_1.stringify({
grant_type: "client_credentials",
scope: scopes.join(" "),
}) })); };
}
exports.ClientCredentialsGrant = ClientCredentialsGrant;
/**
* Obtém um novo token de acesso utilizando um token de atualização
* @param refreshToken token de atualização
*/
function RefreshTokenGrant(refreshToken) {
return function (request) { return (__assign(__assign({}, request), { data: qs_1.stringify({
grant_type: "refresh_token",
refresh_token: refreshToken,
}) })); };
}
exports.RefreshTokenGrant = RefreshTokenGrant;
/**
* Obtém um novo ticket para conexão com o Socket.io
* @param accessToken token de acesso
*/
function TicketGrant(accessToken) {
return function (request) { return (__assign(__assign({}, request), { data: qs_1.stringify({
grant_type: "ticket",
access_token: accessToken,
}) })); };
}
exports.TicketGrant = TicketGrant;
var lastRequest;
/**
* Cria um cliente OAuth para gerenciar tokens
*/
var OAuthClient = /** @class */ (function () {
function OAuthClient(options) {
this.options = __assign({ storage: {
get: function () {
return {
accessToken: polyfills_1.localStorage.getItem("at"),
refreshToken: polyfills_1.localStorage.getItem("rt"),
};
},
save: function (token) {
polyfills_1.localStorage.setItem("at", token.accessToken);
polyfills_1.localStorage.setItem("rt", token.refreshToken);
return token;
},
} }, options);
}
Object.defineProperty(OAuthClient.prototype, "accessToken", {
get: function () {
return this.options.storage.get().accessToken;
},
enumerable: false,
configurable: true
});
Object.defineProperty(OAuthClient.prototype, "refreshToken", {
get: function () {
return this.options.storage.get().refreshToken;
},
enumerable: false,
configurable: true
});
Object.defineProperty(OAuthClient.prototype, "tokenPayload", {
get: function () {
try {
return jwt_decode_1.default(this.accessToken);
}
catch (_a) {
return null;
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(OAuthClient.prototype, "isTokenExpired", {
get: function () {
var _a;
var _b = ((_a = this.tokenPayload) !== null && _a !== void 0 ? _a : {}).exp, exp = _b === void 0 ? 0 : _b;
return exp && Date.now() / 1000 >= exp;
},
enumerable: false,
configurable: true
});
/**
* Obtém um novo token de acesso utilizando uma granType customizado
* @param grantType Função de grantType
*/
OAuthClient.prototype.requestToken = function (grantType) {
var request = grantType({
method: "POST",
baseURL: this.options.tokenUrl,
headers: {
"content-type": "application/x-www-form-urlencoded",
},
auth: {
username: this.options.clientId,
password: this.options.clientSecret,
},
}, __assign({}, this.options));
return axios_1.default(request).then(function (res) { return ({
accessToken: res.data.access_token,
refreshToken: res.data.refresh_token,
}); });
};
/**
* Faz login e salva os tokens
* @param scopes Escopos do token
*/
OAuthClient.prototype.login = function (scopes) {
var _this = this;
return this.requestToken(ClientCredentialsGrant(scopes)).then(function (token) {
return _this.options.storage.save(token);
});
};
/**
* Atualiza os tokens e salva
*/
OAuthClient.prototype.refreshAccessToken = function () {
var _this = this;
var _a;
var refreshToken = (_a = polyfills_1.localStorage.getItem("refresh_token")) !== null && _a !== void 0 ? _a : "";
return this.requestToken(RefreshTokenGrant(refreshToken)).then(function (token) {
return _this.options.storage.save(token);
});
};
/** Obtém o token de acesso e atualiza caso precise */
OAuthClient.prototype.getToken = function () {
var _this = this;
if (lastRequest)
return lastRequest;
if (!this.isTokenExpired)
return this.accessToken;
lastRequest = this.refreshAccessToken()
.then(function () { return _this.getToken(); })
.finally(function () {
lastRequest = null;
});
return lastRequest;
};
return OAuthClient;
}());
exports.OAuthClient = OAuthClient;