@bwi-mentorspaces/application-utils-npm 0.0.60 → 0.0.61
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/deployment/_/serverless.d.ts +3 -2
- package/deployment/_/serverless.js.map +1 -1
- package/package.json +1 -1
- package/session/ms.live/ms.live.api.js +0 -3
- package/session/ms.live/ms.live.api.js.map +1 -1
- package/session/ms.live/ms.live.auth.d.ts +2 -2
- package/session/ms.live/ms.live.auth.js +9 -9
- package/session/ms.live/ms.live.auth.js.map +1 -1
- package/utils/_/encryptor.js +6 -10
- package/utils/_/encryptor.js.map +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/// <reference types="express-serve-static-core" />
|
|
2
|
+
import { APIGatewayProxyEventV2, Context, APIGatewayProxyResultV2 } from "aws-lambda";
|
|
2
3
|
/**
|
|
3
4
|
* Serverless handler declarations
|
|
4
5
|
*/
|
|
5
6
|
interface IServerless {
|
|
6
|
-
handler:
|
|
7
|
+
handler: (event: APIGatewayProxyEventV2, context: Context) => Promise<APIGatewayProxyResultV2>;
|
|
7
8
|
}
|
|
8
9
|
/**
|
|
9
10
|
* Serverless Handler implementation
|
|
@@ -19,6 +20,6 @@ export declare class Serverless implements IServerless {
|
|
|
19
20
|
* handler getter
|
|
20
21
|
* @returns {Handler} serverless handler
|
|
21
22
|
*/
|
|
22
|
-
get handler():
|
|
23
|
+
get handler(): (event: APIGatewayProxyEventV2, context: Context) => Promise<import("aws-lambda").APIGatewayProxyStructuredResultV2>;
|
|
23
24
|
}
|
|
24
25
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverless.js","sourceRoot":"","sources":["../../../deployment/_/serverless.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"serverless.js","sourceRoot":"","sources":["../../../deployment/_/serverless.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,sEAAsD;AAUtD;;GAEG;AACH,MAAa,UAAU;IAGnB;;;OAGG;IACH,YAAY,GAAwB;QAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,kBAAkB;IAClB;;;OAGG;IACH,IAAI,OAAO;QACP,MAAM,OAAO,GAAY,IAAA,yBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAO,KAA6B,EAAE,OAAgB,EAAE,EAAE;YAC7D,MAAM,MAAM,GAA4B,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC;QAClB,CAAC,CAAA,CAAC;IACN,CAAC;CACJ;AAvBD,gCAuBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bwi-mentorspaces/application-utils-npm",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.61",
|
|
4
4
|
"description": "Mentor Spaces npm packages for reusable models, utils, and abstracted, commonly used processes for DB Repo, Logging, etc.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mentor Spaces",
|
|
@@ -36,7 +36,6 @@ let MSLiveAPI = class MSLiveAPI extends ms_live_base_1.MSLiveBase {
|
|
|
36
36
|
super();
|
|
37
37
|
_MSLiveAPI_instances.add(this);
|
|
38
38
|
_MSLiveAPI_axiosInstance.set(this, void 0);
|
|
39
|
-
/* eslint-disable */
|
|
40
39
|
_MSLiveAPI_msLiveAuthInstance.set(this, void 0);
|
|
41
40
|
this._config = config;
|
|
42
41
|
// Set Axios baseURL to 100ms API BaseURI
|
|
@@ -73,7 +72,6 @@ let MSLiveAPI = class MSLiveAPI extends ms_live_base_1.MSLiveBase {
|
|
|
73
72
|
}
|
|
74
73
|
};
|
|
75
74
|
_MSLiveAPI_axiosInstance = new WeakMap(), _MSLiveAPI_msLiveAuthInstance = new WeakMap(), _MSLiveAPI_instances = new WeakSet(), _MSLiveAPI_configureAxios = function _MSLiveAPI_configureAxios() {
|
|
76
|
-
/* eslint-disable */
|
|
77
75
|
__classPrivateFieldGet(this, _MSLiveAPI_axiosInstance, "f").interceptors.request.use((config) => {
|
|
78
76
|
// Add Authorization on every request made using the Management token
|
|
79
77
|
config.headers = {
|
|
@@ -83,7 +81,6 @@ _MSLiveAPI_axiosInstance = new WeakMap(), _MSLiveAPI_msLiveAuthInstance = new We
|
|
|
83
81
|
};
|
|
84
82
|
return config;
|
|
85
83
|
}, (error) => Promise.reject(error));
|
|
86
|
-
/* eslint-disable */
|
|
87
84
|
__classPrivateFieldGet(this, _MSLiveAPI_axiosInstance, "f").interceptors.response.use((response) => {
|
|
88
85
|
return response;
|
|
89
86
|
}, (error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ms.live.api.js","sourceRoot":"","sources":["../../../session/ms.live/ms.live.api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"ms.live.api.js","sourceRoot":"","sources":["../../../session/ms.live/ms.live.api.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ export declare class MSLiveAuth implements IMSLiveAuth {
|
|
|
42
42
|
* @returns {void} promise of type void
|
|
43
43
|
*/
|
|
44
44
|
init(msLiveAccessKey: string, msLiveSecretKey: string): void;
|
|
45
|
-
getManagementToken(forceNew
|
|
46
|
-
getAuthToken(
|
|
45
|
+
getManagementToken(forceNew?: boolean): string;
|
|
46
|
+
getAuthToken(roomId: string, userId: string, role: string): string;
|
|
47
47
|
}
|
|
48
48
|
export {};
|
|
@@ -13,14 +13,15 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
13
13
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
14
14
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
15
15
|
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
16
19
|
var _MSLiveAuth_instances, _MSLiveAuth_signPayloadToToken, _MSLiveAuth_isTokenExpired;
|
|
17
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
21
|
exports.MSLiveAuth = void 0;
|
|
19
22
|
const tsyringe_1 = require("tsyringe");
|
|
20
|
-
|
|
21
|
-
const jwt = require('jsonwebtoken');
|
|
23
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
22
24
|
const uuid_1 = require("uuid");
|
|
23
|
-
/* eslint-disable */
|
|
24
25
|
/**
|
|
25
26
|
* MSLive Auth implementation
|
|
26
27
|
*/
|
|
@@ -59,11 +60,11 @@ let MSLiveAuth = class MSLiveAuth {
|
|
|
59
60
|
return this._managementToken;
|
|
60
61
|
}
|
|
61
62
|
// Generate new Auth token for a peer
|
|
62
|
-
getAuthToken(
|
|
63
|
+
getAuthToken(roomId, userId, role) {
|
|
63
64
|
const payload = {
|
|
64
65
|
access_key: this._msLiveAccessKey,
|
|
65
|
-
room_id:
|
|
66
|
-
user_id:
|
|
66
|
+
room_id: roomId,
|
|
67
|
+
user_id: userId,
|
|
67
68
|
role: role,
|
|
68
69
|
type: 'app',
|
|
69
70
|
version: 2,
|
|
@@ -74,16 +75,15 @@ let MSLiveAuth = class MSLiveAuth {
|
|
|
74
75
|
}
|
|
75
76
|
};
|
|
76
77
|
_MSLiveAuth_instances = new WeakSet(), _MSLiveAuth_signPayloadToToken = function _MSLiveAuth_signPayloadToToken(payload) {
|
|
77
|
-
const token =
|
|
78
|
+
const token = jsonwebtoken_1.default.sign(payload, this._msLiveSecretKey, {
|
|
78
79
|
algorithm: 'HS256',
|
|
79
80
|
expiresIn: '24h',
|
|
80
81
|
jwtid: (0, uuid_1.v4)()
|
|
81
82
|
});
|
|
82
|
-
/* eslint-disable */
|
|
83
83
|
return token;
|
|
84
84
|
}, _MSLiveAuth_isTokenExpired = function _MSLiveAuth_isTokenExpired(token) {
|
|
85
85
|
try {
|
|
86
|
-
const { exp } =
|
|
86
|
+
const { exp } = jsonwebtoken_1.default.decode(token, { json: true });
|
|
87
87
|
const buffer = 30; // generate new if it's going to expire soon
|
|
88
88
|
const currTimeSeconds = Math.floor(Date.now() / 1000);
|
|
89
89
|
return !exp || exp + buffer < currTimeSeconds;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ms.live.auth.js","sourceRoot":"","sources":["../../../session/ms.live/ms.live.auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ms.live.auth.js","sourceRoot":"","sources":["../../../session/ms.live/ms.live.auth.ts"],"names":[],"mappings":"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"}
|
package/utils/_/encryptor.js
CHANGED
|
@@ -39,12 +39,10 @@ class Encryptor {
|
|
|
39
39
|
* @returns {string} encrypted value
|
|
40
40
|
*/
|
|
41
41
|
static encrypt(type, value, key) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return Crypto.AES.encrypt(value, key).toString();
|
|
45
|
-
default:
|
|
46
|
-
return Crypto.AES.encrypt(value, key).toString();
|
|
42
|
+
if (type === 0 /* EncryptionType.AES */) {
|
|
43
|
+
return Crypto.AES.encrypt(value, key).toString();
|
|
47
44
|
}
|
|
45
|
+
return Crypto.AES.encrypt(value, key).toString();
|
|
48
46
|
}
|
|
49
47
|
/**
|
|
50
48
|
* Method that decrypts a value
|
|
@@ -54,12 +52,10 @@ class Encryptor {
|
|
|
54
52
|
* @returns {string} decrypted value
|
|
55
53
|
*/
|
|
56
54
|
static decrypt(type, cipher, key) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return Crypto.AES.decrypt(cipher, key).toString(Crypto.enc.Utf8);
|
|
60
|
-
default:
|
|
61
|
-
return Crypto.AES.decrypt(cipher, key).toString(Crypto.enc.Utf8);
|
|
55
|
+
if (type === 0 /* EncryptionType.AES */) {
|
|
56
|
+
return Crypto.AES.decrypt(cipher, key).toString(Crypto.enc.Utf8);
|
|
62
57
|
}
|
|
58
|
+
return Crypto.AES.decrypt(cipher, key).toString(Crypto.enc.Utf8);
|
|
63
59
|
}
|
|
64
60
|
}
|
|
65
61
|
exports.Encryptor = Encryptor;
|
package/utils/_/encryptor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryptor.js","sourceRoot":"","sources":["../../../utils/_/encryptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAoC;AAGpC;;;;GAIG;AACH,MAAsB,SAAS;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,IAAoB,EAAE,KAAa,EAAE,GAAW;QAC3D,
|
|
1
|
+
{"version":3,"file":"encryptor.js","sourceRoot":"","sources":["../../../utils/_/encryptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAoC;AAGpC;;;;GAIG;AACH,MAAsB,SAAS;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,IAAoB,EAAE,KAAa,EAAE,GAAW;QAC3D,IAAI,IAAI,+BAAuB,EAAE;YAC7B,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;SACpD;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,IAAoB,EAAE,MAAc,EAAE,GAAW;QAC5D,IAAI,IAAI,+BAAuB,EAAE;YAC7B,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACpE;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;CACJ;AA5BD,8BA4BC"}
|