@akanjs/server 0.9.43 → 0.9.45
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/cjs/src/boot.js +4 -2
- package/cjs/src/schedule.js +10 -10
- package/cjs/src/schema.js +34 -5
- package/esm/src/boot.js +4 -2
- package/esm/src/schedule.js +10 -10
- package/esm/src/schema.js +35 -6
- package/package.json +1 -1
- package/src/module.d.ts +1 -1
- package/src/searchDaemon.d.ts +25 -0
package/cjs/src/boot.js
CHANGED
|
@@ -56,6 +56,7 @@ var import_dgram = __toESM(require("dgram"));
|
|
|
56
56
|
var import_events = __toESM(require("events"));
|
|
57
57
|
var import_graphql_upload = require("graphql-upload");
|
|
58
58
|
var import_meilisearch = require("meilisearch");
|
|
59
|
+
var import_mongoose2 = __toESM(require("mongoose"));
|
|
59
60
|
var import_redis = require("redis");
|
|
60
61
|
var import_base2 = require("./base.module");
|
|
61
62
|
var import_gql = require("./gql");
|
|
@@ -110,9 +111,10 @@ const createNestApp = async ({ registerModules, serverMode = "federation", env,
|
|
|
110
111
|
provide: "MEILI_CLIENT",
|
|
111
112
|
useFactory: () => new import_meilisearch.MeiliSearch({ host: meiliUri, apiKey: (0, import_nest.generateMeiliKey)(env) })
|
|
112
113
|
},
|
|
113
|
-
{ provide: "GLOBAL_ENV", useValue: env }
|
|
114
|
+
{ provide: "GLOBAL_ENV", useValue: env },
|
|
115
|
+
{ provide: "MONGO_CLIENT", useValue: import_mongoose2.default.connection }
|
|
114
116
|
],
|
|
115
|
-
exports: ["REDIS_CLIENT", "MEILI_CLIENT", "GLOBAL_ENV"]
|
|
117
|
+
exports: ["REDIS_CLIENT", "MEILI_CLIENT", "GLOBAL_ENV", "MONGO_CLIENT"]
|
|
116
118
|
})
|
|
117
119
|
], GlobalProvideModule);
|
|
118
120
|
let AppModule = class {
|
package/cjs/src/schedule.js
CHANGED
|
@@ -107,10 +107,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
107
107
|
initMetas.map(async (gqlMeta) => {
|
|
108
108
|
const fn = gqlMeta.descriptor.value;
|
|
109
109
|
const before = Date.now();
|
|
110
|
-
this.logger.
|
|
110
|
+
this.logger.verbose(`Init Before ${gqlMeta.key} / ${before}`);
|
|
111
111
|
await fn.apply(this);
|
|
112
112
|
const after = Date.now();
|
|
113
|
-
this.logger.
|
|
113
|
+
this.logger.verbose(`Init After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
114
114
|
})
|
|
115
115
|
);
|
|
116
116
|
timeoutMetas.forEach((gqlMeta) => {
|
|
@@ -118,10 +118,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
118
118
|
const timeout = gqlMeta.signalOption.scheduleTime;
|
|
119
119
|
const timer = setTimeout(async () => {
|
|
120
120
|
const before = Date.now();
|
|
121
|
-
this.logger.
|
|
121
|
+
this.logger.verbose(`Timemout Before ${gqlMeta.key} / ${before}`);
|
|
122
122
|
await fn.apply(this);
|
|
123
123
|
const after = Date.now();
|
|
124
|
-
this.logger.
|
|
124
|
+
this.logger.verbose(`Timemout After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
125
125
|
__privateGet(this, _timeoutMap).delete(fn);
|
|
126
126
|
}, timeout);
|
|
127
127
|
__privateGet(this, _timeoutMap).set(fn, timer);
|
|
@@ -139,10 +139,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
139
139
|
__privateGet(this, _lockMap).set(fn, true);
|
|
140
140
|
}
|
|
141
141
|
const before = Date.now();
|
|
142
|
-
this.logger.
|
|
142
|
+
this.logger.verbose(`Interval Before ${gqlMeta.key} / ${before}`);
|
|
143
143
|
await fn.apply(this);
|
|
144
144
|
const after = Date.now();
|
|
145
|
-
this.logger.
|
|
145
|
+
this.logger.verbose(`Interval After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
146
146
|
if (lock)
|
|
147
147
|
__privateGet(this, _lockMap).set(fn, false);
|
|
148
148
|
}, interval);
|
|
@@ -165,10 +165,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
165
165
|
__privateGet(this, _lockMap).set(fn, true);
|
|
166
166
|
}
|
|
167
167
|
const before = Date.now();
|
|
168
|
-
this.logger.
|
|
168
|
+
this.logger.verbose(`Cron Before ${gqlMeta.key} / ${before}`);
|
|
169
169
|
await fn.apply(this);
|
|
170
170
|
const after = Date.now();
|
|
171
|
-
this.logger.
|
|
171
|
+
this.logger.verbose(`Cron After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
172
172
|
if (lock)
|
|
173
173
|
__privateGet(this, _lockMap).set(fn, false);
|
|
174
174
|
},
|
|
@@ -196,10 +196,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
196
196
|
destroyMetas.map(async (gqlMeta) => {
|
|
197
197
|
const fn = gqlMeta.descriptor.value;
|
|
198
198
|
const before = Date.now();
|
|
199
|
-
this.logger.
|
|
199
|
+
this.logger.verbose(`Destroy Before ${gqlMeta.key} / ${before}`);
|
|
200
200
|
await fn.apply(this);
|
|
201
201
|
const after = Date.now();
|
|
202
|
-
this.logger.
|
|
202
|
+
this.logger.verbose(`Destroy After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
203
203
|
})
|
|
204
204
|
);
|
|
205
205
|
}
|
package/cjs/src/schema.js
CHANGED
|
@@ -206,13 +206,42 @@ const schemaOf = (modelRef, docRef, middleware) => {
|
|
|
206
206
|
schema.methods[name] = Object.getOwnPropertyDescriptor(docRef.prototype, name)?.value;
|
|
207
207
|
});
|
|
208
208
|
schema.pre("save", async function(next) {
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
209
|
+
const saveType = this.isNew ? "create" : this.isModified("removedAt") ? this.removedAt ? "remove" : "create" : "update";
|
|
210
|
+
const saveListeners = [
|
|
211
|
+
...this.constructor.preSaveListenerSet,
|
|
212
|
+
...saveType === "create" ? [...this.constructor.preCreateListenerSet] : saveType === "update" ? [...this.constructor.preUpdateListenerSet] : [...this.constructor.preRemoveListenerSet]
|
|
213
|
+
];
|
|
214
|
+
await Promise.all(
|
|
215
|
+
saveListeners.map(async (listener) => {
|
|
216
|
+
try {
|
|
217
|
+
await listener(this, saveType);
|
|
218
|
+
} catch (e) {
|
|
219
|
+
import_common.Logger.error(
|
|
220
|
+
`Pre Save Listener Error ${this.constructor.modelName}: ${e instanceof Error ? e.message : typeof e === "string" ? e : "unknown error"}`
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
})
|
|
224
|
+
);
|
|
214
225
|
next();
|
|
215
226
|
});
|
|
227
|
+
schema.post("save", async function() {
|
|
228
|
+
const saveType = this.isNew ? "create" : this.isModified("removedAt") ? this.removedAt ? "remove" : "create" : "update";
|
|
229
|
+
const saveListeners = [
|
|
230
|
+
...this.constructor.postSaveListenerSet,
|
|
231
|
+
...saveType === "create" ? [...this.constructor.postCreateListenerSet] : saveType === "update" ? [...this.constructor.postUpdateListenerSet] : [...this.constructor.postRemoveListenerSet]
|
|
232
|
+
];
|
|
233
|
+
await Promise.all(
|
|
234
|
+
saveListeners.map(async (listener) => {
|
|
235
|
+
try {
|
|
236
|
+
await listener(this, saveType);
|
|
237
|
+
} catch (e) {
|
|
238
|
+
import_common.Logger.error(
|
|
239
|
+
`Post Save Listener Error ${this.constructor.modelName}: ${e instanceof Error ? e.message : typeof e === "string" ? e : "unknown error"}`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
})
|
|
243
|
+
);
|
|
244
|
+
});
|
|
216
245
|
const onSchema = Object.getOwnPropertyDescriptor(middleware.prototype, "onSchema")?.value;
|
|
217
246
|
onSchema?.(schema);
|
|
218
247
|
schema.index({ removedAt: -1 });
|
package/esm/src/boot.js
CHANGED
|
@@ -47,6 +47,7 @@ import dgram from "dgram";
|
|
|
47
47
|
import events from "events";
|
|
48
48
|
import { graphqlUploadExpress } from "graphql-upload";
|
|
49
49
|
import { MeiliSearch } from "meilisearch";
|
|
50
|
+
import mongoose from "mongoose";
|
|
50
51
|
import { createClient } from "redis";
|
|
51
52
|
import { registerBaseModule } from "./base.module";
|
|
52
53
|
import { DateScalar } from "./gql";
|
|
@@ -101,9 +102,10 @@ const createNestApp = async ({ registerModules, serverMode = "federation", env,
|
|
|
101
102
|
provide: "MEILI_CLIENT",
|
|
102
103
|
useFactory: () => new MeiliSearch({ host: meiliUri, apiKey: generateMeiliKey(env) })
|
|
103
104
|
},
|
|
104
|
-
{ provide: "GLOBAL_ENV", useValue: env }
|
|
105
|
+
{ provide: "GLOBAL_ENV", useValue: env },
|
|
106
|
+
{ provide: "MONGO_CLIENT", useValue: mongoose.connection }
|
|
105
107
|
],
|
|
106
|
-
exports: ["REDIS_CLIENT", "MEILI_CLIENT", "GLOBAL_ENV"]
|
|
108
|
+
exports: ["REDIS_CLIENT", "MEILI_CLIENT", "GLOBAL_ENV", "MONGO_CLIENT"]
|
|
107
109
|
})
|
|
108
110
|
], GlobalProvideModule);
|
|
109
111
|
let AppModule = class {
|
package/esm/src/schedule.js
CHANGED
|
@@ -87,10 +87,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
87
87
|
initMetas.map(async (gqlMeta) => {
|
|
88
88
|
const fn = gqlMeta.descriptor.value;
|
|
89
89
|
const before = Date.now();
|
|
90
|
-
this.logger.
|
|
90
|
+
this.logger.verbose(`Init Before ${gqlMeta.key} / ${before}`);
|
|
91
91
|
await fn.apply(this);
|
|
92
92
|
const after = Date.now();
|
|
93
|
-
this.logger.
|
|
93
|
+
this.logger.verbose(`Init After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
94
94
|
})
|
|
95
95
|
);
|
|
96
96
|
timeoutMetas.forEach((gqlMeta) => {
|
|
@@ -98,10 +98,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
98
98
|
const timeout = gqlMeta.signalOption.scheduleTime;
|
|
99
99
|
const timer = setTimeout(async () => {
|
|
100
100
|
const before = Date.now();
|
|
101
|
-
this.logger.
|
|
101
|
+
this.logger.verbose(`Timemout Before ${gqlMeta.key} / ${before}`);
|
|
102
102
|
await fn.apply(this);
|
|
103
103
|
const after = Date.now();
|
|
104
|
-
this.logger.
|
|
104
|
+
this.logger.verbose(`Timemout After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
105
105
|
__privateGet(this, _timeoutMap).delete(fn);
|
|
106
106
|
}, timeout);
|
|
107
107
|
__privateGet(this, _timeoutMap).set(fn, timer);
|
|
@@ -119,10 +119,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
119
119
|
__privateGet(this, _lockMap).set(fn, true);
|
|
120
120
|
}
|
|
121
121
|
const before = Date.now();
|
|
122
|
-
this.logger.
|
|
122
|
+
this.logger.verbose(`Interval Before ${gqlMeta.key} / ${before}`);
|
|
123
123
|
await fn.apply(this);
|
|
124
124
|
const after = Date.now();
|
|
125
|
-
this.logger.
|
|
125
|
+
this.logger.verbose(`Interval After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
126
126
|
if (lock)
|
|
127
127
|
__privateGet(this, _lockMap).set(fn, false);
|
|
128
128
|
}, interval);
|
|
@@ -145,10 +145,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
145
145
|
__privateGet(this, _lockMap).set(fn, true);
|
|
146
146
|
}
|
|
147
147
|
const before = Date.now();
|
|
148
|
-
this.logger.
|
|
148
|
+
this.logger.verbose(`Cron Before ${gqlMeta.key} / ${before}`);
|
|
149
149
|
await fn.apply(this);
|
|
150
150
|
const after = Date.now();
|
|
151
|
-
this.logger.
|
|
151
|
+
this.logger.verbose(`Cron After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
152
152
|
if (lock)
|
|
153
153
|
__privateGet(this, _lockMap).set(fn, false);
|
|
154
154
|
},
|
|
@@ -176,10 +176,10 @@ const makeScheduleModule = (serverMode, backendEnv) => {
|
|
|
176
176
|
destroyMetas.map(async (gqlMeta) => {
|
|
177
177
|
const fn = gqlMeta.descriptor.value;
|
|
178
178
|
const before = Date.now();
|
|
179
|
-
this.logger.
|
|
179
|
+
this.logger.verbose(`Destroy Before ${gqlMeta.key} / ${before}`);
|
|
180
180
|
await fn.apply(this);
|
|
181
181
|
const after = Date.now();
|
|
182
|
-
this.logger.
|
|
182
|
+
this.logger.verbose(`Destroy After ${gqlMeta.key} / ${after} (${after - before}ms)`);
|
|
183
183
|
})
|
|
184
184
|
);
|
|
185
185
|
}
|
package/esm/src/schema.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
Int,
|
|
9
9
|
JSON
|
|
10
10
|
} from "@akanjs/base";
|
|
11
|
-
import { isDayjs } from "@akanjs/common";
|
|
11
|
+
import { isDayjs, Logger } from "@akanjs/common";
|
|
12
12
|
import { getClassMeta, getFieldMetas, getFullModelRef, getInputModelRef } from "@akanjs/constant";
|
|
13
13
|
import { getDefaultSchemaOptions, ObjectId } from "@akanjs/document";
|
|
14
14
|
import { makeDefault } from "@akanjs/signal";
|
|
@@ -191,13 +191,42 @@ const schemaOf = (modelRef, docRef, middleware) => {
|
|
|
191
191
|
schema.methods[name] = Object.getOwnPropertyDescriptor(docRef.prototype, name)?.value;
|
|
192
192
|
});
|
|
193
193
|
schema.pre("save", async function(next) {
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
194
|
+
const saveType = this.isNew ? "create" : this.isModified("removedAt") ? this.removedAt ? "remove" : "create" : "update";
|
|
195
|
+
const saveListeners = [
|
|
196
|
+
...this.constructor.preSaveListenerSet,
|
|
197
|
+
...saveType === "create" ? [...this.constructor.preCreateListenerSet] : saveType === "update" ? [...this.constructor.preUpdateListenerSet] : [...this.constructor.preRemoveListenerSet]
|
|
198
|
+
];
|
|
199
|
+
await Promise.all(
|
|
200
|
+
saveListeners.map(async (listener) => {
|
|
201
|
+
try {
|
|
202
|
+
await listener(this, saveType);
|
|
203
|
+
} catch (e) {
|
|
204
|
+
Logger.error(
|
|
205
|
+
`Pre Save Listener Error ${this.constructor.modelName}: ${e instanceof Error ? e.message : typeof e === "string" ? e : "unknown error"}`
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
})
|
|
209
|
+
);
|
|
199
210
|
next();
|
|
200
211
|
});
|
|
212
|
+
schema.post("save", async function() {
|
|
213
|
+
const saveType = this.isNew ? "create" : this.isModified("removedAt") ? this.removedAt ? "remove" : "create" : "update";
|
|
214
|
+
const saveListeners = [
|
|
215
|
+
...this.constructor.postSaveListenerSet,
|
|
216
|
+
...saveType === "create" ? [...this.constructor.postCreateListenerSet] : saveType === "update" ? [...this.constructor.postUpdateListenerSet] : [...this.constructor.postRemoveListenerSet]
|
|
217
|
+
];
|
|
218
|
+
await Promise.all(
|
|
219
|
+
saveListeners.map(async (listener) => {
|
|
220
|
+
try {
|
|
221
|
+
await listener(this, saveType);
|
|
222
|
+
} catch (e) {
|
|
223
|
+
Logger.error(
|
|
224
|
+
`Post Save Listener Error ${this.constructor.modelName}: ${e instanceof Error ? e.message : typeof e === "string" ? e : "unknown error"}`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
);
|
|
229
|
+
});
|
|
201
230
|
const onSchema = Object.getOwnPropertyDescriptor(middleware.prototype, "onSchema")?.value;
|
|
202
231
|
onSchema?.(schema);
|
|
203
232
|
schema.index({ removedAt: -1 });
|
package/package.json
CHANGED
package/src/module.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Database } from "@akanjs/document";
|
|
|
4
4
|
import { DynamicModule } from "@nestjs/common";
|
|
5
5
|
interface DatabaseModuleCreateOptions {
|
|
6
6
|
constant: ConstantModel<string, any, any, any, any, any>;
|
|
7
|
-
database: Database<string, any, any, any, any, any, any, any
|
|
7
|
+
database: Database<string, any, any, any, any, any, any, any>;
|
|
8
8
|
signal: Type;
|
|
9
9
|
service: Type;
|
|
10
10
|
}
|
package/src/searchDaemon.d.ts
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
import type { Type } from "@akanjs/base";
|
|
2
2
|
import { type TextDoc } from "@akanjs/constant";
|
|
3
|
+
import type { Types } from "mongoose";
|
|
4
|
+
export interface ChangedData {
|
|
5
|
+
_id: {
|
|
6
|
+
_data: string;
|
|
7
|
+
};
|
|
8
|
+
operationType: "update" | "insert" | "delete";
|
|
9
|
+
clusterTime: {
|
|
10
|
+
t: number;
|
|
11
|
+
i: number;
|
|
12
|
+
};
|
|
13
|
+
wallTime: Date;
|
|
14
|
+
ns: {
|
|
15
|
+
db: string;
|
|
16
|
+
coll: string;
|
|
17
|
+
};
|
|
18
|
+
documentKey: {
|
|
19
|
+
_id: Types.ObjectId;
|
|
20
|
+
};
|
|
21
|
+
updateDescription?: {
|
|
22
|
+
updatedFields: Record<string, any>;
|
|
23
|
+
removedFields: string[];
|
|
24
|
+
truncatedArrays: any[];
|
|
25
|
+
};
|
|
26
|
+
fullDocument?: Record<string, any>;
|
|
27
|
+
}
|
|
3
28
|
export declare const makeTextFilter: (modelRef: Type) => (data: Record<string, any>, assignObj?: {
|
|
4
29
|
[key: string]: string;
|
|
5
30
|
}) => TextDoc;
|