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
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './emails';
|
|
2
|
+
export * from './enums';
|
|
3
|
+
export { Enum } from './enums/types';
|
|
4
|
+
export * from './errors';
|
|
5
|
+
export { Events } from './events/events';
|
|
6
|
+
export * from './exit';
|
|
7
|
+
export * from './express';
|
|
8
|
+
export * from './instance';
|
|
9
|
+
export * from './listeners';
|
|
10
|
+
export * from './mongoose';
|
|
11
|
+
export * from './storage';
|
|
12
|
+
export * from './structure';
|
|
13
|
+
export * from './utils/auth';
|
|
14
|
+
export * from './utils/authUser';
|
|
15
|
+
export * from './utils/tokens';
|
|
16
|
+
export * from './utils/utils';
|
|
17
|
+
export * from './validations';
|
|
18
|
+
export declare const getEnvOrFail: (key: string) => string;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.getEnvOrFail = void 0;
|
|
21
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
22
|
+
dotenv_1.default.config();
|
|
23
|
+
__exportStar(require("./emails"), exports);
|
|
24
|
+
__exportStar(require("./enums"), exports);
|
|
25
|
+
__exportStar(require("./errors"), exports);
|
|
26
|
+
__exportStar(require("./exit"), exports);
|
|
27
|
+
__exportStar(require("./express"), exports);
|
|
28
|
+
__exportStar(require("./instance"), exports);
|
|
29
|
+
__exportStar(require("./listeners"), exports);
|
|
30
|
+
__exportStar(require("./mongoose"), exports);
|
|
31
|
+
__exportStar(require("./storage"), exports);
|
|
32
|
+
__exportStar(require("./structure"), exports);
|
|
33
|
+
__exportStar(require("./utils/auth"), exports);
|
|
34
|
+
__exportStar(require("./utils/authUser"), exports);
|
|
35
|
+
__exportStar(require("./utils/tokens"), exports);
|
|
36
|
+
__exportStar(require("./utils/utils"), exports);
|
|
37
|
+
__exportStar(require("./validations"), exports);
|
|
38
|
+
const getEnvOrFail = (key) => {
|
|
39
|
+
const value = process.env[key];
|
|
40
|
+
if (value)
|
|
41
|
+
return value;
|
|
42
|
+
console.error(`Environment variable not found: ${key}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
};
|
|
45
|
+
exports.getEnvOrFail = getEnvOrFail;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BullJob } from './bull';
|
|
2
|
+
import { Cache } from './cache/cache';
|
|
3
|
+
import { EventBus } from './events/events';
|
|
4
|
+
import { Server } from './express/app';
|
|
5
|
+
import { Logger } from './logger';
|
|
6
|
+
type Settings = {
|
|
7
|
+
isDev: boolean;
|
|
8
|
+
accessTokenKey: string;
|
|
9
|
+
accessTokenTTL: number;
|
|
10
|
+
refreshTokenKey: string;
|
|
11
|
+
refreshTokenTTL: number;
|
|
12
|
+
mongoDbURI: string;
|
|
13
|
+
rabbitURI: string;
|
|
14
|
+
redisURI: string;
|
|
15
|
+
appId: string;
|
|
16
|
+
bullQueueName: string;
|
|
17
|
+
rabbitColumnName: string;
|
|
18
|
+
maxFileUploadSizeInMb: number;
|
|
19
|
+
useRateLimit: boolean;
|
|
20
|
+
rateLimitPeriodInMs: number;
|
|
21
|
+
rateLimit: number;
|
|
22
|
+
useSlowDown: boolean;
|
|
23
|
+
slowDownPeriodInMs: number;
|
|
24
|
+
slowDownAfter: number;
|
|
25
|
+
slowDownDelayInMs: number;
|
|
26
|
+
hashSaltRounds: number;
|
|
27
|
+
paginationDefaultLimit: number;
|
|
28
|
+
};
|
|
29
|
+
export declare class Instance {
|
|
30
|
+
#private;
|
|
31
|
+
private constructor();
|
|
32
|
+
get logger(): Logger;
|
|
33
|
+
get job(): BullJob;
|
|
34
|
+
get cache(): Cache;
|
|
35
|
+
get eventBus(): EventBus;
|
|
36
|
+
get server(): Server;
|
|
37
|
+
get listener(): import("./listeners").Listener;
|
|
38
|
+
get settings(): Settings;
|
|
39
|
+
static initialize(settings: Partial<Settings>): void;
|
|
40
|
+
static get(): Instance;
|
|
41
|
+
startDbConnection(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
package/lib/instance.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
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 __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
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");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _a, _Instance_initialized, _Instance_instance, _Instance_settings, _Instance_logger, _Instance_job, _Instance_cache, _Instance_eventBus, _Instance_server;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Instance = void 0;
|
|
16
|
+
const bull_1 = require("./bull");
|
|
17
|
+
const redis_cache_1 = require("./cache/types/redis-cache");
|
|
18
|
+
const events_1 = require("./events/events");
|
|
19
|
+
const exit_1 = require("./exit");
|
|
20
|
+
const app_1 = require("./express/app");
|
|
21
|
+
const logger_1 = require("./logger");
|
|
22
|
+
const mongoose_1 = require("./mongoose");
|
|
23
|
+
const setting = {
|
|
24
|
+
isDev: false,
|
|
25
|
+
accessTokenKey: 'accessTokenKey',
|
|
26
|
+
accessTokenTTL: 60 * 60,
|
|
27
|
+
refreshTokenKey: 'refreshTokenKey',
|
|
28
|
+
refreshTokenTTL: 14 * 24 * 60 * 60,
|
|
29
|
+
mongoDbURI: '',
|
|
30
|
+
rabbitURI: '',
|
|
31
|
+
redisURI: '',
|
|
32
|
+
appId: 'appId',
|
|
33
|
+
bullQueueName: 'appTasksQueue',
|
|
34
|
+
rabbitColumnName: 'appEventsColumn',
|
|
35
|
+
maxFileUploadSizeInMb: 500,
|
|
36
|
+
useRateLimit: false,
|
|
37
|
+
rateLimitPeriodInMs: 60 * 60 * 1000,
|
|
38
|
+
rateLimit: 2500,
|
|
39
|
+
useSlowDown: false,
|
|
40
|
+
slowDownPeriodInMs: 10 * 60 * 1000,
|
|
41
|
+
slowDownAfter: 1000,
|
|
42
|
+
slowDownDelayInMs: 500,
|
|
43
|
+
hashSaltRounds: 10,
|
|
44
|
+
paginationDefaultLimit: 100
|
|
45
|
+
};
|
|
46
|
+
class Instance {
|
|
47
|
+
constructor() {
|
|
48
|
+
_Instance_logger.set(this, null);
|
|
49
|
+
_Instance_job.set(this, null);
|
|
50
|
+
_Instance_cache.set(this, null);
|
|
51
|
+
_Instance_eventBus.set(this, null);
|
|
52
|
+
_Instance_server.set(this, null);
|
|
53
|
+
}
|
|
54
|
+
get logger() {
|
|
55
|
+
if (!__classPrivateFieldGet(this, _Instance_logger, "f"))
|
|
56
|
+
__classPrivateFieldSet(this, _Instance_logger, new logger_1.ConsoleLogger(), "f");
|
|
57
|
+
return __classPrivateFieldGet(this, _Instance_logger, "f");
|
|
58
|
+
}
|
|
59
|
+
get job() {
|
|
60
|
+
if (!__classPrivateFieldGet(this, _Instance_job, "f"))
|
|
61
|
+
__classPrivateFieldSet(this, _Instance_job, new bull_1.BullJob(), "f");
|
|
62
|
+
return __classPrivateFieldGet(this, _Instance_job, "f");
|
|
63
|
+
}
|
|
64
|
+
get cache() {
|
|
65
|
+
if (!__classPrivateFieldGet(this, _Instance_cache, "f"))
|
|
66
|
+
__classPrivateFieldSet(this, _Instance_cache, new redis_cache_1.RedisCache(this.settings.redisURI), "f");
|
|
67
|
+
return __classPrivateFieldGet(this, _Instance_cache, "f");
|
|
68
|
+
}
|
|
69
|
+
get eventBus() {
|
|
70
|
+
if (!__classPrivateFieldGet(this, _Instance_eventBus, "f"))
|
|
71
|
+
__classPrivateFieldSet(this, _Instance_eventBus, new events_1.EventBus(), "f");
|
|
72
|
+
return __classPrivateFieldGet(this, _Instance_eventBus, "f");
|
|
73
|
+
}
|
|
74
|
+
get server() {
|
|
75
|
+
if (!__classPrivateFieldGet(this, _Instance_server, "f"))
|
|
76
|
+
__classPrivateFieldSet(this, _Instance_server, new app_1.Server(), "f");
|
|
77
|
+
return __classPrivateFieldGet(this, _Instance_server, "f");
|
|
78
|
+
}
|
|
79
|
+
get listener() {
|
|
80
|
+
return this.server.listener;
|
|
81
|
+
}
|
|
82
|
+
get settings() {
|
|
83
|
+
return __classPrivateFieldGet(Instance, _a, "f", _Instance_settings);
|
|
84
|
+
}
|
|
85
|
+
static initialize(settings) {
|
|
86
|
+
Object.entries(settings).forEach(([key, value]) => __classPrivateFieldGet(this, _a, "f", _Instance_settings)[key] = value);
|
|
87
|
+
__classPrivateFieldSet(Instance, _a, true, "f", _Instance_initialized);
|
|
88
|
+
}
|
|
89
|
+
static get() {
|
|
90
|
+
if (!__classPrivateFieldGet(this, _a, "f", _Instance_initialized)) {
|
|
91
|
+
console.error('Has not been initialized. Make sure initialize is called before you get an instance');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
if (!__classPrivateFieldGet(Instance, _a, "f", _Instance_instance))
|
|
95
|
+
__classPrivateFieldSet(Instance, _a, new Instance(), "f", _Instance_instance);
|
|
96
|
+
return __classPrivateFieldGet(Instance, _a, "f", _Instance_instance);
|
|
97
|
+
}
|
|
98
|
+
async startDbConnection() {
|
|
99
|
+
try {
|
|
100
|
+
await mongoose_1.mongoose.connect(this.settings.mongoDbURI);
|
|
101
|
+
await Instance.get().cache.connect();
|
|
102
|
+
await (0, mongoose_1.startAllChangeStreams)();
|
|
103
|
+
(0, exit_1.addWaitBeforeExit)(mongoose_1.mongoose.disconnect);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
await Instance.get().logger.error('MongoDb failed with error:', error);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.Instance = Instance;
|
|
112
|
+
_a = Instance, _Instance_logger = new WeakMap(), _Instance_job = new WeakMap(), _Instance_cache = new WeakMap(), _Instance_eventBus = new WeakMap(), _Instance_server = new WeakMap();
|
|
113
|
+
_Instance_initialized = { value: false };
|
|
114
|
+
_Instance_instance = { value: void 0 };
|
|
115
|
+
_Instance_settings = { value: setting };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import io from 'socket.io';
|
|
2
|
+
import { BaseEntity } from '../structure';
|
|
3
|
+
import { AuthUser } from '../utils/authUser';
|
|
4
|
+
export type OnJoinFn = (data: {
|
|
5
|
+
channel: string;
|
|
6
|
+
user: AuthUser | null;
|
|
7
|
+
}, params: Record<string, any>) => Promise<string | null>;
|
|
8
|
+
export type SocketCallers = {
|
|
9
|
+
onConnect: (userId: string, socketId: string) => Promise<void>;
|
|
10
|
+
onDisconnect: (userId: string, socketId: string) => Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
export declare class Listener {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(socket: io.Server, callers: SocketCallers);
|
|
15
|
+
created(channel: string, data: BaseEntity): Promise<void>;
|
|
16
|
+
updated(channel: string, data: BaseEntity): Promise<void>;
|
|
17
|
+
deleted(channel: string, data: BaseEntity): Promise<void>;
|
|
18
|
+
set callers(callers: SocketCallers);
|
|
19
|
+
register(channel: string, onJoin?: OnJoinFn): this;
|
|
20
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
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 _Listener_instances, _Listener_socket, _Listener_callers, _Listener_routes, _Listener_getJoinCb, _Listener_emit, _Listener_setupSocketConnection;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Listener = void 0;
|
|
16
|
+
const path_to_regexp_1 = require("path-to-regexp");
|
|
17
|
+
const express_1 = require("../express");
|
|
18
|
+
const tokens_1 = require("../utils/tokens");
|
|
19
|
+
var EmitTypes;
|
|
20
|
+
(function (EmitTypes) {
|
|
21
|
+
EmitTypes["created"] = "created";
|
|
22
|
+
EmitTypes["updated"] = "updated";
|
|
23
|
+
EmitTypes["deleted"] = "deleted";
|
|
24
|
+
})(EmitTypes || (EmitTypes = {}));
|
|
25
|
+
class Listener {
|
|
26
|
+
constructor(socket, callers) {
|
|
27
|
+
_Listener_instances.add(this);
|
|
28
|
+
_Listener_socket.set(this, void 0);
|
|
29
|
+
_Listener_callers.set(this, void 0);
|
|
30
|
+
_Listener_routes.set(this, {});
|
|
31
|
+
_Listener_setupSocketConnection.set(this, () => {
|
|
32
|
+
const event = 'connection';
|
|
33
|
+
__classPrivateFieldGet(this, _Listener_socket, "f").removeAllListeners(event);
|
|
34
|
+
__classPrivateFieldGet(this, _Listener_socket, "f").on(event, async (socket) => {
|
|
35
|
+
const socketId = socket.id;
|
|
36
|
+
let user = null;
|
|
37
|
+
if (socket.handshake.auth.token)
|
|
38
|
+
user = await (0, tokens_1.verifyAccessToken)(socket.handshake.auth.token ?? '').catch(() => null);
|
|
39
|
+
socket.on('leave', async (data, callback) => {
|
|
40
|
+
if (!data.channel)
|
|
41
|
+
return typeof (callback) === 'function' && callback({
|
|
42
|
+
code: express_1.StatusCodes.ValidationError,
|
|
43
|
+
message: 'channel is required',
|
|
44
|
+
channel: ''
|
|
45
|
+
});
|
|
46
|
+
socket.leave(data.channel);
|
|
47
|
+
return typeof (callback) === 'function' && callback({
|
|
48
|
+
code: express_1.StatusCodes.Ok,
|
|
49
|
+
message: '',
|
|
50
|
+
channel: data.channel
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
socket.on('join', async (data, callback) => {
|
|
54
|
+
if (!data.channel)
|
|
55
|
+
return typeof (callback) === 'function' && callback({
|
|
56
|
+
code: express_1.StatusCodes.ValidationError,
|
|
57
|
+
message: 'channel is required',
|
|
58
|
+
channel: ''
|
|
59
|
+
});
|
|
60
|
+
const channel = data.channel;
|
|
61
|
+
const route = __classPrivateFieldGet(this, _Listener_instances, "m", _Listener_getJoinCb).call(this, channel) ?? null;
|
|
62
|
+
if (!route)
|
|
63
|
+
return typeof (callback) === 'function' && callback({
|
|
64
|
+
code: express_1.StatusCodes.BadRequest,
|
|
65
|
+
message: 'unknown channel',
|
|
66
|
+
channel
|
|
67
|
+
});
|
|
68
|
+
const newChannel = await route.onJoin({ channel, user }, route.params);
|
|
69
|
+
if (!newChannel)
|
|
70
|
+
return typeof (callback) === 'function' && callback({
|
|
71
|
+
code: express_1.StatusCodes.NotAuthorized,
|
|
72
|
+
message: 'restricted access',
|
|
73
|
+
channel
|
|
74
|
+
});
|
|
75
|
+
socket.join(newChannel);
|
|
76
|
+
return typeof (callback) === 'function' && callback({
|
|
77
|
+
code: express_1.StatusCodes.Ok,
|
|
78
|
+
message: '',
|
|
79
|
+
channel: newChannel
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
if (user)
|
|
83
|
+
await __classPrivateFieldGet(this, _Listener_callers, "f").onConnect(user.id, socketId);
|
|
84
|
+
socket.on('disconnect', async () => {
|
|
85
|
+
if (user)
|
|
86
|
+
await __classPrivateFieldGet(this, _Listener_callers, "f").onDisconnect(user.id, socketId);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
__classPrivateFieldSet(this, _Listener_socket, socket, "f");
|
|
91
|
+
__classPrivateFieldSet(this, _Listener_callers, callers, "f");
|
|
92
|
+
__classPrivateFieldGet(this, _Listener_setupSocketConnection, "f").call(this);
|
|
93
|
+
}
|
|
94
|
+
async created(channel, data) {
|
|
95
|
+
await __classPrivateFieldGet(this, _Listener_instances, "m", _Listener_emit).call(this, channel, EmitTypes.created, data);
|
|
96
|
+
}
|
|
97
|
+
async updated(channel, data) {
|
|
98
|
+
await __classPrivateFieldGet(this, _Listener_instances, "m", _Listener_emit).call(this, channel, EmitTypes.updated, data);
|
|
99
|
+
}
|
|
100
|
+
async deleted(channel, data) {
|
|
101
|
+
await __classPrivateFieldGet(this, _Listener_instances, "m", _Listener_emit).call(this, channel, EmitTypes.deleted, data);
|
|
102
|
+
}
|
|
103
|
+
set callers(callers) {
|
|
104
|
+
__classPrivateFieldSet(this, _Listener_callers, callers, "f");
|
|
105
|
+
__classPrivateFieldGet(this, _Listener_setupSocketConnection, "f").call(this);
|
|
106
|
+
}
|
|
107
|
+
register(channel, onJoin) {
|
|
108
|
+
if (!onJoin)
|
|
109
|
+
onJoin = async ({ channel }) => channel;
|
|
110
|
+
__classPrivateFieldGet(this, _Listener_routes, "f")[channel] = onJoin;
|
|
111
|
+
__classPrivateFieldGet(this, _Listener_routes, "f")[channel + '/:id'] = onJoin;
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.Listener = Listener;
|
|
116
|
+
_Listener_socket = new WeakMap(), _Listener_callers = new WeakMap(), _Listener_routes = new WeakMap(), _Listener_setupSocketConnection = new WeakMap(), _Listener_instances = new WeakSet(), _Listener_getJoinCb = function _Listener_getJoinCb(channel) {
|
|
117
|
+
const matcher = (key) => (0, path_to_regexp_1.match)(key, { encode: encodeURI, decode: decodeURIComponent })(channel);
|
|
118
|
+
const matchedChannel = Object.keys(__classPrivateFieldGet(this, _Listener_routes, "f")).find(matcher) ?? null;
|
|
119
|
+
if (!matchedChannel)
|
|
120
|
+
return null;
|
|
121
|
+
const match = matcher(matchedChannel);
|
|
122
|
+
if (!match)
|
|
123
|
+
return null;
|
|
124
|
+
return {
|
|
125
|
+
onJoin: __classPrivateFieldGet(this, _Listener_routes, "f")[matchedChannel],
|
|
126
|
+
params: JSON.parse(JSON.stringify(match.params))
|
|
127
|
+
};
|
|
128
|
+
}, _Listener_emit = async function _Listener_emit(channel, type, data) {
|
|
129
|
+
__classPrivateFieldGet(this, _Listener_socket, "f").to(channel).emit(channel, {
|
|
130
|
+
type, data, channel
|
|
131
|
+
});
|
|
132
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './emitter';
|
|
@@ -0,0 +1,17 @@
|
|
|
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("./emitter"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare abstract class Logger {
|
|
2
|
+
abstract success(...args: any[]): Promise<void>;
|
|
3
|
+
abstract info(...args: any[]): Promise<void>;
|
|
4
|
+
abstract warn(...args: any[]): Promise<void>;
|
|
5
|
+
abstract error(...args: any[]): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare class ConsoleLogger extends Logger {
|
|
8
|
+
log: {
|
|
9
|
+
(...data: any[]): void;
|
|
10
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
11
|
+
};
|
|
12
|
+
error(...args: any[]): Promise<void>;
|
|
13
|
+
success(...args: any[]): Promise<void>;
|
|
14
|
+
info(...args: any[]): Promise<void>;
|
|
15
|
+
warn(...args: any[]): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConsoleLogger = exports.Logger = void 0;
|
|
4
|
+
class Logger {
|
|
5
|
+
}
|
|
6
|
+
exports.Logger = Logger;
|
|
7
|
+
class ConsoleLogger extends Logger {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.log = console.log;
|
|
11
|
+
}
|
|
12
|
+
async error(...args) {
|
|
13
|
+
this.log('LOG:ERROR:', ...args);
|
|
14
|
+
}
|
|
15
|
+
async success(...args) {
|
|
16
|
+
this.log('LOG:SUCCESS:', ...args);
|
|
17
|
+
}
|
|
18
|
+
async info(...args) {
|
|
19
|
+
this.log('LOG:INFO:', ...args);
|
|
20
|
+
}
|
|
21
|
+
async warn(...args) {
|
|
22
|
+
this.log('LOG:WARN:', ...args);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.ConsoleLogger = ConsoleLogger;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseEntity } from '../structure';
|
|
2
|
+
import { mongoose } from './index';
|
|
3
|
+
type DeepPartial<T> = {
|
|
4
|
+
[P in keyof T]?: DeepPartial<T[P]>;
|
|
5
|
+
};
|
|
6
|
+
export type ChangeStreamCallbacks<Model, Entity> = {
|
|
7
|
+
created?: (data: {
|
|
8
|
+
before: null;
|
|
9
|
+
after: Entity;
|
|
10
|
+
}) => Promise<void>;
|
|
11
|
+
updated?: (data: {
|
|
12
|
+
before: Entity;
|
|
13
|
+
after: Entity;
|
|
14
|
+
changes: DeepPartial<Model>;
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
deleted?: (data: {
|
|
17
|
+
before: Entity;
|
|
18
|
+
after: null;
|
|
19
|
+
}) => Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
export declare const generateChangeStreams: <Model extends {
|
|
22
|
+
_id: string;
|
|
23
|
+
}, Entity extends BaseEntity>(collection: mongoose.Model<any, {}, {}, {}, any>, callbacks: ChangeStreamCallbacks<Model, Entity>, mapper: (model: Model | null) => Entity | null) => Promise<void>;
|
|
24
|
+
export declare const startAllChangeStreams: () => Promise<void>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startAllChangeStreams = exports.generateChangeStreams = void 0;
|
|
4
|
+
const exit_1 = require("../exit");
|
|
5
|
+
const instance_1 = require("../instance");
|
|
6
|
+
const collections = [];
|
|
7
|
+
const startChangeStream = async (collection, callbacks, mapper, skipResume = false) => {
|
|
8
|
+
const dbName = collection.collection.collectionName;
|
|
9
|
+
const cloneName = dbName + '_streams_clone';
|
|
10
|
+
const getClone = () => collection.collection.conn.db.collection(cloneName);
|
|
11
|
+
const getStreamTokens = () => collection.collection.conn.db.collection('stream-tokens');
|
|
12
|
+
const res = await getStreamTokens().findOne({ _id: dbName });
|
|
13
|
+
const resumeToken = skipResume ? undefined : res?.resumeToken;
|
|
14
|
+
const changeStream = collection
|
|
15
|
+
.watch([], { fullDocument: 'updateLookup', startAfter: resumeToken })
|
|
16
|
+
.on('change', async (data) => {
|
|
17
|
+
const streamId = data._id._data;
|
|
18
|
+
const cacheName = `streams-${streamId}`;
|
|
19
|
+
const cached = await instance_1.Instance.get().cache.setInTransaction(cacheName, streamId, 15);
|
|
20
|
+
if (cached[0])
|
|
21
|
+
return;
|
|
22
|
+
(0, exit_1.addWaitBeforeExit)((async () => {
|
|
23
|
+
await getStreamTokens().findOneAndUpdate({ _id: dbName }, { $set: { resumeToken: data._id } }, { upsert: true });
|
|
24
|
+
if (data.operationType === 'insert') {
|
|
25
|
+
const _id = data.documentKey._id;
|
|
26
|
+
const after = data.fullDocument;
|
|
27
|
+
const { value } = await getClone().findOneAndUpdate({ _id }, { $set: { ...after, _id } }, {
|
|
28
|
+
upsert: true,
|
|
29
|
+
returnDocument: 'after'
|
|
30
|
+
});
|
|
31
|
+
if (value)
|
|
32
|
+
callbacks.created?.({
|
|
33
|
+
before: null,
|
|
34
|
+
after: mapper(new collection(after))
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (data.operationType === 'delete') {
|
|
38
|
+
const _id = data.documentKey._id;
|
|
39
|
+
const { value: before } = await getClone().findOneAndDelete({ _id });
|
|
40
|
+
if (before)
|
|
41
|
+
callbacks.deleted?.({
|
|
42
|
+
before: mapper(new collection(before)),
|
|
43
|
+
after: null
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (data.operationType === 'update') {
|
|
47
|
+
const _id = data.documentKey._id;
|
|
48
|
+
const after = data.fullDocument;
|
|
49
|
+
const { value: before } = await getClone().findOneAndUpdate({ _id }, { $set: after }, { returnDocument: 'before' });
|
|
50
|
+
const { updatedFields = {}, removedFields = [], truncatedArrays = [] } = data.updateDescription ?? {};
|
|
51
|
+
const changed = removedFields
|
|
52
|
+
.map((f) => f.toString())
|
|
53
|
+
.concat(truncatedArrays.map((a) => a.field))
|
|
54
|
+
.concat(Object.keys(updatedFields));
|
|
55
|
+
const changes = getObjectsFromKeys(changed);
|
|
56
|
+
if (before)
|
|
57
|
+
callbacks.updated?.({
|
|
58
|
+
before: mapper(new collection(before)),
|
|
59
|
+
after: mapper(new collection(after)),
|
|
60
|
+
changes
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
})());
|
|
64
|
+
})
|
|
65
|
+
.on('error', async (err) => {
|
|
66
|
+
await instance_1.Instance.get().logger.error(`Change Stream errored out: ${dbName}: ${err.message}`);
|
|
67
|
+
changeStream.close();
|
|
68
|
+
return startChangeStream(collection, callbacks, mapper, true);
|
|
69
|
+
});
|
|
70
|
+
(0, exit_1.addWaitBeforeExit)(() => changeStream.close());
|
|
71
|
+
await instance_1.Instance.get().logger.info(`${dbName} changestream started`);
|
|
72
|
+
};
|
|
73
|
+
const generateChangeStreams = async (collection, callbacks, mapper) => {
|
|
74
|
+
collections.push({ collection, callbacks, mapper });
|
|
75
|
+
};
|
|
76
|
+
exports.generateChangeStreams = generateChangeStreams;
|
|
77
|
+
const startAllChangeStreams = async () => {
|
|
78
|
+
await Promise.all(collections.map(async ({ collection, callbacks, mapper }) => {
|
|
79
|
+
await startChangeStream(collection, callbacks, mapper);
|
|
80
|
+
}));
|
|
81
|
+
};
|
|
82
|
+
exports.startAllChangeStreams = startAllChangeStreams;
|
|
83
|
+
const deepMerge = (objFrom, objTo) => Object.keys(objFrom)
|
|
84
|
+
.reduce((merged, key) => {
|
|
85
|
+
merged[key] = objFrom[key] instanceof Object && !Array.isArray(objFrom[key])
|
|
86
|
+
? deepMerge(objFrom[key], merged[key] ?? {})
|
|
87
|
+
: objFrom[key];
|
|
88
|
+
return merged;
|
|
89
|
+
}, { ...objTo });
|
|
90
|
+
const formObject = (key) => key.split('.').reverse().reduce((acc, value) => {
|
|
91
|
+
return { [value]: acc ?? true };
|
|
92
|
+
}, null);
|
|
93
|
+
const getObjectsFromKeys = (keys) => keys.map(formObject).reduce(deepMerge, {});
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.mongoose = void 0;
|
|
21
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
22
|
+
exports.mongoose = mongoose_1.default;
|
|
23
|
+
__exportStar(require("./query"), exports);
|
|
24
|
+
__exportStar(require("./changeStreams"), exports);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mongoose } from './index';
|
|
2
|
+
export declare enum QueryKeys {
|
|
3
|
+
and = "and",
|
|
4
|
+
or = "or"
|
|
5
|
+
}
|
|
6
|
+
export declare enum Conditions {
|
|
7
|
+
lt = "lt",
|
|
8
|
+
lte = "lte",
|
|
9
|
+
gt = "gt",
|
|
10
|
+
gte = "gte",
|
|
11
|
+
eq = "eq",
|
|
12
|
+
ne = "ne",
|
|
13
|
+
in = "in",
|
|
14
|
+
nin = "nin",
|
|
15
|
+
exists = "exists"
|
|
16
|
+
}
|
|
17
|
+
type Where = {
|
|
18
|
+
field: string;
|
|
19
|
+
value: any;
|
|
20
|
+
condition?: Conditions;
|
|
21
|
+
};
|
|
22
|
+
type WhereBlock = {
|
|
23
|
+
condition: QueryKeys;
|
|
24
|
+
value: (Where | WhereBlock)[];
|
|
25
|
+
};
|
|
26
|
+
type WhereClause = Where | WhereBlock;
|
|
27
|
+
export type QueryParams = {
|
|
28
|
+
where?: WhereClause[];
|
|
29
|
+
auth?: WhereClause[];
|
|
30
|
+
whereType?: QueryKeys;
|
|
31
|
+
authType?: QueryKeys;
|
|
32
|
+
sort?: [{
|
|
33
|
+
field: string;
|
|
34
|
+
desc?: boolean;
|
|
35
|
+
}];
|
|
36
|
+
limit?: number;
|
|
37
|
+
all?: boolean;
|
|
38
|
+
page?: number;
|
|
39
|
+
search?: {
|
|
40
|
+
value: string;
|
|
41
|
+
fields: string[];
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export declare const parseQueryParams: <Model>(collection: mongoose.Model<any, {}, {}, {}, any>, params: QueryParams) => Promise<QueryResults<Model>>;
|
|
45
|
+
export type QueryResults<Model> = {
|
|
46
|
+
pages: {
|
|
47
|
+
start: number;
|
|
48
|
+
last: number;
|
|
49
|
+
previous: number | null;
|
|
50
|
+
next: number | null;
|
|
51
|
+
current: number;
|
|
52
|
+
};
|
|
53
|
+
docs: {
|
|
54
|
+
limit: number;
|
|
55
|
+
total: number;
|
|
56
|
+
count: number;
|
|
57
|
+
};
|
|
58
|
+
results: Model[];
|
|
59
|
+
};
|
|
60
|
+
export {};
|