@morabr/mora-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/cjs/api/api.js +491 -0
- package/dist/cjs/index.js +21 -0
- package/dist/cjs/interfaces.js +2 -0
- package/dist/cjs/sdk.js +353 -0
- package/dist/esm/api/api.js +485 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/interfaces.js +1 -0
- package/dist/esm/sdk.js +324 -0
- package/dist/types/api/api.d.ts +925 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/interfaces.d.ts +22 -0
- package/dist/types/sdk.d.ts +45 -0
- package/dist/umd/index.ts +28464 -0
- package/package.json +106 -0
package/dist/cjs/sdk.js
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
47
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
+
function step(op) {
|
|
50
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
52
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
53
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
+
switch (op[0]) {
|
|
55
|
+
case 0: case 1: t = op; break;
|
|
56
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
+
default:
|
|
60
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
+
if (t[2]) _.ops.pop();
|
|
65
|
+
_.trys.pop(); continue;
|
|
66
|
+
}
|
|
67
|
+
op = body.call(thisArg, _);
|
|
68
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
73
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
74
|
+
};
|
|
75
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
76
|
+
exports.MoraSDK = void 0;
|
|
77
|
+
var jwt_decode_1 = __importDefault(require("jwt-decode"));
|
|
78
|
+
var api_1 = require("./api/api");
|
|
79
|
+
var mitt_1 = __importDefault(require("mitt"));
|
|
80
|
+
var datefns = __importStar(require("date-fns"));
|
|
81
|
+
var MoraSDK = /** @class */ (function () {
|
|
82
|
+
function MoraSDK(options) {
|
|
83
|
+
this.authToken = '';
|
|
84
|
+
this.refreshToken = '';
|
|
85
|
+
this.defaultOptions = {
|
|
86
|
+
autoRefresh: false,
|
|
87
|
+
tokenExpireOffset: 5000,
|
|
88
|
+
};
|
|
89
|
+
this.options = __assign(__assign({}, this.defaultOptions), (options || {}));
|
|
90
|
+
this.emitter = (0, mitt_1.default)();
|
|
91
|
+
this.api = new api_1.Api({
|
|
92
|
+
baseURL: options.baseURL,
|
|
93
|
+
securityWorker: function (securityData) {
|
|
94
|
+
if (!(securityData === null || securityData === void 0 ? void 0 : securityData.bearer)) {
|
|
95
|
+
return {};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
headers: {
|
|
99
|
+
Authorization: "Bearer ".concat(securityData === null || securityData === void 0 ? void 0 : securityData.bearer),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
secure: true,
|
|
104
|
+
});
|
|
105
|
+
this.hookInterceptors();
|
|
106
|
+
}
|
|
107
|
+
MoraSDK.prototype.enableAutoRefresh = function (force) {
|
|
108
|
+
var _this = this;
|
|
109
|
+
if (this.options.autoRefresh && !force)
|
|
110
|
+
return;
|
|
111
|
+
this.options.autoRefresh = true;
|
|
112
|
+
if (!this.autoRefreshTimer) {
|
|
113
|
+
this.autoRefreshTimer = setInterval(function () {
|
|
114
|
+
return _this.triggerRefreshToken().catch(function (error) { var _a; return console.error(((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) || error); });
|
|
115
|
+
}, 500);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
MoraSDK.prototype.disableAutoRefresh = function () {
|
|
119
|
+
if (!this.options.autoRefresh)
|
|
120
|
+
return;
|
|
121
|
+
this.options.autoRefresh = false;
|
|
122
|
+
if (this.autoRefreshTimer) {
|
|
123
|
+
clearInterval(this.autoRefreshTimer);
|
|
124
|
+
this.autoRefreshTimer = undefined;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
MoraSDK.prototype.hookTimer = function () {
|
|
128
|
+
if (!this.options.autoRefresh)
|
|
129
|
+
return;
|
|
130
|
+
if (!this.autoRefreshTimer) {
|
|
131
|
+
this.enableAutoRefresh();
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
MoraSDK.prototype.hookInterceptors = function () {
|
|
135
|
+
var _this = this;
|
|
136
|
+
var refreshTokenUsed = new Set();
|
|
137
|
+
this.api.instance.interceptors.request.use(function (config) {
|
|
138
|
+
if (_this.isTokenExpired()) {
|
|
139
|
+
_this.clearTokens();
|
|
140
|
+
}
|
|
141
|
+
return config;
|
|
142
|
+
});
|
|
143
|
+
this.api.instance.interceptors.response.use(function (response) {
|
|
144
|
+
return response;
|
|
145
|
+
}, function (error) { return __awaiter(_this, void 0, void 0, function () {
|
|
146
|
+
var error_1;
|
|
147
|
+
var _a, _b;
|
|
148
|
+
return __generator(this, function (_c) {
|
|
149
|
+
switch (_c.label) {
|
|
150
|
+
case 0:
|
|
151
|
+
if (!(((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) === 401 &&
|
|
152
|
+
this.authToken &&
|
|
153
|
+
// ToDO: Uncomment this this.refreshToken &&
|
|
154
|
+
!refreshTokenUsed.has(this.refreshToken))) return [3 /*break*/, 4];
|
|
155
|
+
refreshTokenUsed.add(this.refreshToken);
|
|
156
|
+
_c.label = 1;
|
|
157
|
+
case 1:
|
|
158
|
+
_c.trys.push([1, 3, , 4]);
|
|
159
|
+
return [4 /*yield*/, this.refreshTokens({ throwError: true })];
|
|
160
|
+
case 2:
|
|
161
|
+
_c.sent();
|
|
162
|
+
return [3 /*break*/, 4];
|
|
163
|
+
case 3:
|
|
164
|
+
error_1 = _c.sent();
|
|
165
|
+
console.error('Refresh token failed', ((_b = error_1 === null || error_1 === void 0 ? void 0 : error_1.response) === null || _b === void 0 ? void 0 : _b.data) || error_1);
|
|
166
|
+
this.clearTokens();
|
|
167
|
+
return [3 /*break*/, 4];
|
|
168
|
+
case 4: return [2 /*return*/, Promise.reject(error)];
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}); });
|
|
172
|
+
};
|
|
173
|
+
MoraSDK.prototype.clearTokens = function () {
|
|
174
|
+
this.authToken = '';
|
|
175
|
+
this.authTokenDecoded = undefined;
|
|
176
|
+
this.refreshToken = '';
|
|
177
|
+
this.refreshTokenDecoded = undefined;
|
|
178
|
+
this.emitter.emit('authChanged', { authToken: '', refreshToken: '' });
|
|
179
|
+
};
|
|
180
|
+
MoraSDK.prototype.authenticate = function (credential, opts) {
|
|
181
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
182
|
+
return __generator(this, function (_a) {
|
|
183
|
+
switch (_a.label) {
|
|
184
|
+
case 0:
|
|
185
|
+
if (!(opts === null || opts === void 0 ? void 0 : opts.avoidEvents))
|
|
186
|
+
this.emitter.emit('connecting');
|
|
187
|
+
if (!((credential === null || credential === void 0 ? void 0 : credential.email) && (credential === null || credential === void 0 ? void 0 : credential.password))) return [3 /*break*/, 2];
|
|
188
|
+
return [4 /*yield*/, this.authenticateAsUser(credential)];
|
|
189
|
+
case 1:
|
|
190
|
+
_a.sent();
|
|
191
|
+
this.signInCredential = credential;
|
|
192
|
+
return [3 /*break*/, 5];
|
|
193
|
+
case 2:
|
|
194
|
+
if (!(credential === null || credential === void 0 ? void 0 : credential.authToken)) return [3 /*break*/, 4];
|
|
195
|
+
// ToDO add && (credential as any)?.refreshToken after refreshToken is ready
|
|
196
|
+
return [4 /*yield*/, this.authenticateAsToken(credential)];
|
|
197
|
+
case 3:
|
|
198
|
+
// ToDO add && (credential as any)?.refreshToken after refreshToken is ready
|
|
199
|
+
_a.sent();
|
|
200
|
+
return [3 /*break*/, 5];
|
|
201
|
+
case 4: throw new Error("Invalid auth credential type format");
|
|
202
|
+
case 5:
|
|
203
|
+
if (!(opts === null || opts === void 0 ? void 0 : opts.avoidEvents))
|
|
204
|
+
this.emitter.emit('connected');
|
|
205
|
+
this.hookTimer();
|
|
206
|
+
return [2 /*return*/];
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
MoraSDK.prototype.reAuthenticate = function (opts) {
|
|
212
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
213
|
+
return __generator(this, function (_a) {
|
|
214
|
+
switch (_a.label) {
|
|
215
|
+
case 0:
|
|
216
|
+
if (!this.signInCredential) {
|
|
217
|
+
if (opts === null || opts === void 0 ? void 0 : opts.throwError)
|
|
218
|
+
new Error("No SignIn set to make re-auth");
|
|
219
|
+
return [2 /*return*/];
|
|
220
|
+
}
|
|
221
|
+
return [4 /*yield*/, this.authenticate(this.signInCredential, { avoidEvents: true })];
|
|
222
|
+
case 1:
|
|
223
|
+
_a.sent();
|
|
224
|
+
return [2 /*return*/];
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
};
|
|
229
|
+
MoraSDK.prototype.isAuthenticated = function () {
|
|
230
|
+
return this.authToken.length > 0;
|
|
231
|
+
};
|
|
232
|
+
MoraSDK.prototype.setAuthToken = function (token) {
|
|
233
|
+
if (!token || (token === null || token === void 0 ? void 0 : token.length) === 0)
|
|
234
|
+
throw new Error('Invalid token');
|
|
235
|
+
if (this.authToken === token)
|
|
236
|
+
return;
|
|
237
|
+
var decoded = (0, jwt_decode_1.default)(token);
|
|
238
|
+
if (!decoded.exp)
|
|
239
|
+
throw new Error('Invalid decoded token');
|
|
240
|
+
this.authTokenDecoded = decoded;
|
|
241
|
+
this.authToken = token;
|
|
242
|
+
this.api.setSecurityData({ bearer: token });
|
|
243
|
+
};
|
|
244
|
+
MoraSDK.prototype.triggerRefreshToken = function () {
|
|
245
|
+
var _a;
|
|
246
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
247
|
+
return __generator(this, function (_b) {
|
|
248
|
+
switch (_b.label) {
|
|
249
|
+
case 0:
|
|
250
|
+
//Todo: add || !this.refreshToken after implementing it here
|
|
251
|
+
if (!this.authToken) {
|
|
252
|
+
return [2 /*return*/, this.clearTokens()];
|
|
253
|
+
}
|
|
254
|
+
if (!((_a = this.authTokenDecoded) === null || _a === void 0 ? void 0 : _a.exp)) {
|
|
255
|
+
return [2 /*return*/];
|
|
256
|
+
}
|
|
257
|
+
if (!this.isTokenExpired()) return [3 /*break*/, 2];
|
|
258
|
+
return [4 /*yield*/, this.refreshTokens()];
|
|
259
|
+
case 1:
|
|
260
|
+
_b.sent();
|
|
261
|
+
_b.label = 2;
|
|
262
|
+
case 2: return [2 /*return*/];
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
MoraSDK.prototype.isTokenExpired = function () {
|
|
268
|
+
var _a, _b, _c, _d;
|
|
269
|
+
var offset = ((_a = this.options) === null || _a === void 0 ? void 0 : _a.tokenExpireOffset) || 0;
|
|
270
|
+
if (offset < 0)
|
|
271
|
+
return true;
|
|
272
|
+
if (!((_b = this.authTokenDecoded) === null || _b === void 0 ? void 0 : _b.exp) || !((_c = this.refreshTokenDecoded) === null || _c === void 0 ? void 0 : _c.exp)) {
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
var nextExpiration = Math.min(this.authTokenDecoded.exp, (_d = this.refreshTokenDecoded) === null || _d === void 0 ? void 0 : _d.exp) * 1000;
|
|
276
|
+
return datefns.isPast(datefns.subSeconds(nextExpiration, offset));
|
|
277
|
+
};
|
|
278
|
+
MoraSDK.prototype.getAuthToken = function () {
|
|
279
|
+
return this.authToken.toString();
|
|
280
|
+
};
|
|
281
|
+
MoraSDK.prototype.setRefreshToken = function (refreshToken) {
|
|
282
|
+
if (this.refreshToken === refreshToken)
|
|
283
|
+
return;
|
|
284
|
+
var refreshTokenDecoded = (0, jwt_decode_1.default)(refreshToken);
|
|
285
|
+
if (!refreshTokenDecoded.exp)
|
|
286
|
+
throw new Error('Invalid decoded token');
|
|
287
|
+
// if(this.refreshTokenDecoded && this.refreshTokenDecoded != refreshToken) {
|
|
288
|
+
// this.emitter.emit('refreshTokenChanged', this.refreshTokenDecoded, refreshTokenDecoded);
|
|
289
|
+
// }
|
|
290
|
+
this.refreshTokenDecoded = refreshTokenDecoded;
|
|
291
|
+
this.refreshToken = refreshToken;
|
|
292
|
+
};
|
|
293
|
+
MoraSDK.prototype.getRefreshToken = function () {
|
|
294
|
+
return this.refreshToken.toString();
|
|
295
|
+
};
|
|
296
|
+
MoraSDK.prototype.refreshTokens = function (opts) {
|
|
297
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
298
|
+
return __generator(this, function (_a) {
|
|
299
|
+
switch (_a.label) {
|
|
300
|
+
case 0:
|
|
301
|
+
// ToDo: Refresh token is not implemented under this version. For a while, lets just re-auth
|
|
302
|
+
this.clearTokens();
|
|
303
|
+
return [4 /*yield*/, this.reAuthenticate(opts)];
|
|
304
|
+
case 1:
|
|
305
|
+
_a.sent();
|
|
306
|
+
return [2 /*return*/];
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
};
|
|
311
|
+
MoraSDK.prototype.authenticateAsUser = function (credential) {
|
|
312
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
313
|
+
var data;
|
|
314
|
+
return __generator(this, function (_a) {
|
|
315
|
+
switch (_a.label) {
|
|
316
|
+
case 0: return [4 /*yield*/, this.api.auth.signIn(credential)];
|
|
317
|
+
case 1:
|
|
318
|
+
data = _a.sent();
|
|
319
|
+
if (!data.token) {
|
|
320
|
+
throw new Error('Authentication failed. Please check your credentials.');
|
|
321
|
+
}
|
|
322
|
+
// For a while, our api doesn't accept refresh tokens, we will implement it in next versions
|
|
323
|
+
this.setTokens({ token: data.token, refreshToken: '' });
|
|
324
|
+
return [2 /*return*/];
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
};
|
|
329
|
+
MoraSDK.prototype.authenticateAsToken = function (credential) {
|
|
330
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
331
|
+
return __generator(this, function (_a) {
|
|
332
|
+
this.setTokens({ token: credential.authToken, refreshToken: credential.refreshToken });
|
|
333
|
+
return [2 /*return*/];
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
MoraSDK.prototype.setTokens = function (data) {
|
|
338
|
+
this.setAuthToken(data.token);
|
|
339
|
+
this.setRefreshToken(data.refreshToken);
|
|
340
|
+
this.emitter.emit('authChanged', { authToken: data.token, refreshToken: data.refreshToken });
|
|
341
|
+
};
|
|
342
|
+
MoraSDK.prototype.getAuthTokenDecoded = function () {
|
|
343
|
+
return this.authTokenDecoded;
|
|
344
|
+
};
|
|
345
|
+
MoraSDK.prototype.getRefreshTokenDecoded = function () {
|
|
346
|
+
return this.refreshTokenDecoded;
|
|
347
|
+
};
|
|
348
|
+
MoraSDK.decodeToken = function (token) {
|
|
349
|
+
return (0, jwt_decode_1.default)(token, {});
|
|
350
|
+
};
|
|
351
|
+
return MoraSDK;
|
|
352
|
+
}());
|
|
353
|
+
exports.MoraSDK = MoraSDK;
|