@ruiapp/rapid-core 0.11.6 → 0.11.7
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 +11 -11
- package/dist/core/pluginManager.d.ts +2 -0
- package/dist/core/server.d.ts +3 -0
- package/dist/dataAccess/entityManager.d.ts +3 -3
- package/dist/index.js +102 -38
- package/dist/server.d.ts +1 -0
- package/dist/types.d.ts +2 -0
- package/package.json +1 -1
- package/rollup.config.js +16 -16
- package/src/bootstrapApplicationConfig.ts +904 -904
- package/src/core/ExpressionInterpreter.ts +45 -45
- package/src/core/actionHandler.ts +24 -24
- package/src/core/actionHandlers/ifActionHandler.ts +27 -27
- package/src/core/eventManager.ts +20 -20
- package/src/core/facility.ts +7 -7
- package/src/core/http/formDataParser.ts +87 -87
- package/src/core/http-types.ts +4 -4
- package/src/core/pluginManager.ts +202 -193
- package/src/core/providers/runtimeProvider.ts +5 -5
- package/src/core/request.ts +96 -96
- package/src/core/response.ts +84 -84
- package/src/core/routeContext.ts +127 -127
- package/src/core/routes/healthz.ts +20 -20
- package/src/core/routes/index.ts +3 -3
- package/src/core/routesBuilder.ts +129 -122
- package/src/core/server.ts +161 -158
- package/src/dataAccess/columnTypeMapper.ts +22 -22
- package/src/dataAccess/dataAccessTypes.ts +165 -165
- package/src/dataAccess/dataAccessor.ts +135 -135
- package/src/dataAccess/entityManager.ts +2031 -1996
- package/src/dataAccess/entityMapper.ts +111 -111
- package/src/dataAccess/entityValidator.ts +33 -33
- package/src/dataAccess/propertyMapper.ts +28 -28
- package/src/deno-std/assert/assert.ts +9 -9
- package/src/deno-std/assert/assertion_error.ts +7 -7
- package/src/deno-std/datetime/to_imf.ts +32 -32
- package/src/deno-std/encoding/base64.ts +141 -141
- package/src/deno-std/http/cookie.ts +372 -372
- package/src/facilities/cache/CacheFacilityTypes.ts +29 -29
- package/src/facilities/cache/CacheFactory.ts +31 -31
- package/src/facilities/cache/MemoryCache.ts +58 -58
- package/src/facilities/cache/MemoryCacheProvider.ts +15 -15
- package/src/facilities/log/LogFacility.ts +35 -35
- package/src/helpers/dbTransactionHelper.ts +42 -42
- package/src/helpers/entityHelper.ts +89 -89
- package/src/helpers/filterHelper.ts +148 -148
- package/src/helpers/inputHelper.ts +11 -11
- package/src/helpers/licenseHelper.ts +29 -29
- package/src/helpers/metaHelper.ts +111 -111
- package/src/helpers/runCollectionEntityActionHandler.ts +58 -58
- package/src/index.ts +85 -85
- package/src/plugins/auth/AuthPlugin.ts +107 -107
- package/src/plugins/auth/AuthPluginTypes.ts +11 -11
- package/src/plugins/auth/actionHandlers/changePassword.ts +61 -61
- package/src/plugins/auth/actionHandlers/createSession.ts +68 -68
- package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
- package/src/plugins/auth/actionHandlers/getMyProfile.ts +28 -28
- package/src/plugins/auth/actionHandlers/index.ts +8 -8
- package/src/plugins/auth/actionHandlers/resetPassword.ts +45 -45
- package/src/plugins/auth/models/AccessToken.ts +56 -56
- package/src/plugins/auth/models/index.ts +3 -3
- package/src/plugins/auth/routes/changePassword.ts +15 -15
- package/src/plugins/auth/routes/getMyProfile.ts +15 -15
- package/src/plugins/auth/routes/index.ts +7 -7
- package/src/plugins/auth/routes/resetPassword.ts +15 -15
- package/src/plugins/auth/routes/signin.ts +15 -15
- package/src/plugins/auth/routes/signout.ts +15 -15
- package/src/plugins/auth/services/AuthService.ts +66 -66
- package/src/plugins/cronJob/CronJobPlugin.ts +104 -104
- package/src/plugins/cronJob/CronJobPluginTypes.ts +44 -44
- package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
- package/src/plugins/cronJob/actionHandlers/runCronJob.ts +32 -32
- package/src/plugins/cronJob/entityWatchers/cronJobEntityWatchers.ts +24 -24
- package/src/plugins/cronJob/entityWatchers/index.ts +4 -4
- package/src/plugins/cronJob/models/CronJob.ts +129 -129
- package/src/plugins/cronJob/models/index.ts +3 -3
- package/src/plugins/cronJob/routes/index.ts +3 -3
- package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
- package/src/plugins/cronJob/services/CronJobService.ts +255 -255
- package/src/plugins/dataManage/DataManagePlugin.ts +165 -165
- package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +15 -15
- package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +17 -17
- package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +81 -81
- package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +20 -20
- package/src/plugins/dataManage/actionHandlers/deleteCollectionEntities.ts +47 -45
- package/src/plugins/dataManage/actionHandlers/deleteCollectionEntityById.ts +20 -20
- package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +27 -27
- package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +30 -30
- package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
- package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +15 -15
- package/src/plugins/dataManage/actionHandlers/saveEntity.ts +46 -46
- package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +38 -38
- package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
- package/src/plugins/fileManage/FileManagePlugin.ts +52 -52
- package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +65 -65
- package/src/plugins/fileManage/actionHandlers/downloadFile.ts +44 -44
- package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
- package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
- package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
- package/src/plugins/fileManage/routes/index.ts +5 -5
- package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
- package/src/plugins/license/LicensePlugin.ts +79 -79
- package/src/plugins/license/LicensePluginTypes.ts +95 -95
- package/src/plugins/license/LicenseService.ts +141 -141
- package/src/plugins/license/actionHandlers/getLicense.ts +18 -18
- package/src/plugins/license/actionHandlers/index.ts +5 -5
- package/src/plugins/license/actionHandlers/updateLicense.ts +24 -24
- package/src/plugins/license/helpers/certHelper.ts +21 -21
- package/src/plugins/license/helpers/cryptoHelper.ts +47 -47
- package/src/plugins/license/models/index.ts +1 -1
- package/src/plugins/license/routes/getLicense.ts +15 -15
- package/src/plugins/license/routes/index.ts +4 -4
- package/src/plugins/license/routes/updateLicense.ts +15 -15
- package/src/plugins/mail/MailPlugin.ts +74 -74
- package/src/plugins/mail/MailPluginTypes.ts +27 -27
- package/src/plugins/mail/MailService.ts +38 -38
- package/src/plugins/mail/actionHandlers/index.ts +3 -3
- package/src/plugins/mail/models/index.ts +1 -1
- package/src/plugins/mail/routes/index.ts +1 -1
- package/src/plugins/metaManage/MetaManagePlugin.ts +198 -198
- package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
- package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +10 -10
- package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +10 -10
- package/src/plugins/metaManage/services/MetaService.ts +376 -376
- package/src/plugins/notification/NotificationPlugin.ts +68 -68
- package/src/plugins/notification/NotificationPluginTypes.ts +13 -13
- package/src/plugins/notification/NotificationService.ts +25 -25
- package/src/plugins/notification/actionHandlers/index.ts +3 -3
- package/src/plugins/notification/models/Notification.ts +60 -60
- package/src/plugins/notification/models/index.ts +3 -3
- package/src/plugins/notification/routes/index.ts +1 -1
- package/src/plugins/routeManage/RouteManagePlugin.ts +64 -64
- package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
- package/src/plugins/routeManage/actionHandlers/mock.ts +28 -28
- package/src/plugins/sequence/SequencePlugin.ts +146 -146
- package/src/plugins/sequence/SequencePluginTypes.ts +69 -69
- package/src/plugins/sequence/SequenceService.ts +92 -92
- package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
- package/src/plugins/sequence/actionHandlers/index.ts +4 -4
- package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
- package/src/plugins/sequence/models/SequenceRule.ts +42 -42
- package/src/plugins/sequence/models/index.ts +4 -4
- package/src/plugins/sequence/routes/generateSn.ts +15 -15
- package/src/plugins/sequence/routes/index.ts +3 -3
- package/src/plugins/sequence/segment-utility.ts +11 -11
- package/src/plugins/sequence/segments/autoIncrement.ts +90 -90
- package/src/plugins/sequence/segments/dayOfMonth.ts +19 -19
- package/src/plugins/sequence/segments/index.ts +9 -9
- package/src/plugins/sequence/segments/literal.ts +16 -16
- package/src/plugins/sequence/segments/month.ts +19 -19
- package/src/plugins/sequence/segments/parameter.ts +20 -20
- package/src/plugins/sequence/segments/year.ts +19 -19
- package/src/plugins/serverOperation/ServerOperationPlugin.ts +93 -93
- package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +25 -25
- package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
- package/src/plugins/serverOperation/actionHandlers/runServerOperation.ts +20 -20
- package/src/plugins/setting/SettingPlugin.ts +68 -68
- package/src/plugins/setting/SettingPluginTypes.ts +37 -37
- package/src/plugins/setting/SettingService.ts +222 -222
- package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
- package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
- package/src/plugins/setting/actionHandlers/index.ts +6 -6
- package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
- package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
- package/src/plugins/setting/models/SystemSettingItem.ts +48 -48
- package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
- package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
- package/src/plugins/setting/models/UserSettingItem.ts +55 -55
- package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
- package/src/plugins/setting/models/index.ts +8 -8
- package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
- package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
- package/src/plugins/setting/routes/index.ts +5 -5
- package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
- package/src/plugins/stateMachine/StateMachinePlugin.ts +196 -196
- package/src/plugins/stateMachine/StateMachinePluginTypes.ts +48 -48
- package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
- package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +54 -54
- package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
- package/src/plugins/stateMachine/models/index.ts +3 -3
- package/src/plugins/stateMachine/routes/index.ts +3 -3
- package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
- package/src/plugins/stateMachine/stateMachineHelper.ts +36 -36
- package/src/plugins/webhooks/WebhooksPlugin.ts +148 -148
- package/src/plugins/webhooks/pluginConfig.ts +75 -75
- package/src/polyfill.ts +5 -5
- package/src/proxy/mod.ts +38 -38
- package/src/proxy/types.ts +21 -21
- package/src/queryBuilder/index.ts +1 -1
- package/src/queryBuilder/queryBuilder.ts +755 -755
- package/src/server.ts +567 -556
- package/src/types/cron-job-types.ts +71 -71
- package/src/types.ts +884 -882
- package/src/utilities/accessControlUtility.ts +33 -33
- package/src/utilities/entityUtility.ts +18 -18
- package/src/utilities/errorUtility.ts +15 -15
- package/src/utilities/fsUtility.ts +137 -137
- package/src/utilities/httpUtility.ts +19 -19
- package/src/utilities/jwtUtility.ts +26 -26
- package/src/utilities/passwordUtility.ts +26 -26
- package/src/utilities/pathUtility.ts +14 -14
- package/src/utilities/timeUtility.ts +17 -17
- package/src/utilities/typeUtility.ts +15 -15
- package/tsconfig.json +19 -19
|
@@ -1,193 +1,202 @@
|
|
|
1
|
-
import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdRouteActionConfig, UpdateEntityByIdOptions } from "~/types";
|
|
2
|
-
import { IRpdServer, RapidPlugin } from "./server";
|
|
3
|
-
import { RouteContext } from "./routeContext";
|
|
4
|
-
import { ActionHandlerContext } from "./actionHandler";
|
|
5
|
-
|
|
6
|
-
class PluginManager {
|
|
7
|
-
#server: IRpdServer;
|
|
8
|
-
#plugins: RapidPlugin[];
|
|
9
|
-
|
|
10
|
-
constructor(server: IRpdServer) {
|
|
11
|
-
this.#server = server;
|
|
12
|
-
this.#plugins = [];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async loadPlugins(plugins: RapidPlugin[]) {
|
|
16
|
-
for (const plugin of plugins) {
|
|
17
|
-
this.#plugins.push(plugin);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** 初始化插件时调用。 */
|
|
22
|
-
async initPlugins() {
|
|
23
|
-
for (const plugin of this.#plugins) {
|
|
24
|
-
if (plugin.initPlugin) {
|
|
25
|
-
await plugin.initPlugin(this.#server);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** 注册中间件 */
|
|
31
|
-
async registerMiddlewares() {
|
|
32
|
-
for (const plugin of this.#plugins) {
|
|
33
|
-
if (plugin.registerMiddlewares) {
|
|
34
|
-
await plugin.registerMiddlewares(this.#server);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** 注册接口动作处理程序 */
|
|
40
|
-
async registerActionHandlers() {
|
|
41
|
-
for (const plugin of this.#plugins) {
|
|
42
|
-
if (plugin.registerActionHandlers) {
|
|
43
|
-
await plugin.registerActionHandlers(this.#server);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** 注册事件处理程序 */
|
|
49
|
-
async registerEventHandlers() {
|
|
50
|
-
for (const plugin of this.#plugins) {
|
|
51
|
-
if (plugin.registerEventHandlers) {
|
|
52
|
-
await plugin.registerEventHandlers(this.#server);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** 注册消息处理程序 */
|
|
58
|
-
async registerMessageHandlers() {
|
|
59
|
-
for (const plugin of this.#plugins) {
|
|
60
|
-
if (plugin.registerMessageHandlers) {
|
|
61
|
-
await plugin.registerMessageHandlers(this.#server);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** 注册任务处理程序 */
|
|
67
|
-
async registerTaskProcessors() {
|
|
68
|
-
for (const plugin of this.#plugins) {
|
|
69
|
-
if (plugin.registerTaskProcessors) {
|
|
70
|
-
await plugin.registerTaskProcessors(this.#server);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** 在加载应用前调用。 */
|
|
76
|
-
async onLoadingApplication(applicationConfig: RpdApplicationConfig) {
|
|
77
|
-
for (const plugin of this.#plugins) {
|
|
78
|
-
if (plugin.onLoadingApplication) {
|
|
79
|
-
await plugin.onLoadingApplication(this.#server, applicationConfig);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** 配置数据模型 */
|
|
85
|
-
async configureModels(applicationConfig: RpdApplicationConfig) {
|
|
86
|
-
for (const plugin of this.#plugins) {
|
|
87
|
-
if (plugin.configureModels) {
|
|
88
|
-
await plugin.configureModels(this.#server, applicationConfig);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** 配置模型属性 */
|
|
94
|
-
async configureModelProperties(applicationConfig: RpdApplicationConfig) {
|
|
95
|
-
for (const plugin of this.#plugins) {
|
|
96
|
-
if (plugin.configureModelProperties) {
|
|
97
|
-
await plugin.configureModelProperties(this.#server, applicationConfig);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/** 配置服务 */
|
|
103
|
-
async configureServices(applicationConfig: RpdApplicationConfig) {
|
|
104
|
-
for (const plugin of this.#plugins) {
|
|
105
|
-
if (plugin.configureServices) {
|
|
106
|
-
await plugin.configureServices(this.#server, applicationConfig);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** 配置路由 */
|
|
112
|
-
async configureRoutes(applicationConfig: RpdApplicationConfig) {
|
|
113
|
-
for (const plugin of this.#plugins) {
|
|
114
|
-
if (plugin.configureRoutes) {
|
|
115
|
-
await plugin.configureRoutes(this.#server, applicationConfig);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** 配置定时任务 */
|
|
121
|
-
async registerCronJobs() {
|
|
122
|
-
for (const plugin of this.#plugins) {
|
|
123
|
-
if (plugin.registerCronJobs) {
|
|
124
|
-
await plugin.registerCronJobs(this.#server);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** 在应用配置加载完成后调用。此时插件可以进行一些数据的初始化工作。 */
|
|
130
|
-
async onApplicationLoaded(applicationConfig: RpdApplicationConfig) {
|
|
131
|
-
for (const plugin of this.#plugins) {
|
|
132
|
-
if (plugin.onApplicationLoaded) {
|
|
133
|
-
await plugin.onApplicationLoaded(this.#server, applicationConfig);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/** 在应用准备完成后调用。此时服务器已经可以处理网络请求。 */
|
|
139
|
-
async onApplicationReady(applicationConfig: RpdApplicationConfig) {
|
|
140
|
-
for (const plugin of this.#plugins) {
|
|
141
|
-
if (plugin.onApplicationReady) {
|
|
142
|
-
await plugin.onApplicationReady(this.#server, applicationConfig);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/** 在接收到HTTP请求,准备路由上下文时调用。 */
|
|
148
|
-
async onPrepareRouteContext(routeContext: RouteContext) {
|
|
149
|
-
for (const plugin of this.#plugins) {
|
|
150
|
-
if (plugin.onPrepareRouteContext) {
|
|
151
|
-
await plugin.onPrepareRouteContext(this.#server, routeContext);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** 在接收到HTTP请求,执行 actions 前调用。 */
|
|
157
|
-
async beforeRunRouteActions(handlerContext: ActionHandlerContext) {
|
|
158
|
-
for (const plugin of this.#plugins) {
|
|
159
|
-
if (plugin.beforeRunRouteActions) {
|
|
160
|
-
await plugin.beforeRunRouteActions(this.#server, handlerContext);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/** 在执行 action hanlder 前调用。 */
|
|
166
|
-
async beforeRunActionHandler(handlerContext: ActionHandlerContext, actionConfig: RpdRouteActionConfig) {
|
|
167
|
-
for (const plugin of this.#plugins) {
|
|
168
|
-
if (plugin.beforeRunActionHandler) {
|
|
169
|
-
await plugin.beforeRunActionHandler(this.#server, handlerContext, actionConfig);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
async
|
|
176
|
-
for (const plugin of this.#plugins) {
|
|
177
|
-
if (plugin.
|
|
178
|
-
await plugin.
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
async
|
|
185
|
-
for (const plugin of this.#plugins) {
|
|
186
|
-
if (plugin.
|
|
187
|
-
await plugin.
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
1
|
+
import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdRouteActionConfig, UpdateEntityByIdOptions } from "~/types";
|
|
2
|
+
import { IRpdServer, RapidPlugin } from "./server";
|
|
3
|
+
import { RouteContext } from "./routeContext";
|
|
4
|
+
import { ActionHandlerContext } from "./actionHandler";
|
|
5
|
+
|
|
6
|
+
class PluginManager {
|
|
7
|
+
#server: IRpdServer;
|
|
8
|
+
#plugins: RapidPlugin[];
|
|
9
|
+
|
|
10
|
+
constructor(server: IRpdServer) {
|
|
11
|
+
this.#server = server;
|
|
12
|
+
this.#plugins = [];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async loadPlugins(plugins: RapidPlugin[]) {
|
|
16
|
+
for (const plugin of plugins) {
|
|
17
|
+
this.#plugins.push(plugin);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** 初始化插件时调用。 */
|
|
22
|
+
async initPlugins() {
|
|
23
|
+
for (const plugin of this.#plugins) {
|
|
24
|
+
if (plugin.initPlugin) {
|
|
25
|
+
await plugin.initPlugin(this.#server);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** 注册中间件 */
|
|
31
|
+
async registerMiddlewares() {
|
|
32
|
+
for (const plugin of this.#plugins) {
|
|
33
|
+
if (plugin.registerMiddlewares) {
|
|
34
|
+
await plugin.registerMiddlewares(this.#server);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** 注册接口动作处理程序 */
|
|
40
|
+
async registerActionHandlers() {
|
|
41
|
+
for (const plugin of this.#plugins) {
|
|
42
|
+
if (plugin.registerActionHandlers) {
|
|
43
|
+
await plugin.registerActionHandlers(this.#server);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** 注册事件处理程序 */
|
|
49
|
+
async registerEventHandlers() {
|
|
50
|
+
for (const plugin of this.#plugins) {
|
|
51
|
+
if (plugin.registerEventHandlers) {
|
|
52
|
+
await plugin.registerEventHandlers(this.#server);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** 注册消息处理程序 */
|
|
58
|
+
async registerMessageHandlers() {
|
|
59
|
+
for (const plugin of this.#plugins) {
|
|
60
|
+
if (plugin.registerMessageHandlers) {
|
|
61
|
+
await plugin.registerMessageHandlers(this.#server);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** 注册任务处理程序 */
|
|
67
|
+
async registerTaskProcessors() {
|
|
68
|
+
for (const plugin of this.#plugins) {
|
|
69
|
+
if (plugin.registerTaskProcessors) {
|
|
70
|
+
await plugin.registerTaskProcessors(this.#server);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** 在加载应用前调用。 */
|
|
76
|
+
async onLoadingApplication(applicationConfig: RpdApplicationConfig) {
|
|
77
|
+
for (const plugin of this.#plugins) {
|
|
78
|
+
if (plugin.onLoadingApplication) {
|
|
79
|
+
await plugin.onLoadingApplication(this.#server, applicationConfig);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** 配置数据模型 */
|
|
85
|
+
async configureModels(applicationConfig: RpdApplicationConfig) {
|
|
86
|
+
for (const plugin of this.#plugins) {
|
|
87
|
+
if (plugin.configureModels) {
|
|
88
|
+
await plugin.configureModels(this.#server, applicationConfig);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** 配置模型属性 */
|
|
94
|
+
async configureModelProperties(applicationConfig: RpdApplicationConfig) {
|
|
95
|
+
for (const plugin of this.#plugins) {
|
|
96
|
+
if (plugin.configureModelProperties) {
|
|
97
|
+
await plugin.configureModelProperties(this.#server, applicationConfig);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** 配置服务 */
|
|
103
|
+
async configureServices(applicationConfig: RpdApplicationConfig) {
|
|
104
|
+
for (const plugin of this.#plugins) {
|
|
105
|
+
if (plugin.configureServices) {
|
|
106
|
+
await plugin.configureServices(this.#server, applicationConfig);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** 配置路由 */
|
|
112
|
+
async configureRoutes(applicationConfig: RpdApplicationConfig) {
|
|
113
|
+
for (const plugin of this.#plugins) {
|
|
114
|
+
if (plugin.configureRoutes) {
|
|
115
|
+
await plugin.configureRoutes(this.#server, applicationConfig);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** 配置定时任务 */
|
|
121
|
+
async registerCronJobs() {
|
|
122
|
+
for (const plugin of this.#plugins) {
|
|
123
|
+
if (plugin.registerCronJobs) {
|
|
124
|
+
await plugin.registerCronJobs(this.#server);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** 在应用配置加载完成后调用。此时插件可以进行一些数据的初始化工作。 */
|
|
130
|
+
async onApplicationLoaded(applicationConfig: RpdApplicationConfig) {
|
|
131
|
+
for (const plugin of this.#plugins) {
|
|
132
|
+
if (plugin.onApplicationLoaded) {
|
|
133
|
+
await plugin.onApplicationLoaded(this.#server, applicationConfig);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** 在应用准备完成后调用。此时服务器已经可以处理网络请求。 */
|
|
139
|
+
async onApplicationReady(applicationConfig: RpdApplicationConfig) {
|
|
140
|
+
for (const plugin of this.#plugins) {
|
|
141
|
+
if (plugin.onApplicationReady) {
|
|
142
|
+
await plugin.onApplicationReady(this.#server, applicationConfig);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** 在接收到HTTP请求,准备路由上下文时调用。 */
|
|
148
|
+
async onPrepareRouteContext(routeContext: RouteContext) {
|
|
149
|
+
for (const plugin of this.#plugins) {
|
|
150
|
+
if (plugin.onPrepareRouteContext) {
|
|
151
|
+
await plugin.onPrepareRouteContext(this.#server, routeContext);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** 在接收到HTTP请求,执行 actions 前调用。 */
|
|
157
|
+
async beforeRunRouteActions(handlerContext: ActionHandlerContext) {
|
|
158
|
+
for (const plugin of this.#plugins) {
|
|
159
|
+
if (plugin.beforeRunRouteActions) {
|
|
160
|
+
await plugin.beforeRunRouteActions(this.#server, handlerContext);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** 在执行 action hanlder 前调用。 */
|
|
166
|
+
async beforeRunActionHandler(handlerContext: ActionHandlerContext, actionConfig: RpdRouteActionConfig) {
|
|
167
|
+
for (const plugin of this.#plugins) {
|
|
168
|
+
if (plugin.beforeRunActionHandler) {
|
|
169
|
+
await plugin.beforeRunActionHandler(this.#server, handlerContext, actionConfig);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** 在执行 action handler 后调用。 */
|
|
175
|
+
async afterRunActionHandler(handlerContext: ActionHandlerContext, actionConfig: RpdRouteActionConfig, error?: Error) {
|
|
176
|
+
for (const plugin of this.#plugins) {
|
|
177
|
+
if (plugin.afterRunActionHandler) {
|
|
178
|
+
await plugin.afterRunActionHandler(this.#server, handlerContext, actionConfig, error);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** 在创建实体前调用。 */
|
|
184
|
+
async beforeCreateEntity(model: RpdDataModel, options: CreateEntityOptions) {
|
|
185
|
+
for (const plugin of this.#plugins) {
|
|
186
|
+
if (plugin.beforeCreateEntity) {
|
|
187
|
+
await plugin.beforeCreateEntity(this.#server, model, options);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** 在更新实体前调用。 */
|
|
193
|
+
async beforeUpdateEntity(model: RpdDataModel, options: UpdateEntityByIdOptions, currentEntity: any) {
|
|
194
|
+
for (const plugin of this.#plugins) {
|
|
195
|
+
if (plugin.beforeUpdateEntity) {
|
|
196
|
+
await plugin.beforeUpdateEntity(this.#server, model, options, currentEntity);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export default PluginManager;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export interface IRuntimeProvider {
|
|
2
|
-
copyFile(fromPath: string, toPath: string): Promise<void>;
|
|
3
|
-
|
|
4
|
-
removeFile(path: string): Promise<void>;
|
|
5
|
-
}
|
|
1
|
+
export interface IRuntimeProvider {
|
|
2
|
+
copyFile(fromPath: string, toPath: string): Promise<void>;
|
|
3
|
+
|
|
4
|
+
removeFile(path: string): Promise<void>;
|
|
5
|
+
}
|
package/src/core/request.ts
CHANGED
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
import qs from "qs";
|
|
2
|
-
import { parseFormDataBody } from "./http/formDataParser";
|
|
3
|
-
import { getCookies } from "~/deno-std/http/cookie";
|
|
4
|
-
import { IRpdServer } from "./server";
|
|
5
|
-
import { Logger } from "~/facilities/log/LogFacility";
|
|
6
|
-
|
|
7
|
-
export const GlobalRequest = global.Request;
|
|
8
|
-
|
|
9
|
-
export interface RapidRequestBody {
|
|
10
|
-
type: "form-data" | "json" | "form";
|
|
11
|
-
value: any;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export class RapidRequest {
|
|
15
|
-
#logger: Logger;
|
|
16
|
-
#raw: Request;
|
|
17
|
-
#bodyParsed: boolean;
|
|
18
|
-
#body: RapidRequestBody;
|
|
19
|
-
#headers: Headers;
|
|
20
|
-
#parsedCookies: Record<string, string>;
|
|
21
|
-
method: string;
|
|
22
|
-
url: URL;
|
|
23
|
-
ip?: string;
|
|
24
|
-
|
|
25
|
-
constructor(server: IRpdServer, req: Request) {
|
|
26
|
-
this.#logger = server.getLogger();
|
|
27
|
-
this.#raw = req;
|
|
28
|
-
this.method = req.method;
|
|
29
|
-
this.url = new URL(req.url);
|
|
30
|
-
this.#headers = req.headers;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async parseBody(): Promise<void> {
|
|
34
|
-
if (this.#bodyParsed) {
|
|
35
|
-
this.#logger.warn("Request body has been parsed. 'parseBody()' method should not be called more than once.");
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const requestMethod = this.method;
|
|
40
|
-
if (requestMethod !== "POST" && requestMethod !== "PUT" && requestMethod !== "PATCH") {
|
|
41
|
-
this.#body = null;
|
|
42
|
-
this.#bodyParsed = true;
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const contentLength = parseInt(this.#headers.get("Content-Length") || "0", 10);
|
|
47
|
-
if (!contentLength) {
|
|
48
|
-
this.#body = null;
|
|
49
|
-
this.#bodyParsed = true;
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const req = this.#raw;
|
|
54
|
-
const contentType = this.#headers.get("Content-Type") || "application/json";
|
|
55
|
-
if (contentType.includes("json")) {
|
|
56
|
-
this.#body = {
|
|
57
|
-
type: "json",
|
|
58
|
-
value: await req.json(),
|
|
59
|
-
};
|
|
60
|
-
} else if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
61
|
-
const bodyText = await req.text();
|
|
62
|
-
this.#body = {
|
|
63
|
-
type: "form",
|
|
64
|
-
value: qs.parse(bodyText),
|
|
65
|
-
};
|
|
66
|
-
} else if (contentType.startsWith("multipart/form-data")) {
|
|
67
|
-
this.#body = {
|
|
68
|
-
type: "form-data",
|
|
69
|
-
value: await parseFormDataBody(req, { all: true }),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
this.#bodyParsed = true;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
get rawRequest(): Request {
|
|
76
|
-
return this.#raw;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
get headers(): Headers {
|
|
80
|
-
return this.#headers;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
get cookies(): Record<string, string> {
|
|
84
|
-
if (!this.#parsedCookies) {
|
|
85
|
-
this.#parsedCookies = getCookies(this.#headers);
|
|
86
|
-
}
|
|
87
|
-
return this.#parsedCookies;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
get body(): RapidRequestBody {
|
|
91
|
-
if (!this.#bodyParsed) {
|
|
92
|
-
throw new Error("Request body not parsed, you should call 'parseBody()' method before getting the body.");
|
|
93
|
-
}
|
|
94
|
-
return this.#body;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
1
|
+
import qs from "qs";
|
|
2
|
+
import { parseFormDataBody } from "./http/formDataParser";
|
|
3
|
+
import { getCookies } from "~/deno-std/http/cookie";
|
|
4
|
+
import { IRpdServer } from "./server";
|
|
5
|
+
import { Logger } from "~/facilities/log/LogFacility";
|
|
6
|
+
|
|
7
|
+
export const GlobalRequest = global.Request;
|
|
8
|
+
|
|
9
|
+
export interface RapidRequestBody {
|
|
10
|
+
type: "form-data" | "json" | "form";
|
|
11
|
+
value: any;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class RapidRequest {
|
|
15
|
+
#logger: Logger;
|
|
16
|
+
#raw: Request;
|
|
17
|
+
#bodyParsed: boolean;
|
|
18
|
+
#body: RapidRequestBody;
|
|
19
|
+
#headers: Headers;
|
|
20
|
+
#parsedCookies: Record<string, string>;
|
|
21
|
+
method: string;
|
|
22
|
+
url: URL;
|
|
23
|
+
ip?: string;
|
|
24
|
+
|
|
25
|
+
constructor(server: IRpdServer, req: Request) {
|
|
26
|
+
this.#logger = server.getLogger();
|
|
27
|
+
this.#raw = req;
|
|
28
|
+
this.method = req.method;
|
|
29
|
+
this.url = new URL(req.url);
|
|
30
|
+
this.#headers = req.headers;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async parseBody(): Promise<void> {
|
|
34
|
+
if (this.#bodyParsed) {
|
|
35
|
+
this.#logger.warn("Request body has been parsed. 'parseBody()' method should not be called more than once.");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const requestMethod = this.method;
|
|
40
|
+
if (requestMethod !== "POST" && requestMethod !== "PUT" && requestMethod !== "PATCH") {
|
|
41
|
+
this.#body = null;
|
|
42
|
+
this.#bodyParsed = true;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const contentLength = parseInt(this.#headers.get("Content-Length") || "0", 10);
|
|
47
|
+
if (!contentLength) {
|
|
48
|
+
this.#body = null;
|
|
49
|
+
this.#bodyParsed = true;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const req = this.#raw;
|
|
54
|
+
const contentType = this.#headers.get("Content-Type") || "application/json";
|
|
55
|
+
if (contentType.includes("json")) {
|
|
56
|
+
this.#body = {
|
|
57
|
+
type: "json",
|
|
58
|
+
value: await req.json(),
|
|
59
|
+
};
|
|
60
|
+
} else if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
61
|
+
const bodyText = await req.text();
|
|
62
|
+
this.#body = {
|
|
63
|
+
type: "form",
|
|
64
|
+
value: qs.parse(bodyText),
|
|
65
|
+
};
|
|
66
|
+
} else if (contentType.startsWith("multipart/form-data")) {
|
|
67
|
+
this.#body = {
|
|
68
|
+
type: "form-data",
|
|
69
|
+
value: await parseFormDataBody(req, { all: true }),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
this.#bodyParsed = true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get rawRequest(): Request {
|
|
76
|
+
return this.#raw;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
get headers(): Headers {
|
|
80
|
+
return this.#headers;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
get cookies(): Record<string, string> {
|
|
84
|
+
if (!this.#parsedCookies) {
|
|
85
|
+
this.#parsedCookies = getCookies(this.#headers);
|
|
86
|
+
}
|
|
87
|
+
return this.#parsedCookies;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
get body(): RapidRequestBody {
|
|
91
|
+
if (!this.#bodyParsed) {
|
|
92
|
+
throw new Error("Request body not parsed, you should call 'parseBody()' method before getting the body.");
|
|
93
|
+
}
|
|
94
|
+
return this.#body;
|
|
95
|
+
}
|
|
96
|
+
}
|