@akanjs/server 0.0.99 → 0.0.101
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/index.js +21 -1
- package/index.mjs +1 -0
- package/package.json +4 -4
- package/src/boot.js +94 -84
- package/src/boot.mjs +190 -0
- package/src/controller.js +63 -70
- package/src/controller.mjs +109 -0
- package/src/gql.js +64 -35
- package/src/gql.mjs +123 -0
- package/src/index.js +39 -10
- package/src/index.mjs +10 -0
- package/src/module.js +103 -77
- package/src/module.mjs +229 -0
- package/src/processor.js +41 -22
- package/src/processor.mjs +73 -0
- package/src/resolver.js +76 -49
- package/src/resolver.mjs +118 -0
- package/src/schema.js +78 -54
- package/src/{schema.cjs → schema.mjs} +54 -78
- package/src/searchDaemon.js +45 -29
- package/src/{searchDaemon.cjs → searchDaemon.mjs} +29 -45
- package/src/types.js +15 -0
- package/src/types.mjs +0 -0
- package/src/websocket.js +55 -33
- package/src/websocket.mjs +124 -0
- package/index.cjs +0 -21
- package/src/boot.cjs +0 -200
- package/src/controller.cjs +0 -102
- package/src/gql.cjs +0 -152
- package/src/index.cjs +0 -39
- package/src/module.cjs +0 -255
- package/src/processor.cjs +0 -92
- package/src/resolver.cjs +0 -145
- package/src/types.cjs +0 -15
- package/src/websocket.cjs +0 -146
package/index.js
CHANGED
|
@@ -1 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var server_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(server_exports);
|
|
17
|
+
__reExport(server_exports, require("./src"), module.exports);
|
|
18
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
19
|
+
0 && (module.exports = {
|
|
20
|
+
...require("./src")
|
|
21
|
+
});
|
package/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./src";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akanjs/server",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"type": "
|
|
3
|
+
"version": "0.0.101",
|
|
4
|
+
"type": "commonjs",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
},
|
|
42
42
|
"exports": {
|
|
43
43
|
".": {
|
|
44
|
-
"require": "./index.
|
|
45
|
-
"import": "./index.
|
|
44
|
+
"require": "./index.js",
|
|
45
|
+
"import": "./index.mjs"
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"esbuild": {
|
package/src/boot.js
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
1
2
|
var __defProp = Object.defineProperty;
|
|
2
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
3
28
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
29
|
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
30
|
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
@@ -9,74 +34,58 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
9
34
|
__defProp(target, key, result);
|
|
10
35
|
return result;
|
|
11
36
|
};
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
RequestMethod
|
|
39
|
-
} from "@nestjs/common";
|
|
40
|
-
import { NestFactory } from "@nestjs/core";
|
|
41
|
-
import { GraphQLModule } from "@nestjs/graphql";
|
|
42
|
-
import { MongooseModule } from "@nestjs/mongoose";
|
|
43
|
-
import { ScheduleModule } from "@nestjs/schedule";
|
|
44
|
-
import { json, urlencoded } from "body-parser";
|
|
45
|
-
import cookieParser from "cookie-parser";
|
|
46
|
-
import dgram from "dgram";
|
|
47
|
-
import events from "events";
|
|
48
|
-
import { graphqlUploadExpress } from "graphql-upload";
|
|
49
|
-
import { MeiliSearch } from "meilisearch";
|
|
50
|
-
import { createClient } from "redis";
|
|
51
|
-
import { DateScalar } from "./gql";
|
|
52
|
-
import { useGlobals } from "./module";
|
|
53
|
-
import { SearchDaemonModule } from "./searchDaemon";
|
|
37
|
+
var boot_exports = {};
|
|
38
|
+
__export(boot_exports, {
|
|
39
|
+
createNestApp: () => createNestApp
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(boot_exports);
|
|
42
|
+
var import_base = require("@akanjs/base");
|
|
43
|
+
var import_common = require("@akanjs/common");
|
|
44
|
+
var import_nest = require("@akanjs/nest");
|
|
45
|
+
var import_signal = require("@akanjs/signal");
|
|
46
|
+
var import_apollo = require("@nestjs/apollo");
|
|
47
|
+
var import_bull = require("@nestjs/bull");
|
|
48
|
+
var import_common2 = require("@nestjs/common");
|
|
49
|
+
var import_core = require("@nestjs/core");
|
|
50
|
+
var import_graphql = require("@nestjs/graphql");
|
|
51
|
+
var import_mongoose = require("@nestjs/mongoose");
|
|
52
|
+
var import_schedule = require("@nestjs/schedule");
|
|
53
|
+
var import_body_parser = require("body-parser");
|
|
54
|
+
var import_cookie_parser = __toESM(require("cookie-parser"));
|
|
55
|
+
var import_dgram = __toESM(require("dgram"));
|
|
56
|
+
var import_events = __toESM(require("events"));
|
|
57
|
+
var import_graphql_upload = require("graphql-upload");
|
|
58
|
+
var import_meilisearch = require("meilisearch");
|
|
59
|
+
var import_redis = require("redis");
|
|
60
|
+
var import_gql = require("./gql");
|
|
61
|
+
var import_module = require("./module");
|
|
62
|
+
var import_searchDaemon = require("./searchDaemon");
|
|
54
63
|
const createNestApp = async ({ registerModules, serverMode = "federation", env, log = true }) => {
|
|
55
|
-
const backendLogger = new Logger("Backend");
|
|
64
|
+
const backendLogger = new import_common.Logger("Backend");
|
|
56
65
|
if (log)
|
|
57
|
-
backendLogger.rawLog(logo);
|
|
58
|
-
const jwtSecret = generateJwtSecret(env.appName, env.environment);
|
|
66
|
+
backendLogger.rawLog(import_base.logo);
|
|
67
|
+
const jwtSecret = (0, import_nest.generateJwtSecret)(env.appName, env.environment);
|
|
59
68
|
const [redisUri, mongoUri, meiliUri] = await Promise.all([
|
|
60
|
-
env.redisUri ?? generateRedisUri({ ...env, ...env.redis?.sshOptions ? { sshOptions: env.redis.sshOptions } : {} }),
|
|
61
|
-
env.mongoUri ?? generateMongoUri({
|
|
69
|
+
env.redisUri ?? (0, import_nest.generateRedisUri)({ ...env, ...env.redis?.sshOptions ? { sshOptions: env.redis.sshOptions } : {} }),
|
|
70
|
+
env.mongoUri ?? (0, import_nest.generateMongoUri)({
|
|
62
71
|
...env,
|
|
63
72
|
...env.mongo.username ? { username: env.mongo.username } : {},
|
|
64
73
|
password: env.mongo.password,
|
|
65
74
|
...env.mongo.sshOptions ? { sshOptions: env.mongo.sshOptions } : {}
|
|
66
75
|
}),
|
|
67
|
-
env.meiliUri ?? generateMeiliUri(env)
|
|
76
|
+
env.meiliUri ?? (0, import_nest.generateMeiliUri)(env)
|
|
68
77
|
]);
|
|
69
78
|
if (env.operationMode === "local") {
|
|
70
79
|
backendLogger.verbose(`connect to redis: ${redisUri}`);
|
|
71
80
|
backendLogger.verbose(`connect to mongo: ${mongoUri}`);
|
|
72
81
|
backendLogger.verbose(`connect to meili: ${meiliUri}`);
|
|
73
82
|
}
|
|
74
|
-
initMongoDB({ logging: baseEnv.environment !== "main", sendReport: false });
|
|
75
|
-
|
|
83
|
+
(0, import_nest.initMongoDB)({ logging: import_base.baseEnv.environment !== "main", sendReport: false });
|
|
84
|
+
import_events.default.EventEmitter.defaultMaxListeners = 1e3;
|
|
76
85
|
let AuthMiddleWare = class {
|
|
77
86
|
use(req, res, next) {
|
|
78
87
|
const requestHeader = req;
|
|
79
|
-
requestHeader.account = verifyToken(
|
|
88
|
+
requestHeader.account = (0, import_nest.verifyToken)(
|
|
80
89
|
jwtSecret,
|
|
81
90
|
requestHeader.headers.authorization ?? (requestHeader.cookies?.jwt ? `Bearer ${requestHeader.cookies.jwt}` : void 0)
|
|
82
91
|
);
|
|
@@ -85,19 +94,19 @@ const createNestApp = async ({ registerModules, serverMode = "federation", env,
|
|
|
85
94
|
}
|
|
86
95
|
};
|
|
87
96
|
AuthMiddleWare = __decorateClass([
|
|
88
|
-
Injectable()
|
|
97
|
+
(0, import_common2.Injectable)()
|
|
89
98
|
], AuthMiddleWare);
|
|
90
|
-
const redisClient = await createClient({ url: redisUri }).connect();
|
|
99
|
+
const redisClient = await (0, import_redis.createClient)({ url: redisUri }).connect();
|
|
91
100
|
let SubDatabaseModule = class {
|
|
92
101
|
};
|
|
93
102
|
SubDatabaseModule = __decorateClass([
|
|
94
|
-
Global(),
|
|
95
|
-
Module({
|
|
103
|
+
(0, import_common2.Global)(),
|
|
104
|
+
(0, import_common2.Module)({
|
|
96
105
|
providers: [
|
|
97
106
|
{ provide: "REDIS_CLIENT", useValue: redisClient },
|
|
98
107
|
{
|
|
99
108
|
provide: "MEILI_CLIENT",
|
|
100
|
-
useFactory: () => new MeiliSearch({ host: meiliUri, apiKey: generateMeiliKey(env) })
|
|
109
|
+
useFactory: () => new import_meilisearch.MeiliSearch({ host: meiliUri, apiKey: (0, import_nest.generateMeiliKey)(env) })
|
|
101
110
|
}
|
|
102
111
|
],
|
|
103
112
|
exports: ["REDIS_CLIENT", "MEILI_CLIENT"]
|
|
@@ -105,46 +114,46 @@ const createNestApp = async ({ registerModules, serverMode = "federation", env,
|
|
|
105
114
|
], SubDatabaseModule);
|
|
106
115
|
let AppModule = class {
|
|
107
116
|
configure(consumer) {
|
|
108
|
-
consumer.apply(AuthMiddleWare).forRoutes({ path: "*", method: RequestMethod.ALL });
|
|
117
|
+
consumer.apply(AuthMiddleWare).forRoutes({ path: "*", method: import_common2.RequestMethod.ALL });
|
|
109
118
|
}
|
|
110
119
|
};
|
|
111
120
|
AppModule = __decorateClass([
|
|
112
|
-
Module({
|
|
121
|
+
(0, import_common2.Module)({
|
|
113
122
|
imports: [
|
|
114
|
-
BullModule.forRoot({ redis: redisUri }),
|
|
115
|
-
ScheduleModule.forRoot(),
|
|
116
|
-
GraphQLModule.forRootAsync({
|
|
123
|
+
import_bull.BullModule.forRoot({ redis: redisUri }),
|
|
124
|
+
import_schedule.ScheduleModule.forRoot(),
|
|
125
|
+
import_graphql.GraphQLModule.forRootAsync({
|
|
117
126
|
imports: [],
|
|
118
127
|
useFactory: () => ({
|
|
119
128
|
useGlobalPrefix: true,
|
|
120
129
|
autoSchemaFile: true,
|
|
121
130
|
sortSchema: true,
|
|
122
|
-
playground: baseEnv.environment !== "main",
|
|
123
|
-
introspection: baseEnv.environment !== "main",
|
|
131
|
+
playground: import_base.baseEnv.environment !== "main",
|
|
132
|
+
introspection: import_base.baseEnv.environment !== "main",
|
|
124
133
|
uploads: false,
|
|
125
134
|
debug: false
|
|
126
135
|
}),
|
|
127
|
-
driver: ApolloDriver
|
|
136
|
+
driver: import_apollo.ApolloDriver
|
|
128
137
|
}),
|
|
129
|
-
MongooseModule.forRootAsync({
|
|
130
|
-
useFactory: () => ({ uri: mongoUri, autoIndex: baseEnv.environment !== "main" })
|
|
138
|
+
import_mongoose.MongooseModule.forRootAsync({
|
|
139
|
+
useFactory: () => ({ uri: mongoUri, autoIndex: import_base.baseEnv.environment !== "main" })
|
|
131
140
|
}),
|
|
132
141
|
SubDatabaseModule,
|
|
133
|
-
useGlobals({
|
|
134
|
-
injects: { SearchClient, DatabaseClient, CacheClient }
|
|
142
|
+
(0, import_module.useGlobals)({
|
|
143
|
+
injects: { SearchClient: import_nest.SearchClient, DatabaseClient: import_nest.DatabaseClient, CacheClient: import_nest.CacheClient }
|
|
135
144
|
}),
|
|
136
|
-
...["batch", "all"].includes(serverMode) && baseEnv.operationMode !== "edge" ? [SearchDaemonModule] : [],
|
|
145
|
+
...["batch", "all"].includes(serverMode) && import_base.baseEnv.operationMode !== "edge" ? [import_searchDaemon.SearchDaemonModule] : [],
|
|
137
146
|
...registerModules(env).filter((m) => !!m)
|
|
138
147
|
],
|
|
139
|
-
providers: [DateScalar]
|
|
148
|
+
providers: [import_gql.DateScalar]
|
|
140
149
|
})
|
|
141
150
|
], AppModule);
|
|
142
|
-
const app = await NestFactory.create(AppModule, { logger: backendLogger });
|
|
143
|
-
const redisIoAdapter = new RedisIoAdapter(app, { jwtSecret });
|
|
151
|
+
const app = await import_core.NestFactory.create(AppModule, { logger: backendLogger });
|
|
152
|
+
const redisIoAdapter = new import_nest.RedisIoAdapter(app, { jwtSecret });
|
|
144
153
|
await redisIoAdapter.connectToRedis(redisUri);
|
|
145
154
|
app.enableShutdownHooks();
|
|
146
|
-
const udp =
|
|
147
|
-
client.setUdp(udp);
|
|
155
|
+
const udp = import_dgram.default.createSocket("udp4");
|
|
156
|
+
import_signal.client.setUdp(udp);
|
|
148
157
|
if (["federation", "all"].includes(serverMode)) {
|
|
149
158
|
app.setGlobalPrefix(process.env.GLOBAL_PREFIX ?? "/backend");
|
|
150
159
|
app.enableCors({
|
|
@@ -156,14 +165,14 @@ const createNestApp = async ({ registerModules, serverMode = "federation", env,
|
|
|
156
165
|
});
|
|
157
166
|
if (env.operationMode !== "local" && process.env.USE_REDIS_IO_ADAPTER !== "false")
|
|
158
167
|
app.useWebSocketAdapter(redisIoAdapter);
|
|
159
|
-
app.use(json({ limit: "100mb" }));
|
|
160
|
-
app.use(urlencoded({ limit: "100mb", extended: true }));
|
|
161
|
-
app.use("/backend/graphql", graphqlUploadExpress());
|
|
162
|
-
app.use(
|
|
163
|
-
app.useGlobalInterceptors(new LoggingInterceptor());
|
|
164
|
-
app.useGlobalInterceptors(new TimeoutInterceptor());
|
|
165
|
-
app.useGlobalInterceptors(new CacheInterceptor(redisClient));
|
|
166
|
-
app.useGlobalFilters(new AllExceptionsFilter());
|
|
168
|
+
app.use((0, import_body_parser.json)({ limit: "100mb" }));
|
|
169
|
+
app.use((0, import_body_parser.urlencoded)({ limit: "100mb", extended: true }));
|
|
170
|
+
app.use("/backend/graphql", (0, import_graphql_upload.graphqlUploadExpress)());
|
|
171
|
+
app.use((0, import_cookie_parser.default)());
|
|
172
|
+
app.useGlobalInterceptors(new import_nest.LoggingInterceptor());
|
|
173
|
+
app.useGlobalInterceptors(new import_nest.TimeoutInterceptor());
|
|
174
|
+
app.useGlobalInterceptors(new import_nest.CacheInterceptor(redisClient));
|
|
175
|
+
app.useGlobalFilters(new import_nest.AllExceptionsFilter());
|
|
167
176
|
await app.listen(process.env.PORT ?? env.port ?? 8080);
|
|
168
177
|
backendLogger.log(`\u{1F680} Server is running on: ${await app.getUrl()}`);
|
|
169
178
|
} else {
|
|
@@ -185,6 +194,7 @@ const createNestApp = async ({ registerModules, serverMode = "federation", env,
|
|
|
185
194
|
}
|
|
186
195
|
};
|
|
187
196
|
};
|
|
188
|
-
export
|
|
197
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
198
|
+
0 && (module.exports = {
|
|
189
199
|
createNestApp
|
|
190
|
-
};
|
|
200
|
+
});
|
package/src/boot.mjs
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result)
|
|
9
|
+
__defProp(target, key, result);
|
|
10
|
+
return result;
|
|
11
|
+
};
|
|
12
|
+
import { baseEnv, logo } from "@akanjs/base";
|
|
13
|
+
import { Logger } from "@akanjs/common";
|
|
14
|
+
import {
|
|
15
|
+
AllExceptionsFilter,
|
|
16
|
+
CacheClient,
|
|
17
|
+
CacheInterceptor,
|
|
18
|
+
DatabaseClient,
|
|
19
|
+
generateJwtSecret,
|
|
20
|
+
generateMeiliKey,
|
|
21
|
+
generateMeiliUri,
|
|
22
|
+
generateMongoUri,
|
|
23
|
+
generateRedisUri,
|
|
24
|
+
initMongoDB,
|
|
25
|
+
LoggingInterceptor,
|
|
26
|
+
RedisIoAdapter,
|
|
27
|
+
SearchClient,
|
|
28
|
+
TimeoutInterceptor,
|
|
29
|
+
verifyToken
|
|
30
|
+
} from "@akanjs/nest";
|
|
31
|
+
import { client } from "@akanjs/signal";
|
|
32
|
+
import { ApolloDriver } from "@nestjs/apollo";
|
|
33
|
+
import { BullModule } from "@nestjs/bull";
|
|
34
|
+
import {
|
|
35
|
+
Global,
|
|
36
|
+
Injectable,
|
|
37
|
+
Module,
|
|
38
|
+
RequestMethod
|
|
39
|
+
} from "@nestjs/common";
|
|
40
|
+
import { NestFactory } from "@nestjs/core";
|
|
41
|
+
import { GraphQLModule } from "@nestjs/graphql";
|
|
42
|
+
import { MongooseModule } from "@nestjs/mongoose";
|
|
43
|
+
import { ScheduleModule } from "@nestjs/schedule";
|
|
44
|
+
import { json, urlencoded } from "body-parser";
|
|
45
|
+
import cookieParser from "cookie-parser";
|
|
46
|
+
import dgram from "dgram";
|
|
47
|
+
import events from "events";
|
|
48
|
+
import { graphqlUploadExpress } from "graphql-upload";
|
|
49
|
+
import { MeiliSearch } from "meilisearch";
|
|
50
|
+
import { createClient } from "redis";
|
|
51
|
+
import { DateScalar } from "./gql";
|
|
52
|
+
import { useGlobals } from "./module";
|
|
53
|
+
import { SearchDaemonModule } from "./searchDaemon";
|
|
54
|
+
const createNestApp = async ({ registerModules, serverMode = "federation", env, log = true }) => {
|
|
55
|
+
const backendLogger = new Logger("Backend");
|
|
56
|
+
if (log)
|
|
57
|
+
backendLogger.rawLog(logo);
|
|
58
|
+
const jwtSecret = generateJwtSecret(env.appName, env.environment);
|
|
59
|
+
const [redisUri, mongoUri, meiliUri] = await Promise.all([
|
|
60
|
+
env.redisUri ?? generateRedisUri({ ...env, ...env.redis?.sshOptions ? { sshOptions: env.redis.sshOptions } : {} }),
|
|
61
|
+
env.mongoUri ?? generateMongoUri({
|
|
62
|
+
...env,
|
|
63
|
+
...env.mongo.username ? { username: env.mongo.username } : {},
|
|
64
|
+
password: env.mongo.password,
|
|
65
|
+
...env.mongo.sshOptions ? { sshOptions: env.mongo.sshOptions } : {}
|
|
66
|
+
}),
|
|
67
|
+
env.meiliUri ?? generateMeiliUri(env)
|
|
68
|
+
]);
|
|
69
|
+
if (env.operationMode === "local") {
|
|
70
|
+
backendLogger.verbose(`connect to redis: ${redisUri}`);
|
|
71
|
+
backendLogger.verbose(`connect to mongo: ${mongoUri}`);
|
|
72
|
+
backendLogger.verbose(`connect to meili: ${meiliUri}`);
|
|
73
|
+
}
|
|
74
|
+
initMongoDB({ logging: baseEnv.environment !== "main", sendReport: false });
|
|
75
|
+
events.EventEmitter.defaultMaxListeners = 1e3;
|
|
76
|
+
let AuthMiddleWare = class {
|
|
77
|
+
use(req, res, next) {
|
|
78
|
+
const requestHeader = req;
|
|
79
|
+
requestHeader.account = verifyToken(
|
|
80
|
+
jwtSecret,
|
|
81
|
+
requestHeader.headers.authorization ?? (requestHeader.cookies?.jwt ? `Bearer ${requestHeader.cookies.jwt}` : void 0)
|
|
82
|
+
);
|
|
83
|
+
requestHeader.userAgent = requestHeader["user-agent"];
|
|
84
|
+
next();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
AuthMiddleWare = __decorateClass([
|
|
88
|
+
Injectable()
|
|
89
|
+
], AuthMiddleWare);
|
|
90
|
+
const redisClient = await createClient({ url: redisUri }).connect();
|
|
91
|
+
let SubDatabaseModule = class {
|
|
92
|
+
};
|
|
93
|
+
SubDatabaseModule = __decorateClass([
|
|
94
|
+
Global(),
|
|
95
|
+
Module({
|
|
96
|
+
providers: [
|
|
97
|
+
{ provide: "REDIS_CLIENT", useValue: redisClient },
|
|
98
|
+
{
|
|
99
|
+
provide: "MEILI_CLIENT",
|
|
100
|
+
useFactory: () => new MeiliSearch({ host: meiliUri, apiKey: generateMeiliKey(env) })
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
exports: ["REDIS_CLIENT", "MEILI_CLIENT"]
|
|
104
|
+
})
|
|
105
|
+
], SubDatabaseModule);
|
|
106
|
+
let AppModule = class {
|
|
107
|
+
configure(consumer) {
|
|
108
|
+
consumer.apply(AuthMiddleWare).forRoutes({ path: "*", method: RequestMethod.ALL });
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
AppModule = __decorateClass([
|
|
112
|
+
Module({
|
|
113
|
+
imports: [
|
|
114
|
+
BullModule.forRoot({ redis: redisUri }),
|
|
115
|
+
ScheduleModule.forRoot(),
|
|
116
|
+
GraphQLModule.forRootAsync({
|
|
117
|
+
imports: [],
|
|
118
|
+
useFactory: () => ({
|
|
119
|
+
useGlobalPrefix: true,
|
|
120
|
+
autoSchemaFile: true,
|
|
121
|
+
sortSchema: true,
|
|
122
|
+
playground: baseEnv.environment !== "main",
|
|
123
|
+
introspection: baseEnv.environment !== "main",
|
|
124
|
+
uploads: false,
|
|
125
|
+
debug: false
|
|
126
|
+
}),
|
|
127
|
+
driver: ApolloDriver
|
|
128
|
+
}),
|
|
129
|
+
MongooseModule.forRootAsync({
|
|
130
|
+
useFactory: () => ({ uri: mongoUri, autoIndex: baseEnv.environment !== "main" })
|
|
131
|
+
}),
|
|
132
|
+
SubDatabaseModule,
|
|
133
|
+
useGlobals({
|
|
134
|
+
injects: { SearchClient, DatabaseClient, CacheClient }
|
|
135
|
+
}),
|
|
136
|
+
...["batch", "all"].includes(serverMode) && baseEnv.operationMode !== "edge" ? [SearchDaemonModule] : [],
|
|
137
|
+
...registerModules(env).filter((m) => !!m)
|
|
138
|
+
],
|
|
139
|
+
providers: [DateScalar]
|
|
140
|
+
})
|
|
141
|
+
], AppModule);
|
|
142
|
+
const app = await NestFactory.create(AppModule, { logger: backendLogger });
|
|
143
|
+
const redisIoAdapter = new RedisIoAdapter(app, { jwtSecret });
|
|
144
|
+
await redisIoAdapter.connectToRedis(redisUri);
|
|
145
|
+
app.enableShutdownHooks();
|
|
146
|
+
const udp = dgram.createSocket("udp4");
|
|
147
|
+
client.setUdp(udp);
|
|
148
|
+
if (["federation", "all"].includes(serverMode)) {
|
|
149
|
+
app.setGlobalPrefix(process.env.GLOBAL_PREFIX ?? "/backend");
|
|
150
|
+
app.enableCors({
|
|
151
|
+
origin: "*",
|
|
152
|
+
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
|
|
153
|
+
preflightContinue: false,
|
|
154
|
+
optionsSuccessStatus: 204,
|
|
155
|
+
allowedHeaders: "DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,apollo-require-preflight"
|
|
156
|
+
});
|
|
157
|
+
if (env.operationMode !== "local" && process.env.USE_REDIS_IO_ADAPTER !== "false")
|
|
158
|
+
app.useWebSocketAdapter(redisIoAdapter);
|
|
159
|
+
app.use(json({ limit: "100mb" }));
|
|
160
|
+
app.use(urlencoded({ limit: "100mb", extended: true }));
|
|
161
|
+
app.use("/backend/graphql", graphqlUploadExpress());
|
|
162
|
+
app.use(cookieParser());
|
|
163
|
+
app.useGlobalInterceptors(new LoggingInterceptor());
|
|
164
|
+
app.useGlobalInterceptors(new TimeoutInterceptor());
|
|
165
|
+
app.useGlobalInterceptors(new CacheInterceptor(redisClient));
|
|
166
|
+
app.useGlobalFilters(new AllExceptionsFilter());
|
|
167
|
+
await app.listen(process.env.PORT ?? env.port ?? 8080);
|
|
168
|
+
backendLogger.log(`\u{1F680} Server is running on: ${await app.getUrl()}`);
|
|
169
|
+
} else {
|
|
170
|
+
await app.init();
|
|
171
|
+
backendLogger.log(`\u{1F680} Batch Server is running`);
|
|
172
|
+
}
|
|
173
|
+
if (module.hot) {
|
|
174
|
+
module.hot.accept();
|
|
175
|
+
module.hot.dispose(() => {
|
|
176
|
+
void app.close();
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
nestApp: app,
|
|
181
|
+
close: async () => {
|
|
182
|
+
await app.close();
|
|
183
|
+
await redisIoAdapter.destroy();
|
|
184
|
+
await redisClient.quit();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
export {
|
|
189
|
+
createNestApp
|
|
190
|
+
};
|