@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,45 +1,45 @@
|
|
|
1
|
-
import { memoize, set } from "lodash";
|
|
2
|
-
|
|
3
|
-
const genExpression = memoize(
|
|
4
|
-
(varNames: string[], expressionString: string) => {
|
|
5
|
-
// eslint-disable-next-line no-new-func
|
|
6
|
-
return new Function(...varNames, `return (${expressionString})`);
|
|
7
|
-
},
|
|
8
|
-
(varNames, expressionString) => {
|
|
9
|
-
return varNames.join(",") + ":" + expressionString;
|
|
10
|
-
},
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
export function interpreteExpression(expressionString: string, rootVars: Record<string, any>) {
|
|
14
|
-
const varNames = [];
|
|
15
|
-
const varValues = [];
|
|
16
|
-
for (const name in rootVars) {
|
|
17
|
-
varNames.push(name);
|
|
18
|
-
varValues.push(rootVars[name]);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let result;
|
|
22
|
-
try {
|
|
23
|
-
const expression = genExpression(varNames, expressionString);
|
|
24
|
-
result = expression(...varValues);
|
|
25
|
-
} catch (err: any) {
|
|
26
|
-
console.error(`Expression interprete error. expression: '${expressionString}', error:`, err.message);
|
|
27
|
-
}
|
|
28
|
-
return result;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function interpreteConfigExpressions(config: Record<string, any>, vars: Record<string, any>) {
|
|
32
|
-
if (!config) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const propExpressions = config.$exps;
|
|
37
|
-
if (!propExpressions) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
for (const propName in propExpressions) {
|
|
42
|
-
const propValue = interpreteExpression(propExpressions[propName], vars);
|
|
43
|
-
set(config, propName, propValue);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
1
|
+
import { memoize, set } from "lodash";
|
|
2
|
+
|
|
3
|
+
const genExpression = memoize(
|
|
4
|
+
(varNames: string[], expressionString: string) => {
|
|
5
|
+
// eslint-disable-next-line no-new-func
|
|
6
|
+
return new Function(...varNames, `return (${expressionString})`);
|
|
7
|
+
},
|
|
8
|
+
(varNames, expressionString) => {
|
|
9
|
+
return varNames.join(",") + ":" + expressionString;
|
|
10
|
+
},
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export function interpreteExpression(expressionString: string, rootVars: Record<string, any>) {
|
|
14
|
+
const varNames = [];
|
|
15
|
+
const varValues = [];
|
|
16
|
+
for (const name in rootVars) {
|
|
17
|
+
varNames.push(name);
|
|
18
|
+
varValues.push(rootVars[name]);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let result;
|
|
22
|
+
try {
|
|
23
|
+
const expression = genExpression(varNames, expressionString);
|
|
24
|
+
result = expression(...varValues);
|
|
25
|
+
} catch (err: any) {
|
|
26
|
+
console.error(`Expression interprete error. expression: '${expressionString}', error:`, err.message);
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function interpreteConfigExpressions(config: Record<string, any>, vars: Record<string, any>) {
|
|
32
|
+
if (!config) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const propExpressions = config.$exps;
|
|
37
|
+
if (!propExpressions) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
for (const propName in propExpressions) {
|
|
42
|
+
const propValue = interpreteExpression(propExpressions[propName], vars);
|
|
43
|
+
set(config, propName, propValue);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { RpdApplicationConfig } from "~/types";
|
|
2
|
-
import { IRpdServer, RapidPlugin } from "./server";
|
|
3
|
-
import { Next, RouteContext } from "./routeContext";
|
|
4
|
-
import { Logger } from "~/facilities/log/LogFacility";
|
|
5
|
-
import { CronJobConfiguration } from "~/types/cron-job-types";
|
|
6
|
-
|
|
7
|
-
export interface ActionHandlerContext {
|
|
8
|
-
logger: Logger;
|
|
9
|
-
routerContext: RouteContext;
|
|
10
|
-
next?: Next;
|
|
11
|
-
server: IRpdServer;
|
|
12
|
-
vars?: Record<string, any>;
|
|
13
|
-
input?: any;
|
|
14
|
-
output?: any;
|
|
15
|
-
results: any[];
|
|
16
|
-
status?: Response["status"];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export type ActionHandler = (ctx: ActionHandlerContext, options: any) => void | Promise<void>;
|
|
20
|
-
|
|
21
|
-
export interface IPluginActionHandler {
|
|
22
|
-
code: string;
|
|
23
|
-
handler: (plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) => void | Promise<void>;
|
|
24
|
-
}
|
|
1
|
+
import { RpdApplicationConfig } from "~/types";
|
|
2
|
+
import { IRpdServer, RapidPlugin } from "./server";
|
|
3
|
+
import { Next, RouteContext } from "./routeContext";
|
|
4
|
+
import { Logger } from "~/facilities/log/LogFacility";
|
|
5
|
+
import { CronJobConfiguration } from "~/types/cron-job-types";
|
|
6
|
+
|
|
7
|
+
export interface ActionHandlerContext {
|
|
8
|
+
logger: Logger;
|
|
9
|
+
routerContext: RouteContext;
|
|
10
|
+
next?: Next;
|
|
11
|
+
server: IRpdServer;
|
|
12
|
+
vars?: Record<string, any>;
|
|
13
|
+
input?: any;
|
|
14
|
+
output?: any;
|
|
15
|
+
results: any[];
|
|
16
|
+
status?: Response["status"];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type ActionHandler = (ctx: ActionHandlerContext, options: any) => void | Promise<void>;
|
|
20
|
+
|
|
21
|
+
export interface IPluginActionHandler {
|
|
22
|
+
code: string;
|
|
23
|
+
handler: (plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) => void | Promise<void>;
|
|
24
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { ActionHandler, ActionHandlerContext, IPluginActionHandler } from "~/core/actionHandler";
|
|
2
|
-
import { generatePasswordHash, validatePassword } from "~/utilities/passwordUtility";
|
|
3
|
-
import { interpreteConfigExpressions, interpreteExpression } from "../ExpressionInterpreter";
|
|
4
|
-
import { RpdRouteActionConfig } from "~/types";
|
|
5
|
-
|
|
6
|
-
export const code = "if";
|
|
7
|
-
|
|
8
|
-
export type IfActionHandlerConfig = {
|
|
9
|
-
condition: string;
|
|
10
|
-
then: RpdRouteActionConfig[];
|
|
11
|
-
otherwise: RpdRouteActionConfig[];
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export async function handler(_plugin: any, ctx: ActionHandlerContext, options: IfActionHandlerConfig) {
|
|
15
|
-
const { server, input, routerContext: routeContext } = ctx;
|
|
16
|
-
const { response } = routeContext;
|
|
17
|
-
const { condition, then, otherwise } = options;
|
|
18
|
-
|
|
19
|
-
const conditionResult = interpreteExpression(condition, ctx.vars);
|
|
20
|
-
const actions: RpdRouteActionConfig[] = conditionResult ? then : otherwise;
|
|
21
|
-
if (!actions || !actions.length) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
await server.runActionHandlers(ctx, actions);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export default { code, handler } as IPluginActionHandler;
|
|
1
|
+
import { ActionHandler, ActionHandlerContext, IPluginActionHandler } from "~/core/actionHandler";
|
|
2
|
+
import { generatePasswordHash, validatePassword } from "~/utilities/passwordUtility";
|
|
3
|
+
import { interpreteConfigExpressions, interpreteExpression } from "../ExpressionInterpreter";
|
|
4
|
+
import { RpdRouteActionConfig } from "~/types";
|
|
5
|
+
|
|
6
|
+
export const code = "if";
|
|
7
|
+
|
|
8
|
+
export type IfActionHandlerConfig = {
|
|
9
|
+
condition: string;
|
|
10
|
+
then: RpdRouteActionConfig[];
|
|
11
|
+
otherwise: RpdRouteActionConfig[];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export async function handler(_plugin: any, ctx: ActionHandlerContext, options: IfActionHandlerConfig) {
|
|
15
|
+
const { server, input, routerContext: routeContext } = ctx;
|
|
16
|
+
const { response } = routeContext;
|
|
17
|
+
const { condition, then, otherwise } = options;
|
|
18
|
+
|
|
19
|
+
const conditionResult = interpreteExpression(condition, ctx.vars);
|
|
20
|
+
const actions: RpdRouteActionConfig[] = conditionResult ? then : otherwise;
|
|
21
|
+
if (!actions || !actions.length) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await server.runActionHandlers(ctx, actions);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default { code, handler } as IPluginActionHandler;
|
package/src/core/eventManager.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { EventEmitter } from "events";
|
|
2
|
-
|
|
3
|
-
export default class EventManager<EventTypes extends Record<string, any[]>> {
|
|
4
|
-
#eventEmitter: EventEmitter;
|
|
5
|
-
|
|
6
|
-
constructor() {
|
|
7
|
-
this.#eventEmitter = new EventEmitter();
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
on<K extends keyof EventTypes>(eventName: K, listener: (...args: EventTypes[K]) => void) {
|
|
11
|
-
this.#eventEmitter.on(eventName as string, listener);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
async emit<K extends keyof EventTypes>(eventName: K, ...args: EventTypes[K]) {
|
|
15
|
-
const listeners = this.#eventEmitter.listeners(eventName as string);
|
|
16
|
-
for (const listener of listeners) {
|
|
17
|
-
await listener(...args);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
|
|
3
|
+
export default class EventManager<EventTypes extends Record<string, any[]>> {
|
|
4
|
+
#eventEmitter: EventEmitter;
|
|
5
|
+
|
|
6
|
+
constructor() {
|
|
7
|
+
this.#eventEmitter = new EventEmitter();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
on<K extends keyof EventTypes>(eventName: K, listener: (...args: EventTypes[K]) => void) {
|
|
11
|
+
this.#eventEmitter.on(eventName as string, listener);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async emit<K extends keyof EventTypes>(eventName: K, ...args: EventTypes[K]) {
|
|
15
|
+
const listeners = this.#eventEmitter.listeners(eventName as string);
|
|
16
|
+
for (const listener of listeners) {
|
|
17
|
+
await listener(...args);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
package/src/core/facility.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { IRpdServer } from "./server";
|
|
2
|
-
|
|
3
|
-
export interface FacilityFactory<TFacility = any, TCreateFacilityOptions = any> {
|
|
4
|
-
name: string;
|
|
5
|
-
|
|
6
|
-
createFacility: (server: IRpdServer, options?: TCreateFacilityOptions) => Promise<TFacility>;
|
|
7
|
-
}
|
|
1
|
+
import { IRpdServer } from "./server";
|
|
2
|
+
|
|
3
|
+
export interface FacilityFactory<TFacility = any, TCreateFacilityOptions = any> {
|
|
4
|
+
name: string;
|
|
5
|
+
|
|
6
|
+
createFacility: (server: IRpdServer, options?: TCreateFacilityOptions) => Promise<TFacility>;
|
|
7
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
export type BodyData = Record<string, string | File | (string | File)[]>;
|
|
2
|
-
export type ParseBodyOptions = {
|
|
3
|
-
/**
|
|
4
|
-
* Parse all fields with multiple values should be parsed as an array.
|
|
5
|
-
* @default false
|
|
6
|
-
* @example
|
|
7
|
-
* ```ts
|
|
8
|
-
* const data = new FormData()
|
|
9
|
-
* data.append('file', 'aaa')
|
|
10
|
-
* data.append('file', 'bbb')
|
|
11
|
-
* data.append('message', 'hello')
|
|
12
|
-
* ```
|
|
13
|
-
*
|
|
14
|
-
* If `all` is `false`:
|
|
15
|
-
* parseBody should return `{ file: 'bbb', message: 'hello' }`
|
|
16
|
-
*
|
|
17
|
-
* If `all` is `true`:
|
|
18
|
-
* parseBody should return `{ file: ['aaa', 'bbb'], message: 'hello' }`
|
|
19
|
-
*/
|
|
20
|
-
all?: boolean;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const parseFormDataBody = async <T extends BodyData = BodyData>(request: Request, options: ParseBodyOptions = { all: false }): Promise<T> => {
|
|
24
|
-
const contentType = request.headers.get("Content-Type");
|
|
25
|
-
|
|
26
|
-
if (isFormDataContent(contentType)) {
|
|
27
|
-
return parseFormData<T>(request, options);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return {} as T;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
function isFormDataContent(contentType: string | null): boolean {
|
|
34
|
-
if (contentType === null) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return contentType.startsWith("multipart/form-data") || contentType.startsWith("application/x-www-form-urlencoded");
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async function parseFormData<T extends BodyData = BodyData>(request: Request, options: ParseBodyOptions): Promise<T> {
|
|
42
|
-
const formData = await (request as Request).formData();
|
|
43
|
-
|
|
44
|
-
if (formData) {
|
|
45
|
-
return convertFormDataToBodyData<T>(formData, options);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return {} as T;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function convertFormDataToBodyData<T extends BodyData = BodyData>(formData: FormData, options: ParseBodyOptions): T {
|
|
52
|
-
const form: BodyData = {};
|
|
53
|
-
|
|
54
|
-
formData.forEach((value, key) => {
|
|
55
|
-
const shouldParseAllValues = options.all || key.endsWith("[]");
|
|
56
|
-
|
|
57
|
-
if (!shouldParseAllValues) {
|
|
58
|
-
form[key] = value;
|
|
59
|
-
} else {
|
|
60
|
-
handleParsingAllValues(form, key, value);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return form as T;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const handleParsingAllValues = (form: BodyData, key: string, value: FormDataEntryValue): void => {
|
|
68
|
-
if (form[key] && isArrayField(form[key])) {
|
|
69
|
-
appendToExistingArray(form[key] as (string | File)[], value);
|
|
70
|
-
} else if (form[key]) {
|
|
71
|
-
convertToNewArray(form, key, value);
|
|
72
|
-
} else {
|
|
73
|
-
form[key] = value;
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
function isArrayField(field: unknown): field is (string | File)[] {
|
|
78
|
-
return Array.isArray(field);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const appendToExistingArray = (arr: (string | File)[], value: FormDataEntryValue): void => {
|
|
82
|
-
arr.push(value);
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const convertToNewArray = (form: BodyData, key: string, value: FormDataEntryValue): void => {
|
|
86
|
-
form[key] = [form[key] as string | File, value];
|
|
87
|
-
};
|
|
1
|
+
export type BodyData = Record<string, string | File | (string | File)[]>;
|
|
2
|
+
export type ParseBodyOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Parse all fields with multiple values should be parsed as an array.
|
|
5
|
+
* @default false
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const data = new FormData()
|
|
9
|
+
* data.append('file', 'aaa')
|
|
10
|
+
* data.append('file', 'bbb')
|
|
11
|
+
* data.append('message', 'hello')
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* If `all` is `false`:
|
|
15
|
+
* parseBody should return `{ file: 'bbb', message: 'hello' }`
|
|
16
|
+
*
|
|
17
|
+
* If `all` is `true`:
|
|
18
|
+
* parseBody should return `{ file: ['aaa', 'bbb'], message: 'hello' }`
|
|
19
|
+
*/
|
|
20
|
+
all?: boolean;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const parseFormDataBody = async <T extends BodyData = BodyData>(request: Request, options: ParseBodyOptions = { all: false }): Promise<T> => {
|
|
24
|
+
const contentType = request.headers.get("Content-Type");
|
|
25
|
+
|
|
26
|
+
if (isFormDataContent(contentType)) {
|
|
27
|
+
return parseFormData<T>(request, options);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return {} as T;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function isFormDataContent(contentType: string | null): boolean {
|
|
34
|
+
if (contentType === null) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return contentType.startsWith("multipart/form-data") || contentType.startsWith("application/x-www-form-urlencoded");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function parseFormData<T extends BodyData = BodyData>(request: Request, options: ParseBodyOptions): Promise<T> {
|
|
42
|
+
const formData = await (request as Request).formData();
|
|
43
|
+
|
|
44
|
+
if (formData) {
|
|
45
|
+
return convertFormDataToBodyData<T>(formData, options);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return {} as T;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function convertFormDataToBodyData<T extends BodyData = BodyData>(formData: FormData, options: ParseBodyOptions): T {
|
|
52
|
+
const form: BodyData = {};
|
|
53
|
+
|
|
54
|
+
formData.forEach((value, key) => {
|
|
55
|
+
const shouldParseAllValues = options.all || key.endsWith("[]");
|
|
56
|
+
|
|
57
|
+
if (!shouldParseAllValues) {
|
|
58
|
+
form[key] = value;
|
|
59
|
+
} else {
|
|
60
|
+
handleParsingAllValues(form, key, value);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return form as T;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const handleParsingAllValues = (form: BodyData, key: string, value: FormDataEntryValue): void => {
|
|
68
|
+
if (form[key] && isArrayField(form[key])) {
|
|
69
|
+
appendToExistingArray(form[key] as (string | File)[], value);
|
|
70
|
+
} else if (form[key]) {
|
|
71
|
+
convertToNewArray(form, key, value);
|
|
72
|
+
} else {
|
|
73
|
+
form[key] = value;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
function isArrayField(field: unknown): field is (string | File)[] {
|
|
78
|
+
return Array.isArray(field);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const appendToExistingArray = (arr: (string | File)[], value: FormDataEntryValue): void => {
|
|
82
|
+
arr.push(value);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const convertToNewArray = (form: BodyData, key: string, value: FormDataEntryValue): void => {
|
|
86
|
+
form[key] = [form[key] as string | File, value];
|
|
87
|
+
};
|
package/src/core/http-types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type HttpStatus = number;
|
|
2
|
-
export type ResponseData = string | ArrayBuffer | ReadableStream;
|
|
3
|
-
|
|
4
|
-
export type HeadersDefinition = [string, string][] | Record<string, string>;
|
|
1
|
+
export type HttpStatus = number;
|
|
2
|
+
export type ResponseData = string | ArrayBuffer | ReadableStream;
|
|
3
|
+
|
|
4
|
+
export type HeadersDefinition = [string, string][] | Record<string, string>;
|