equipped 4.0.0-alpha-10
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/CHANGELOG.md +64 -0
- package/lib/bull/index.d.ts +37 -0
- package/lib/bull/index.js +93 -0
- package/lib/cache/cache.d.ts +7 -0
- package/lib/cache/cache.js +6 -0
- package/lib/cache/types/redis-cache.d.ts +11 -0
- package/lib/cache/types/redis-cache.js +40 -0
- package/lib/emails/index.d.ts +14 -0
- package/lib/emails/index.js +13 -0
- package/lib/enums/index.d.ts +19 -0
- package/lib/enums/index.js +29 -0
- package/lib/enums/types.d.ts +36 -0
- package/lib/enums/types.js +22 -0
- package/lib/errors/customError.d.ts +14 -0
- package/lib/errors/customError.js +12 -0
- package/lib/errors/index.d.ts +10 -0
- package/lib/errors/index.js +26 -0
- package/lib/errors/types/accessTokenExpired.d.ts +5 -0
- package/lib/errors/types/accessTokenExpired.js +12 -0
- package/lib/errors/types/accountNotVerifiedError.d.ts +5 -0
- package/lib/errors/types/accountNotVerifiedError.js +12 -0
- package/lib/errors/types/badRequestError.d.ts +5 -0
- package/lib/errors/types/badRequestError.js +12 -0
- package/lib/errors/types/invalidToken.d.ts +5 -0
- package/lib/errors/types/invalidToken.js +12 -0
- package/lib/errors/types/notAuthenticatedError.d.ts +5 -0
- package/lib/errors/types/notAuthenticatedError.js +12 -0
- package/lib/errors/types/notAuthorizedError.d.ts +5 -0
- package/lib/errors/types/notAuthorizedError.js +12 -0
- package/lib/errors/types/notFoundError.d.ts +5 -0
- package/lib/errors/types/notFoundError.js +12 -0
- package/lib/errors/types/refreshTokenMisusedError.d.ts +5 -0
- package/lib/errors/types/refreshTokenMisusedError.js +12 -0
- package/lib/errors/types/validationError.d.ts +10 -0
- package/lib/errors/types/validationError.js +12 -0
- package/lib/events/events.d.ts +17 -0
- package/lib/events/events.js +26 -0
- package/lib/events/rabbit.d.ts +4 -0
- package/lib/events/rabbit.js +44 -0
- package/lib/exit.d.ts +1 -0
- package/lib/exit.js +25 -0
- package/lib/express/app.d.ts +16 -0
- package/lib/express/app.js +127 -0
- package/lib/express/controllers/index.d.ts +13 -0
- package/lib/express/controllers/index.js +76 -0
- package/lib/express/controllers/request.d.ts +31 -0
- package/lib/express/controllers/request.js +48 -0
- package/lib/express/index.d.ts +5 -0
- package/lib/express/index.js +20 -0
- package/lib/express/middlewares/errorHandler.d.ts +1 -0
- package/lib/express/middlewares/errorHandler.js +22 -0
- package/lib/express/middlewares/index.d.ts +4 -0
- package/lib/express/middlewares/index.js +20 -0
- package/lib/express/middlewares/notFoundHandler.d.ts +1 -0
- package/lib/express/middlewares/notFoundHandler.js +8 -0
- package/lib/express/middlewares/parseAuthUser.d.ts +1 -0
- package/lib/express/middlewares/parseAuthUser.js +15 -0
- package/lib/express/middlewares/requireAuthUser.d.ts +2 -0
- package/lib/express/middlewares/requireAuthUser.js +11 -0
- package/lib/express/middlewares/requireRefreshUser.d.ts +2 -0
- package/lib/express/middlewares/requireRefreshUser.js +14 -0
- package/lib/express/statusCodes.d.ts +16 -0
- package/lib/express/statusCodes.js +17 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.js +45 -0
- package/lib/instance.d.ts +43 -0
- package/lib/instance.js +115 -0
- package/lib/listeners/emitter.d.ts +20 -0
- package/lib/listeners/emitter.js +132 -0
- package/lib/listeners/index.d.ts +1 -0
- package/lib/listeners/index.js +17 -0
- package/lib/logger/index.d.ts +16 -0
- package/lib/logger/index.js +25 -0
- package/lib/mongoose/changeStreams.d.ts +25 -0
- package/lib/mongoose/changeStreams.js +93 -0
- package/lib/mongoose/index.d.ts +4 -0
- package/lib/mongoose/index.js +24 -0
- package/lib/mongoose/query.d.ts +60 -0
- package/lib/mongoose/query.js +97 -0
- package/lib/storage/index.d.ts +18 -0
- package/lib/storage/index.js +2 -0
- package/lib/structure/baseEntity.d.ts +5 -0
- package/lib/structure/baseEntity.js +21 -0
- package/lib/structure/baseMapper.d.ts +4 -0
- package/lib/structure/baseMapper.js +6 -0
- package/lib/structure/index.d.ts +2 -0
- package/lib/structure/index.js +18 -0
- package/lib/utils/auth.d.ts +28 -0
- package/lib/utils/auth.js +65 -0
- package/lib/utils/authUser.d.ts +10 -0
- package/lib/utils/authUser.js +2 -0
- package/lib/utils/media.d.ts +2 -0
- package/lib/utils/media.js +14 -0
- package/lib/utils/tokens.d.ts +15 -0
- package/lib/utils/tokens.js +78 -0
- package/lib/utils/utils.d.ts +4 -0
- package/lib/utils/utils.js +16 -0
- package/lib/validations/index.d.ts +146 -0
- package/lib/validations/index.js +103 -0
- package/package.json +80 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValidationError = void 0;
|
|
4
|
+
const customError_1 = require("../customError");
|
|
5
|
+
const express_1 = require("../../express");
|
|
6
|
+
class ValidationError extends customError_1.CustomError {
|
|
7
|
+
constructor(errors) {
|
|
8
|
+
super('Invalid request parameters', errors.map((e) => ({ field: e.field, message: e.messages.join('\n') })));
|
|
9
|
+
this.statusCode = express_1.StatusCodes.ValidationError;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.ValidationError = ValidationError;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IEventTypes, Enum } from '../enums/types';
|
|
2
|
+
import { pubAndSub } from './rabbit';
|
|
3
|
+
export interface Events extends Record<Enum<IEventTypes>, {
|
|
4
|
+
topic: Enum<IEventTypes>;
|
|
5
|
+
data: any;
|
|
6
|
+
}> {
|
|
7
|
+
}
|
|
8
|
+
export declare class EventBus {
|
|
9
|
+
ps: ReturnType<typeof pubAndSub>;
|
|
10
|
+
constructor();
|
|
11
|
+
createPublisher<Event extends Events[keyof Events]>(topic: Event['topic']): {
|
|
12
|
+
publish: (data: Event['data']) => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
createSubscriber<Event extends Events[keyof Events]>(topic: Event['topic'], onMessage: (data: Event['data']) => void): {
|
|
15
|
+
subscribe: () => Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventBus = void 0;
|
|
4
|
+
const rabbit_1 = require("./rabbit");
|
|
5
|
+
class EventBus {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.ps = (0, rabbit_1.pubAndSub)();
|
|
8
|
+
}
|
|
9
|
+
createPublisher(topic) {
|
|
10
|
+
const { ps } = this;
|
|
11
|
+
const publish = async (data) => {
|
|
12
|
+
await (await ps).publish(topic, JSON.stringify(data));
|
|
13
|
+
};
|
|
14
|
+
return { publish };
|
|
15
|
+
}
|
|
16
|
+
createSubscriber(topic, onMessage) {
|
|
17
|
+
const { ps } = this;
|
|
18
|
+
const subscribe = async () => {
|
|
19
|
+
await (await ps).subscribe(topic, (data) => {
|
|
20
|
+
onMessage(JSON.parse(data));
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
return { subscribe };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.EventBus = EventBus;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.pubAndSub = void 0;
|
|
7
|
+
const amqplib_1 = __importDefault(require("amqplib"));
|
|
8
|
+
const exit_1 = require("../exit");
|
|
9
|
+
const instance_1 = require("../instance");
|
|
10
|
+
const pubAndSub = async () => {
|
|
11
|
+
const column = instance_1.Instance.get().settings.rabbitColumnName;
|
|
12
|
+
const con = await amqplib_1.default.connect(instance_1.Instance.get().settings.rabbitURI);
|
|
13
|
+
con.on('error', (err) => {
|
|
14
|
+
instance_1.Instance.get().logger.error('Amqp error:', err.message);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
17
|
+
const channel = await con.createChannel();
|
|
18
|
+
(0, exit_1.addWaitBeforeExit)(channel.close);
|
|
19
|
+
await channel.assertExchange(column, 'direct', { durable: true });
|
|
20
|
+
await channel.prefetch(1);
|
|
21
|
+
const publish = async (topic, data) => {
|
|
22
|
+
channel.publish(column, topic, Buffer.from(data), { persistent: true });
|
|
23
|
+
};
|
|
24
|
+
const subscribe = async (topic, cb) => {
|
|
25
|
+
const queue = `${instance_1.Instance.get().settings.appId}-${topic}`;
|
|
26
|
+
await channel.assertQueue(queue, { durable: true });
|
|
27
|
+
await channel.bindQueue(queue, column, topic);
|
|
28
|
+
channel.consume(queue, (msg) => {
|
|
29
|
+
if (msg) {
|
|
30
|
+
try {
|
|
31
|
+
cb(msg.content.toString(), msg.fields.routingKey);
|
|
32
|
+
channel.ack(msg);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
channel.nack(msg);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}, {
|
|
39
|
+
noAck: false
|
|
40
|
+
}).then();
|
|
41
|
+
};
|
|
42
|
+
return { publish, subscribe };
|
|
43
|
+
};
|
|
44
|
+
exports.pubAndSub = pubAndSub;
|
package/lib/exit.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const addWaitBeforeExit: (fn: any) => void;
|
package/lib/exit.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addWaitBeforeExit = void 0;
|
|
4
|
+
const listeners = [];
|
|
5
|
+
const addWaitBeforeExit = (fn) => {
|
|
6
|
+
listeners.push(fn);
|
|
7
|
+
};
|
|
8
|
+
exports.addWaitBeforeExit = addWaitBeforeExit;
|
|
9
|
+
const signals = {
|
|
10
|
+
SIGHUP: 1,
|
|
11
|
+
SIGINT: 2,
|
|
12
|
+
SIGTERM: 15
|
|
13
|
+
};
|
|
14
|
+
Object.entries(signals).forEach(([signal, code]) => {
|
|
15
|
+
process.on(signal, async () => {
|
|
16
|
+
await Promise.all(listeners.map(async (l) => {
|
|
17
|
+
try {
|
|
18
|
+
await typeof l === 'function' ? l() : l;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
process.exit(128 + code);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Listener } from '../listeners';
|
|
2
|
+
import { Controller } from './controllers';
|
|
3
|
+
type MethodTypes = 'get' | 'post' | 'put' | 'delete' | 'all';
|
|
4
|
+
export type Route = {
|
|
5
|
+
path: string;
|
|
6
|
+
method: MethodTypes;
|
|
7
|
+
controllers: Controller[];
|
|
8
|
+
};
|
|
9
|
+
export declare class Server {
|
|
10
|
+
#private;
|
|
11
|
+
constructor();
|
|
12
|
+
get listener(): Listener;
|
|
13
|
+
set routes(routes: Route[]);
|
|
14
|
+
start(port: number): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
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");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _Server_expressApp, _Server_httpServer, _Server_listener;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Server = void 0;
|
|
19
|
+
const cookie_parser_1 = __importDefault(require("cookie-parser"));
|
|
20
|
+
const cors_1 = __importDefault(require("cors"));
|
|
21
|
+
const express_1 = __importDefault(require("express"));
|
|
22
|
+
const express_fileupload_1 = __importDefault(require("express-fileupload"));
|
|
23
|
+
const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
|
|
24
|
+
const express_slow_down_1 = __importDefault(require("express-slow-down"));
|
|
25
|
+
const http_1 = __importDefault(require("http"));
|
|
26
|
+
const morgan_1 = __importDefault(require("morgan"));
|
|
27
|
+
const path_1 = __importDefault(require("path"));
|
|
28
|
+
const socket_io_1 = __importDefault(require("socket.io"));
|
|
29
|
+
const exit_1 = require("../exit");
|
|
30
|
+
const instance_1 = require("../instance");
|
|
31
|
+
const listeners_1 = require("../listeners");
|
|
32
|
+
const controllers_1 = require("./controllers");
|
|
33
|
+
const middlewares_1 = require("./middlewares");
|
|
34
|
+
const parseAuthUser_1 = require("./middlewares/parseAuthUser");
|
|
35
|
+
const statusCodes_1 = require("./statusCodes");
|
|
36
|
+
const postRoutes = () => [
|
|
37
|
+
{
|
|
38
|
+
path: '__health',
|
|
39
|
+
method: 'get',
|
|
40
|
+
controllers: [
|
|
41
|
+
(0, controllers_1.makeController)(async () => {
|
|
42
|
+
return {
|
|
43
|
+
status: statusCodes_1.StatusCodes.Ok,
|
|
44
|
+
result: `${instance_1.Instance.get().settings.appId} service running`
|
|
45
|
+
};
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
path: '',
|
|
51
|
+
method: 'all',
|
|
52
|
+
controllers: [middlewares_1.notFoundHandler]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
path: '',
|
|
56
|
+
method: 'all',
|
|
57
|
+
controllers: [middlewares_1.errorHandler]
|
|
58
|
+
}
|
|
59
|
+
];
|
|
60
|
+
class Server {
|
|
61
|
+
constructor() {
|
|
62
|
+
_Server_expressApp.set(this, void 0);
|
|
63
|
+
_Server_httpServer.set(this, void 0);
|
|
64
|
+
_Server_listener.set(this, void 0);
|
|
65
|
+
const settings = instance_1.Instance.get().settings;
|
|
66
|
+
__classPrivateFieldSet(this, _Server_expressApp, (0, express_1.default)(), "f");
|
|
67
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").disable('x-powered-by');
|
|
68
|
+
__classPrivateFieldSet(this, _Server_httpServer, http_1.default.createServer(__classPrivateFieldGet(this, _Server_expressApp, "f")), "f");
|
|
69
|
+
if (settings.isDev)
|
|
70
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use((0, morgan_1.default)('dev'));
|
|
71
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use(express_1.default.json());
|
|
72
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use((0, cookie_parser_1.default)());
|
|
73
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use((0, cors_1.default)({ origin: '*' }));
|
|
74
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use(express_1.default.urlencoded({ extended: false }));
|
|
75
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use(express_1.default.static(path_1.default.join(process.cwd(), 'public')));
|
|
76
|
+
if (settings.useRateLimit)
|
|
77
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use((0, express_rate_limit_1.default)({
|
|
78
|
+
windowMs: settings.rateLimitPeriodInMs,
|
|
79
|
+
max: settings.rateLimit,
|
|
80
|
+
handler: (_, res) => res.status(statusCodes_1.StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }])
|
|
81
|
+
}));
|
|
82
|
+
if (settings.useSlowDown)
|
|
83
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use((0, express_slow_down_1.default)({
|
|
84
|
+
windowMs: settings.slowDownPeriodInMs,
|
|
85
|
+
delayAfter: settings.slowDownAfter,
|
|
86
|
+
delayMs: settings.slowDownDelayInMs
|
|
87
|
+
}));
|
|
88
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use((0, express_fileupload_1.default)({
|
|
89
|
+
limits: { fileSize: settings.maxFileUploadSizeInMb * 1024 * 1024 },
|
|
90
|
+
useTempFiles: false
|
|
91
|
+
}));
|
|
92
|
+
const socket = new socket_io_1.default.Server(__classPrivateFieldGet(this, _Server_httpServer, "f"), { cors: { origin: '*' } });
|
|
93
|
+
__classPrivateFieldSet(this, _Server_listener, new listeners_1.Listener(socket, {
|
|
94
|
+
onConnect: async () => { },
|
|
95
|
+
onDisconnect: async () => { }
|
|
96
|
+
}), "f");
|
|
97
|
+
}
|
|
98
|
+
get listener() {
|
|
99
|
+
return __classPrivateFieldGet(this, _Server_listener, "f");
|
|
100
|
+
}
|
|
101
|
+
set routes(routes) {
|
|
102
|
+
const allRoutes = [...routes, ...postRoutes()];
|
|
103
|
+
allRoutes.forEach(({ method, path, controllers }) => {
|
|
104
|
+
controllers = [parseAuthUser_1.parseAuthUser, ...controllers];
|
|
105
|
+
if (path)
|
|
106
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f")[method]?.(formatPath(path), ...controllers);
|
|
107
|
+
else
|
|
108
|
+
__classPrivateFieldGet(this, _Server_expressApp, "f").use(...controllers);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async start(port) {
|
|
112
|
+
return await new Promise((resolve, reject) => {
|
|
113
|
+
try {
|
|
114
|
+
const app = __classPrivateFieldGet(this, _Server_httpServer, "f").listen(port, () => resolve(true));
|
|
115
|
+
(0, exit_1.addWaitBeforeExit)(app.close);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
reject(err);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.Server = Server;
|
|
124
|
+
_Server_expressApp = new WeakMap(), _Server_httpServer = new WeakMap(), _Server_listener = new WeakMap();
|
|
125
|
+
const formatPath = (path) => `/${path}/`
|
|
126
|
+
.replaceAll('///', '/')
|
|
127
|
+
.replaceAll('//', '/');
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ErrorRequestHandler, Handler } from 'express';
|
|
2
|
+
import { SupportedStatusCodes } from '../statusCodes';
|
|
3
|
+
import { Request as CustomRequest } from './request';
|
|
4
|
+
type CustomResponse = {
|
|
5
|
+
status: SupportedStatusCodes;
|
|
6
|
+
result: any;
|
|
7
|
+
headers?: Record<string, any>;
|
|
8
|
+
};
|
|
9
|
+
export type Controller = Handler | ErrorRequestHandler;
|
|
10
|
+
export declare const makeController: (cb: (_: CustomRequest) => Promise<CustomResponse>) => Controller;
|
|
11
|
+
export declare const makeMiddleware: (cb: (_: CustomRequest) => Promise<void>) => Controller;
|
|
12
|
+
export declare const makeErrorMiddleware: (cb: (_: CustomRequest, __: Error) => Promise<CustomResponse>) => Controller;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeErrorMiddleware = exports.makeMiddleware = exports.makeController = void 0;
|
|
4
|
+
const media_1 = require("../../utils/media");
|
|
5
|
+
const statusCodes_1 = require("../statusCodes");
|
|
6
|
+
const request_1 = require("./request");
|
|
7
|
+
const makeController = (cb) => {
|
|
8
|
+
return async (req, res, next) => {
|
|
9
|
+
try {
|
|
10
|
+
const { status = statusCodes_1.StatusCodes.Ok, result, headers = {} } = await cb(await extractRequest(req));
|
|
11
|
+
Object.entries(headers).forEach(([key, value]) => res.header(key, value));
|
|
12
|
+
return res.status(status).json(result).end();
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
next(e);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.makeController = makeController;
|
|
21
|
+
const makeMiddleware = (cb) => {
|
|
22
|
+
return async (req, _, next) => {
|
|
23
|
+
try {
|
|
24
|
+
await cb(await extractRequest(req));
|
|
25
|
+
return next();
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
return next(e);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.makeMiddleware = makeMiddleware;
|
|
33
|
+
const makeErrorMiddleware = (cb) => {
|
|
34
|
+
return async (err, req, res, _) => {
|
|
35
|
+
const { status = statusCodes_1.StatusCodes.BadRequest, result, headers = {} } = await cb(await extractRequest(req), err);
|
|
36
|
+
Object.entries(headers).forEach(([key, value]) => res.header(key, value));
|
|
37
|
+
return res.status(status).json(result).end();
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
exports.makeErrorMiddleware = makeErrorMiddleware;
|
|
41
|
+
const extractRequest = async (req) => {
|
|
42
|
+
const allHeaders = Object.fromEntries(Object.entries(req.headers).map(([key, val]) => [key, val ?? null]));
|
|
43
|
+
const headers = {
|
|
44
|
+
...allHeaders,
|
|
45
|
+
AccessToken: req.get('Access-Token') ?? null,
|
|
46
|
+
RefreshToken: req.get('Refresh-Token') ?? null,
|
|
47
|
+
ContentType: req.get('Content-Type') ?? null,
|
|
48
|
+
Referer: req.get('referer') ?? null,
|
|
49
|
+
UserAgent: req.get('User-Agent') ?? null
|
|
50
|
+
};
|
|
51
|
+
const files = Object.fromEntries(await Promise.all(Object.entries(req.files ?? {}).map(async ([key, file]) => {
|
|
52
|
+
const fileArray = [];
|
|
53
|
+
if (file)
|
|
54
|
+
await Promise.all((Array.isArray(file) ? file : [file]).map(async (f) => fileArray.push({
|
|
55
|
+
name: f.name,
|
|
56
|
+
type: f.mimetype,
|
|
57
|
+
size: f.size,
|
|
58
|
+
isTruncated: f.truncated,
|
|
59
|
+
data: f.data,
|
|
60
|
+
duration: await (0, media_1.getMediaDuration)(f.data)
|
|
61
|
+
})));
|
|
62
|
+
return [key, fileArray];
|
|
63
|
+
})));
|
|
64
|
+
const request = req.savedReq ?? new request_1.Request({
|
|
65
|
+
body: req.body ?? {},
|
|
66
|
+
cookies: req.cookies ?? {},
|
|
67
|
+
params: req.params ?? {},
|
|
68
|
+
query: req.query ?? {},
|
|
69
|
+
method: req.method,
|
|
70
|
+
path: req.path,
|
|
71
|
+
headers, files,
|
|
72
|
+
data: {}
|
|
73
|
+
});
|
|
74
|
+
req.savedReq = request;
|
|
75
|
+
return request;
|
|
76
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CustomError } from '../../errors';
|
|
2
|
+
import { StorageFile } from '../../storage';
|
|
3
|
+
import { AuthUser, RefreshUser } from '../../utils/authUser';
|
|
4
|
+
type HeaderKeys = 'AccessToken' | 'RefreshToken' | 'Referer' | 'ContentType' | 'UserAgent';
|
|
5
|
+
export declare class Request {
|
|
6
|
+
#private;
|
|
7
|
+
readonly method: string;
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly body: Record<string, any>;
|
|
10
|
+
readonly cookies: Record<string, any>;
|
|
11
|
+
readonly rawBody: Record<string, any>;
|
|
12
|
+
readonly params: Record<string, string>;
|
|
13
|
+
readonly query: Record<string, string>;
|
|
14
|
+
readonly headers: Record<HeaderKeys | string, any>;
|
|
15
|
+
readonly files: Record<string, StorageFile[]>;
|
|
16
|
+
authUser: null | AuthUser;
|
|
17
|
+
refreshUser: null | RefreshUser;
|
|
18
|
+
pendingError: null | CustomError;
|
|
19
|
+
constructor({ body, cookies, params, query, method, path, headers, files, data }: {
|
|
20
|
+
body: Record<string, any>;
|
|
21
|
+
cookies: Record<string, any>;
|
|
22
|
+
params: Record<string, any>;
|
|
23
|
+
query: Record<string, any>;
|
|
24
|
+
headers: Record<HeaderKeys, any>;
|
|
25
|
+
files: Record<string, StorageFile[]>;
|
|
26
|
+
method: string;
|
|
27
|
+
path: string;
|
|
28
|
+
data: Record<string, any>;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
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");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var _Request_instances, _Request_parseQueryStrings;
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.Request = void 0;
|
|
10
|
+
const parseJSON = (body) => Object.fromEntries(Object.entries(body).map(([key, value]) => {
|
|
11
|
+
try {
|
|
12
|
+
return [key, JSON.parse(value)];
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return [key, value];
|
|
16
|
+
}
|
|
17
|
+
}));
|
|
18
|
+
class Request {
|
|
19
|
+
constructor({ body, cookies, params, query, method, path, headers, files, data }) {
|
|
20
|
+
_Request_instances.add(this);
|
|
21
|
+
this.authUser = null;
|
|
22
|
+
this.refreshUser = null;
|
|
23
|
+
this.pendingError = null;
|
|
24
|
+
this.method = method;
|
|
25
|
+
this.path = path;
|
|
26
|
+
this.rawBody = body;
|
|
27
|
+
this.body = parseJSON(body);
|
|
28
|
+
this.cookies = cookies;
|
|
29
|
+
this.params = params;
|
|
30
|
+
this.query = Object.fromEntries(Object.entries(query ?? {})
|
|
31
|
+
.map(([key, val]) => [key, __classPrivateFieldGet(this, _Request_instances, "m", _Request_parseQueryStrings).call(this, val)]));
|
|
32
|
+
this.headers = headers;
|
|
33
|
+
this.files = files;
|
|
34
|
+
this.authUser = data.authUser ?? null;
|
|
35
|
+
this.refreshUser = data.refreshUser ?? null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.Request = Request;
|
|
39
|
+
_Request_instances = new WeakSet(), _Request_parseQueryStrings = function _Request_parseQueryStrings(value) {
|
|
40
|
+
if (Array.isArray(value))
|
|
41
|
+
return value.map(__classPrivateFieldGet(this, _Request_instances, "m", _Request_parseQueryStrings));
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(value);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./controllers"), exports);
|
|
18
|
+
__exportStar(require("./controllers/request"), exports);
|
|
19
|
+
__exportStar(require("./middlewares"), exports);
|
|
20
|
+
__exportStar(require("./statusCodes"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const errorHandler: import("../controllers").Controller;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.errorHandler = void 0;
|
|
4
|
+
const instance_1 = require("../../instance");
|
|
5
|
+
const controllers_1 = require("../controllers");
|
|
6
|
+
const statusCodes_1 = require("../statusCodes");
|
|
7
|
+
exports.errorHandler = (0, controllers_1.makeErrorMiddleware)(async (_, err) => {
|
|
8
|
+
const error = err;
|
|
9
|
+
if (error.isCustomError) {
|
|
10
|
+
return {
|
|
11
|
+
status: error.statusCode,
|
|
12
|
+
result: error.serializedErrors
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
await instance_1.Instance.get().logger.error(err);
|
|
17
|
+
return {
|
|
18
|
+
status: statusCodes_1.StatusCodes.BadRequest,
|
|
19
|
+
result: [{ message: 'Something went wrong', data: err.message }]
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./requireAuthUser"), exports);
|
|
18
|
+
__exportStar(require("./requireRefreshUser"), exports);
|
|
19
|
+
__exportStar(require("./notFoundHandler"), exports);
|
|
20
|
+
__exportStar(require("./errorHandler"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const notFoundHandler: import("../controllers").Controller;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.notFoundHandler = void 0;
|
|
4
|
+
const controllers_1 = require("../controllers");
|
|
5
|
+
const errors_1 = require("../../errors");
|
|
6
|
+
exports.notFoundHandler = (0, controllers_1.makeMiddleware)(async (_) => {
|
|
7
|
+
throw new errors_1.NotFoundError('Route not found');
|
|
8
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const parseAuthUser: import("../controllers").Controller;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAuthUser = void 0;
|
|
4
|
+
const controllers_1 = require("../controllers");
|
|
5
|
+
const tokens_1 = require("../../utils/tokens");
|
|
6
|
+
const errors_1 = require("../../errors");
|
|
7
|
+
exports.parseAuthUser = (0, controllers_1.makeMiddleware)(async (request) => {
|
|
8
|
+
const accessToken = request.headers.AccessToken;
|
|
9
|
+
if (accessToken)
|
|
10
|
+
request.authUser = await (0, tokens_1.verifyAccessToken)(accessToken).catch((err) => {
|
|
11
|
+
if (err instanceof errors_1.CustomError)
|
|
12
|
+
request.pendingError = err;
|
|
13
|
+
return null;
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireAuthUser = void 0;
|
|
4
|
+
const errors_1 = require("../../errors");
|
|
5
|
+
const requireAuthUser = async (request) => {
|
|
6
|
+
if (request.pendingError)
|
|
7
|
+
throw request.pendingError;
|
|
8
|
+
if (!request.authUser)
|
|
9
|
+
throw new errors_1.NotAuthenticatedError();
|
|
10
|
+
};
|
|
11
|
+
exports.requireAuthUser = requireAuthUser;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireRefreshUser = void 0;
|
|
4
|
+
const errors_1 = require("../../errors");
|
|
5
|
+
const tokens_1 = require("../../utils/tokens");
|
|
6
|
+
const requireRefreshUser = async (request) => {
|
|
7
|
+
const refreshToken = request.headers.RefreshToken;
|
|
8
|
+
if (!refreshToken)
|
|
9
|
+
throw new errors_1.NotAuthorizedError();
|
|
10
|
+
request.refreshUser = await (0, tokens_1.verifyRefreshToken)(refreshToken);
|
|
11
|
+
if (!request.refreshUser)
|
|
12
|
+
throw new errors_1.NotAuthorizedError();
|
|
13
|
+
};
|
|
14
|
+
exports.requireRefreshUser = requireRefreshUser;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Enum } from '../enums/types';
|
|
2
|
+
export declare const StatusCodes: {
|
|
3
|
+
readonly Ok: 200;
|
|
4
|
+
readonly BadRequest: 400;
|
|
5
|
+
readonly NotAuthenticated: 401;
|
|
6
|
+
readonly NotAuthorized: 403;
|
|
7
|
+
readonly NotFound: 404;
|
|
8
|
+
readonly ValidationError: 422;
|
|
9
|
+
readonly TooManyRequests: 429;
|
|
10
|
+
readonly ServerError: 500;
|
|
11
|
+
readonly AccountNotVerified: 460;
|
|
12
|
+
readonly AccessTokenExpired: 461;
|
|
13
|
+
readonly RefreshTokenMisused: 462;
|
|
14
|
+
readonly InvalidToken: 463;
|
|
15
|
+
};
|
|
16
|
+
export type SupportedStatusCodes = Enum<typeof StatusCodes>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatusCodes = void 0;
|
|
4
|
+
exports.StatusCodes = {
|
|
5
|
+
Ok: 200,
|
|
6
|
+
BadRequest: 400,
|
|
7
|
+
NotAuthenticated: 401,
|
|
8
|
+
NotAuthorized: 403,
|
|
9
|
+
NotFound: 404,
|
|
10
|
+
ValidationError: 422,
|
|
11
|
+
TooManyRequests: 429,
|
|
12
|
+
ServerError: 500,
|
|
13
|
+
AccountNotVerified: 460,
|
|
14
|
+
AccessTokenExpired: 461,
|
|
15
|
+
RefreshTokenMisused: 462,
|
|
16
|
+
InvalidToken: 463
|
|
17
|
+
};
|