evaengine 1.0.14 → 2.0.0

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.
Files changed (199) hide show
  1. package/README.md +15 -1
  2. package/bin/engine +2 -31
  3. package/dist/bin.d.ts +1 -0
  4. package/dist/bin.js +40 -0
  5. package/dist/bin.js.map +1 -0
  6. package/{src/commands/index.js → dist/commands/index.d.ts} +1 -8
  7. package/dist/commands/index.js +6 -0
  8. package/dist/commands/index.js.map +1 -0
  9. package/dist/commands/interface.d.ts +18 -0
  10. package/dist/commands/interface.js +40 -0
  11. package/dist/commands/interface.js.map +1 -0
  12. package/dist/commands/make_entity.d.ts +47 -0
  13. package/dist/commands/make_entity.js +410 -0
  14. package/dist/commands/make_entity.js.map +1 -0
  15. package/dist/commands/tramp.d.ts +7 -0
  16. package/dist/commands/tramp.js +29 -0
  17. package/dist/commands/tramp.js.map +1 -0
  18. package/dist/config/index.d.ts +92 -0
  19. package/dist/config/index.js +96 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/di.d.ts +73 -0
  22. package/dist/di.js +76 -0
  23. package/dist/di.js.map +1 -0
  24. package/dist/engine.d.ts +85 -0
  25. package/dist/engine.js +404 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/entities/index.d.ts +54 -0
  28. package/dist/entities/index.js +228 -0
  29. package/dist/entities/index.js.map +1 -0
  30. package/dist/exceptions/index.d.ts +153 -0
  31. package/dist/exceptions/index.js +439 -0
  32. package/dist/exceptions/index.js.map +1 -0
  33. package/dist/index.d.ts +45 -0
  34. package/dist/index.js +45 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/middlewares/auth.d.ts +5 -0
  37. package/dist/middlewares/auth.js +63 -0
  38. package/dist/middlewares/auth.js.map +1 -0
  39. package/dist/middlewares/auth_kong.d.ts +2 -0
  40. package/dist/middlewares/auth_kong.js +24 -0
  41. package/dist/middlewares/auth_kong.js.map +1 -0
  42. package/dist/middlewares/debug.d.ts +3 -0
  43. package/dist/middlewares/debug.js +50 -0
  44. package/dist/middlewares/debug.js.map +1 -0
  45. package/{src/middlewares/index.js → dist/middlewares/index.d.ts} +1 -11
  46. package/dist/middlewares/index.js +9 -0
  47. package/dist/middlewares/index.js.map +1 -0
  48. package/dist/middlewares/providers.d.ts +25 -0
  49. package/dist/middlewares/providers.js +63 -0
  50. package/dist/middlewares/providers.js.map +1 -0
  51. package/dist/middlewares/session.d.ts +6 -0
  52. package/dist/middlewares/session.js +51 -0
  53. package/dist/middlewares/session.js.map +1 -0
  54. package/dist/middlewares/trace.d.ts +52 -0
  55. package/dist/middlewares/trace.js +225 -0
  56. package/dist/middlewares/trace.js.map +1 -0
  57. package/dist/middlewares/validator.d.ts +10 -0
  58. package/dist/middlewares/validator.js +43 -0
  59. package/dist/middlewares/validator.js.map +1 -0
  60. package/dist/middlewares/view_cache.d.ts +14 -0
  61. package/dist/middlewares/view_cache.js +102 -0
  62. package/dist/middlewares/view_cache.js.map +1 -0
  63. package/dist/services/cache.d.ts +66 -0
  64. package/dist/services/cache.js +207 -0
  65. package/dist/services/cache.js.map +1 -0
  66. package/dist/services/config.d.ts +25 -0
  67. package/dist/services/config.js +88 -0
  68. package/dist/services/config.js.map +1 -0
  69. package/dist/services/env.d.ts +12 -0
  70. package/dist/services/env.js +24 -0
  71. package/dist/services/env.js.map +1 -0
  72. package/dist/services/event_manager.d.ts +29 -0
  73. package/dist/services/event_manager.js +75 -0
  74. package/dist/services/event_manager.js.map +1 -0
  75. package/dist/services/http_client.d.ts +66 -0
  76. package/dist/services/http_client.js +62 -0
  77. package/dist/services/http_client.js.map +1 -0
  78. package/{src/services/index.js → dist/services/index.d.ts} +1 -15
  79. package/dist/services/index.js +14 -0
  80. package/dist/services/index.js.map +1 -0
  81. package/{src/services/interface.js → dist/services/interface.d.ts} +1 -3
  82. package/dist/services/interface.js +6 -0
  83. package/dist/services/interface.js.map +1 -0
  84. package/{src/services/joi.js → dist/services/joi.d.ts} +2 -9
  85. package/dist/services/joi.js +11 -0
  86. package/dist/services/joi.js.map +1 -0
  87. package/dist/services/jwt_token.d.ts +24 -0
  88. package/dist/services/jwt_token.js +77 -0
  89. package/dist/services/jwt_token.js.map +1 -0
  90. package/dist/services/jwt_token_kong.d.ts +25 -0
  91. package/dist/services/jwt_token_kong.js +65 -0
  92. package/dist/services/jwt_token_kong.js.map +1 -0
  93. package/dist/services/logger.d.ts +30 -0
  94. package/dist/services/logger.js +126 -0
  95. package/dist/services/logger.js.map +1 -0
  96. package/dist/services/namespace.d.ts +55 -0
  97. package/dist/services/namespace.js +157 -0
  98. package/dist/services/namespace.js.map +1 -0
  99. package/dist/services/now.d.ts +14 -0
  100. package/dist/services/now.js +43 -0
  101. package/dist/services/now.js.map +1 -0
  102. package/dist/services/providers.d.ts +55 -0
  103. package/dist/services/providers.js +134 -0
  104. package/dist/services/providers.js.map +1 -0
  105. package/dist/services/redis.d.ts +18 -0
  106. package/dist/services/redis.js +53 -0
  107. package/dist/services/redis.js.map +1 -0
  108. package/dist/services/rest_client.d.ts +48 -0
  109. package/dist/services/rest_client.js +96 -0
  110. package/dist/services/rest_client.js.map +1 -0
  111. package/dist/swagger/index.d.ts +223 -0
  112. package/dist/swagger/index.js +564 -0
  113. package/dist/swagger/index.js.map +1 -0
  114. package/dist/types/express.d.ts +14 -0
  115. package/dist/types/vendor.d.ts +102 -0
  116. package/dist/utils/api_scaffold.d.ts +74 -0
  117. package/dist/utils/api_scaffold.js +220 -0
  118. package/dist/utils/api_scaffold.js.map +1 -0
  119. package/dist/utils/case_converter.d.ts +7 -0
  120. package/dist/utils/case_converter.js +29 -0
  121. package/dist/utils/case_converter.js.map +1 -0
  122. package/dist/utils/crc32.d.ts +2 -0
  123. package/dist/utils/crc32.js +43 -0
  124. package/dist/utils/crc32.js.map +1 -0
  125. package/dist/utils/cron.d.ts +27 -0
  126. package/dist/utils/cron.js +186 -0
  127. package/dist/utils/cron.js.map +1 -0
  128. package/dist/utils/datetime.d.ts +4 -0
  129. package/dist/utils/datetime.js +6 -0
  130. package/dist/utils/datetime.js.map +1 -0
  131. package/dist/utils/host.d.ts +18 -0
  132. package/dist/utils/host.js +33 -0
  133. package/dist/utils/host.js.map +1 -0
  134. package/{src/utils/index.js → dist/utils/index.d.ts} +2 -26
  135. package/dist/utils/index.js +12 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/dist/utils/pagination.d.ts +150 -0
  138. package/dist/utils/pagination.js +242 -0
  139. package/dist/utils/pagination.js.map +1 -0
  140. package/dist/utils/random.d.ts +3 -0
  141. package/dist/utils/random.js +18 -0
  142. package/dist/utils/random.js.map +1 -0
  143. package/dist/utils/request_client.d.ts +33 -0
  144. package/dist/utils/request_client.js +153 -0
  145. package/dist/utils/request_client.js.map +1 -0
  146. package/dist/utils/smart_query.d.ts +144 -0
  147. package/dist/utils/smart_query.js +310 -0
  148. package/dist/utils/smart_query.js.map +1 -0
  149. package/dist/utils/test.d.ts +14 -0
  150. package/dist/utils/test.js +37 -0
  151. package/dist/utils/test.js.map +1 -0
  152. package/dist/utils/wrapper.d.ts +3 -0
  153. package/dist/utils/wrapper.js +5 -0
  154. package/dist/utils/wrapper.js.map +1 -0
  155. package/package.json +24 -10
  156. package/index.js +0 -2
  157. package/src/commands/interface.js +0 -45
  158. package/src/commands/make_entity.js +0 -490
  159. package/src/commands/tramp.js +0 -34
  160. package/src/config/index.js +0 -95
  161. package/src/di.js +0 -96
  162. package/src/engine.js +0 -556
  163. package/src/entities/index.js +0 -272
  164. package/src/exceptions/index.js +0 -501
  165. package/src/index.js +0 -55
  166. package/src/middlewares/auth.js +0 -67
  167. package/src/middlewares/auth_kong.js +0 -28
  168. package/src/middlewares/debug.js +0 -88
  169. package/src/middlewares/providers.js +0 -73
  170. package/src/middlewares/session.js +0 -63
  171. package/src/middlewares/trace.js +0 -254
  172. package/src/middlewares/validator.js +0 -50
  173. package/src/middlewares/view_cache.js +0 -127
  174. package/src/services/cache.js +0 -223
  175. package/src/services/config.js +0 -115
  176. package/src/services/env.js +0 -28
  177. package/src/services/event_manager.js +0 -84
  178. package/src/services/http_client.js +0 -69
  179. package/src/services/jwt_token.js +0 -89
  180. package/src/services/jwt_token_kong.js +0 -75
  181. package/src/services/logger.js +0 -150
  182. package/src/services/namespace.js +0 -176
  183. package/src/services/now.js +0 -49
  184. package/src/services/providers.js +0 -158
  185. package/src/services/redis.js +0 -63
  186. package/src/services/rest_client.js +0 -112
  187. package/src/swagger/index.js +0 -665
  188. package/src/utils/api_scaffold.js +0 -240
  189. package/src/utils/case_converter.js +0 -33
  190. package/src/utils/crc32.js +0 -44
  191. package/src/utils/cron.js +0 -208
  192. package/src/utils/datetime.js +0 -13
  193. package/src/utils/host.js +0 -39
  194. package/src/utils/pagination.js +0 -260
  195. package/src/utils/random.js +0 -23
  196. package/src/utils/request_client.js +0 -179
  197. package/src/utils/smart_query.js +0 -352
  198. package/src/utils/test.js +0 -48
  199. package/src/utils/wrapper.js +0 -8
@@ -0,0 +1,102 @@
1
+ import constitute from 'constitute';
2
+ import crypto from 'crypto';
3
+ import moment from 'moment-timezone';
4
+ import Logger from "../services/logger.js";
5
+ import Cache from "../services/cache.js";
6
+ import wrapper from "../utils/wrapper.js";
7
+ import { RuntimeException } from "../exceptions/index.js";
8
+ export const defaultHashStrategy = (obj) => obj;
9
+ export const defaultHeadersFilter = (res) => {
10
+ const headers = [];
11
+ ['Content-Type'].forEach((key) => {
12
+ const value = res.get(key);
13
+ if (value) {
14
+ headers.push([key, value]);
15
+ }
16
+ });
17
+ return headers;
18
+ };
19
+ export const requestToCacheKey = (req, hashStrategy) => {
20
+ const { method, originalUrl, query: originQuery, route } = req;
21
+ //Prefer uid resolved by auth middleware, keep req.uid as custom rule fallback
22
+ const uid = (req.auth && req.auth.uid) || req.uid || null;
23
+ const query = { ...originQuery };
24
+ delete query.flush;
25
+ if (hashStrategy && typeof hashStrategy !== 'function') {
26
+ throw new RuntimeException(`View cache hash strategy must be a function for ${originalUrl}`);
27
+ }
28
+ if (!route) {
29
+ throw new RuntimeException(`View cache middleware require route for ${originalUrl}`);
30
+ }
31
+ if (method.toLowerCase() !== 'get') {
32
+ throw new RuntimeException(`View cache middleware only support GET method of http request for ${originalUrl}`);
33
+ }
34
+ const { host = 'unknown' } = req.headers;
35
+ const [urlPath = ''] = originalUrl.split('?');
36
+ const key = [method, `/${host}`, urlPath].join('').replace(/:/g, '_').toLowerCase();
37
+ const strategy = hashStrategy || defaultHashStrategy;
38
+ const hash = crypto
39
+ .createHash('md5')
40
+ .update(JSON
41
+ //hashStrategy 已由上方守卫收窄为函数,unknown 真值收窄丢失函数形态,按调用形态断言
42
+ .stringify(strategy({
43
+ method,
44
+ urlPath,
45
+ query,
46
+ uid
47
+ })))
48
+ .digest('hex');
49
+ return [key, hash].join(':');
50
+ };
51
+ function ViewCacheMiddleware(cache, logger) {
52
+ return (options = {}) => {
53
+ if (options === null || typeof options !== 'object') {
54
+ options = {
55
+ ttl: options
56
+ };
57
+ }
58
+ const { ttl, headersFilter, namespace, hashStrategy } = Object.assign({
59
+ ttl: 60,
60
+ headersFilter: defaultHeadersFilter,
61
+ hashStrategy: defaultHashStrategy,
62
+ namespace: 'view'
63
+ }, options);
64
+ return wrapper(async (req, res, next) => {
65
+ const cacheKey = requestToCacheKey(req, hashStrategy);
66
+ const { headers: cachedHeaders = [], body: cachedBody } = ((await cache.namespace(namespace).get(cacheKey)) || {
67
+ headers: [],
68
+ body: null
69
+ });
70
+ if (req.query.flush !== 'true' && cachedBody) {
71
+ logger.debug('View cache hit by key %s', cacheKey);
72
+ if (cachedHeaders.length > 0) {
73
+ cachedHeaders.forEach(([key, value]) => {
74
+ res.setHeader(key, value);
75
+ });
76
+ }
77
+ res.setHeader('X-View-Cache-Hit', cacheKey);
78
+ res.send(cachedBody);
79
+ return;
80
+ }
81
+ res.realSend = res.send;
82
+ res.send = ((body) => {
83
+ logger.debug('View cache missed by key %s, creating...', cacheKey);
84
+ res.setHeader('X-View-Cache-Miss', cacheKey);
85
+ res.setHeader('X-View-Cache-Expire-At', moment().add(ttl, 'minute').format('YYYY-MM-DD HH:mm:ss Z'));
86
+ res.setHeader('X-View-Cache-Created-At', moment().format('YYYY-MM-DD HH:mm:ss Z'));
87
+ res.realSend(body);
88
+ const headers = headersFilter && typeof headersFilter === 'function' ?
89
+ headersFilter(res) : defaultHeadersFilter(res);
90
+ if (res.statusCode <= 500) {
91
+ cache.namespace(namespace).set(cacheKey, { headers, body }, ttl).catch((e) => {
92
+ logger.error('View cache set failed for %s: %o', cacheKey, e);
93
+ });
94
+ }
95
+ });
96
+ next();
97
+ });
98
+ };
99
+ }
100
+ constitute.Dependencies(Cache, Logger)(ViewCacheMiddleware);
101
+ export default ViewCacheMiddleware;
102
+ //# sourceMappingURL=view_cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view_cache.js","sourceRoot":"","sources":["../../src/middlewares/view_cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import Config from './config.js';
2
+ import ServiceInterface from './interface.js';
3
+ import type { Redis as RedisClient } from 'ioredis';
4
+ export declare class Store {
5
+ getInstance(): unknown;
6
+ has(...args: unknown[]): Promise<boolean | number>;
7
+ get(...args: unknown[]): Promise<unknown>;
8
+ set(...args: unknown[]): Promise<unknown>;
9
+ del(...args: unknown[]): Promise<unknown>;
10
+ flush(): Promise<unknown>;
11
+ tags(): unknown;
12
+ }
13
+ export declare class NullStore extends Store {
14
+ constructor(...args: unknown[]);
15
+ namespace(): this;
16
+ tags(): this;
17
+ }
18
+ export declare class RedisNamespaceStore extends Store {
19
+ prefix: string;
20
+ namespace: string;
21
+ redis: RedisClient;
22
+ constructor(prefix: string, namespace: string, redis: RedisClient);
23
+ getInstance(): RedisClient;
24
+ has(key: string): Promise<boolean>;
25
+ key(key: string): string;
26
+ get(key: string): Promise<unknown>;
27
+ del(key: string): Promise<number>;
28
+ set(key: string, value: unknown, minutes?: number, mutex?: string): Promise<unknown>;
29
+ flush(): Promise<number>;
30
+ }
31
+ export declare class RedisStore extends Store {
32
+ prefix: string;
33
+ namespaceHandler: Record<string, RedisNamespaceStore>;
34
+ redis: RedisClient;
35
+ constructor(prefix: string, redis?: RedisClient | null);
36
+ getInstance(): RedisClient;
37
+ namespace(namespace: string): RedisNamespaceStore;
38
+ has(key: string): Promise<number>;
39
+ key(key: string): string;
40
+ get(key: string): Promise<unknown>;
41
+ del(key: string): Promise<number>;
42
+ set(key: string, value: unknown, minutes?: number, mutex?: string): Promise<unknown>;
43
+ flush(): Promise<'OK'>;
44
+ }
45
+ interface CacheConfig {
46
+ prefix?: string;
47
+ driver?: string;
48
+ }
49
+ declare class Cache extends ServiceInterface {
50
+ config: CacheConfig;
51
+ prefix: string;
52
+ driver: string | undefined;
53
+ store: Store | null;
54
+ constructor(config: Config);
55
+ setStore(store: Store): this;
56
+ getStore(): Store;
57
+ setPrefix(prefix: string): void;
58
+ getPrefix(): string;
59
+ namespace(...args: [namespace: string]): NullStore | RedisNamespaceStore;
60
+ has(key: string): Promise<boolean | number>;
61
+ get(key: string): Promise<unknown>;
62
+ set(...args: unknown[]): Promise<unknown>;
63
+ del(...args: unknown[]): Promise<unknown>;
64
+ flush(): Promise<unknown>;
65
+ }
66
+ export default Cache;
@@ -0,0 +1,207 @@
1
+ import constitute from 'constitute';
2
+ import { OperationUnsupportedException } from "../exceptions/index.js";
3
+ import Redis from "./redis.js";
4
+ import DI from "../di.js";
5
+ import Config from "./config.js";
6
+ import ServiceInterface from "./interface.js";
7
+ export class Store {
8
+ getInstance() {
9
+ return this;
10
+ }
11
+ // Concrete stores forward their arguments to the underlying redis client
12
+ // while these base implementations are no-ops that accept and ignore
13
+ // whatever is passed, as in the original JS signatures.
14
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
15
+ has(...args) {
16
+ return Promise.resolve(false);
17
+ }
18
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
19
+ get(...args) {
20
+ return Promise.resolve(null);
21
+ }
22
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
23
+ set(...args) {
24
+ return Promise.resolve(this);
25
+ }
26
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
27
+ del(...args) {
28
+ return Promise.resolve(this);
29
+ }
30
+ flush() {
31
+ return Promise.resolve(true);
32
+ }
33
+ tags() {
34
+ throw new OperationUnsupportedException('Not support tag feature');
35
+ }
36
+ }
37
+ export class NullStore extends Store {
38
+ // Accepts and ignores the prefix argument, as the implicit constructor did.
39
+ constructor(...args) {
40
+ super(...args);
41
+ }
42
+ namespace() {
43
+ return this;
44
+ }
45
+ tags() {
46
+ return this;
47
+ }
48
+ }
49
+ export class RedisNamespaceStore extends Store {
50
+ prefix;
51
+ namespace;
52
+ redis;
53
+ constructor(prefix, namespace, redis) {
54
+ super();
55
+ this.prefix = prefix;
56
+ this.namespace = namespace;
57
+ this.redis = redis;
58
+ }
59
+ getInstance() {
60
+ return this.redis;
61
+ }
62
+ has(key) {
63
+ return this.redis.exists(this.key(key)).then(res => res > 0);
64
+ }
65
+ key(key) {
66
+ return this.prefix ? [this.prefix, this.namespace, key].join(':') : key;
67
+ }
68
+ get(key) {
69
+ return this.redis.get(this.key(key)).then(res => JSON.parse(res));
70
+ }
71
+ del(key) {
72
+ return this.redis.del(this.key(key));
73
+ }
74
+ set(key, value, minutes, mutex) {
75
+ const args = [
76
+ this.key(key),
77
+ JSON.stringify(value)
78
+ ];
79
+ if (minutes) {
80
+ args.push('ex', minutes * 60);
81
+ }
82
+ if (mutex) {
83
+ const m = mutex.toUpperCase();
84
+ if (m === 'NX' || m === 'XX') {
85
+ args.push(m);
86
+ }
87
+ }
88
+ // ioredis types SET as fixed overloads without a variadic spread form, so
89
+ // the dynamically built argument list is asserted to keep the call shape.
90
+ return this.redis.set(...args);
91
+ }
92
+ flush() {
93
+ return this.redis.keys([this.prefix, this.namespace, '*'].join(':'))
94
+ .then((keys) => {
95
+ if (keys.length) {
96
+ return this.redis.del(keys);
97
+ }
98
+ return 0;
99
+ });
100
+ }
101
+ }
102
+ export class RedisStore extends Store {
103
+ prefix;
104
+ namespaceHandler;
105
+ redis;
106
+ constructor(prefix, redis) {
107
+ super();
108
+ this.prefix = prefix;
109
+ this.namespaceHandler = {};
110
+ this.redis = redis || DI.get('redis').getInstance();
111
+ }
112
+ getInstance() {
113
+ return this.redis;
114
+ }
115
+ namespace(namespace) {
116
+ if ({}.hasOwnProperty.call(this.namespaceHandler, namespace)) {
117
+ return this.namespaceHandler[namespace];
118
+ }
119
+ this.namespaceHandler[namespace] = new RedisNamespaceStore(this.prefix, namespace, this.redis);
120
+ return this.namespaceHandler[namespace];
121
+ }
122
+ has(key) {
123
+ return this.redis.exists(this.key(key));
124
+ }
125
+ key(key) {
126
+ return this.prefix ? [this.prefix, key].join(':') : key;
127
+ }
128
+ get(key) {
129
+ return this.redis.get(this.key(key)).then(res => JSON.parse(res));
130
+ }
131
+ del(key) {
132
+ return this.redis.del(this.key(key));
133
+ }
134
+ set(key, value, minutes, mutex) {
135
+ const args = [
136
+ this.key(key),
137
+ JSON.stringify(value)
138
+ ];
139
+ if (minutes) {
140
+ args.push('ex', minutes * 60);
141
+ }
142
+ if (mutex) {
143
+ const m = mutex.toUpperCase();
144
+ if (m === 'NX' || m === 'XX') {
145
+ args.push(m);
146
+ }
147
+ }
148
+ // ioredis types SET as fixed overloads without a variadic spread form, so
149
+ // the dynamically built argument list is asserted to keep the call shape.
150
+ return this.redis.set(...args);
151
+ }
152
+ flush() {
153
+ return this.redis.flushall();
154
+ }
155
+ }
156
+ class Cache extends ServiceInterface {
157
+ config;
158
+ prefix;
159
+ driver;
160
+ store;
161
+ constructor(config) {
162
+ super();
163
+ this.config = config.get('cache');
164
+ this.prefix = this.config.prefix || 'eva';
165
+ this.driver = this.config.driver;
166
+ this.store = null;
167
+ }
168
+ setStore(store) {
169
+ this.store = store;
170
+ return this;
171
+ }
172
+ getStore() {
173
+ if (this.store) {
174
+ return this.store;
175
+ }
176
+ this.store = this.driver === 'redis' ?
177
+ new RedisStore(this.prefix) : new NullStore(this.prefix);
178
+ return this.store;
179
+ }
180
+ setPrefix(prefix) {
181
+ this.prefix = prefix;
182
+ }
183
+ getPrefix() {
184
+ return this.prefix;
185
+ }
186
+ namespace(...args) {
187
+ return this.getStore().namespace(...args);
188
+ }
189
+ has(key) {
190
+ return this.getStore().has(key);
191
+ }
192
+ get(key) {
193
+ return this.getStore().get(key);
194
+ }
195
+ set(...args) {
196
+ return this.getStore().set(...args);
197
+ }
198
+ del(...args) {
199
+ return this.getStore().del(...args);
200
+ }
201
+ flush() {
202
+ return this.getStore().flush();
203
+ }
204
+ }
205
+ constitute.Dependencies(Config, Redis)(Cache);
206
+ export default Cache;
207
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import Env from './env.js';
2
+ import ServiceInterface from './interface.js';
3
+ declare class Config extends ServiceInterface {
4
+ env: Env;
5
+ path: string | null | undefined;
6
+ mergedFiles: string[];
7
+ config: object | null;
8
+ constructor(env: Env);
9
+ setPath(path: string | undefined): this;
10
+ /**
11
+ * Resolve configurations from Spring Cloud Config Server.
12
+ */
13
+ resolveSpringConfig({ endpoint, name, profiles, label }: {
14
+ endpoint: string;
15
+ name: string;
16
+ profiles?: string | string[];
17
+ label?: string;
18
+ }): Promise<void>;
19
+ get(key?: string): unknown;
20
+ loadConfigFromFiles(): object;
21
+ getMergedFiles(): string[];
22
+ reload(): void;
23
+ static search(keyString: unknown, target: object): unknown;
24
+ }
25
+ export default Config;
@@ -0,0 +1,88 @@
1
+ import get from 'lodash/get.js';
2
+ import isString from 'lodash/isString.js';
3
+ import merge from 'lodash/merge.js';
4
+ import set from 'lodash/set.js';
5
+ import { createRequire } from 'module';
6
+ import constitute from 'constitute';
7
+ import * as springConfigClient from 'cloud-config-client';
8
+ import Env from "./env.js";
9
+ import EngineConfig from "../config/index.js";
10
+ import ServiceInterface from "./interface.js";
11
+ const require = createRequire(import.meta.url);
12
+ class Config extends ServiceInterface {
13
+ env;
14
+ path;
15
+ mergedFiles;
16
+ config;
17
+ constructor(env) {
18
+ super();
19
+ this.env = env;
20
+ this.path = null;
21
+ this.mergedFiles = [];
22
+ this.config = null;
23
+ }
24
+ setPath(path) {
25
+ this.path = path;
26
+ return this;
27
+ }
28
+ /**
29
+ * Resolve configurations from Spring Cloud Config Server.
30
+ */
31
+ async resolveSpringConfig({ endpoint, name, profiles, label = 'main' }) {
32
+ if (!this.config) {
33
+ this.config = this.loadConfigFromFiles();
34
+ }
35
+ const configRemote = await springConfigClient.load({
36
+ endpoint,
37
+ name,
38
+ profiles: isString(profiles) ? profiles.split(',') : [],
39
+ label
40
+ });
41
+ configRemote.forEach((key, value) => {
42
+ set(this.config, key, value);
43
+ });
44
+ }
45
+ get(key) {
46
+ if (this.config) {
47
+ return key ? Config.search(key, this.config) : this.config;
48
+ }
49
+ this.config = this.loadConfigFromFiles();
50
+ return key ? Config.search(key, this.config) : this.config;
51
+ }
52
+ loadConfigFromFiles() {
53
+ const env = this.env.get();
54
+ const configPath = this.path;
55
+ const pathDefault = `${configPath}/config.default.cjs`;
56
+ const pathEnv = `${configPath}/config.${env}.cjs`;
57
+ const pathLocal = `${configPath}/config.local.${env}.cjs`;
58
+ const configDefault = require(pathDefault);
59
+ this.mergedFiles.push(pathDefault);
60
+ const configEnv = require(pathEnv);
61
+ this.mergedFiles.push(pathEnv);
62
+ let configLocal = {};
63
+ try {
64
+ configLocal = require(pathLocal);
65
+ this.mergedFiles.push(pathLocal);
66
+ }
67
+ catch {
68
+ configLocal = {};
69
+ }
70
+ return merge({}, EngineConfig, configDefault, configEnv, configLocal);
71
+ }
72
+ getMergedFiles() {
73
+ return this.mergedFiles;
74
+ }
75
+ reload() {
76
+ this.config = null;
77
+ this.mergedFiles = [];
78
+ }
79
+ static search(keyString, target) {
80
+ if (typeof keyString !== 'string') {
81
+ return target;
82
+ }
83
+ return get(target, keyString);
84
+ }
85
+ }
86
+ constitute.Dependencies(Env)(Config);
87
+ export default Config;
88
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import ServiceInterface from './interface.js';
2
+ export declare const TYPES: {
3
+ PRODUCTION: string;
4
+ TEST: string;
5
+ DEVELOPMENT: string;
6
+ };
7
+ export default class Env extends ServiceInterface {
8
+ get(): string;
9
+ isTest(): boolean;
10
+ isProduction(): boolean;
11
+ isDevelopment(): boolean;
12
+ }
@@ -0,0 +1,24 @@
1
+ import ServiceInterface from "./interface.js";
2
+ let env = null;
3
+ export const TYPES = {
4
+ PRODUCTION: 'production',
5
+ TEST: 'test',
6
+ DEVELOPMENT: 'development'
7
+ };
8
+ export default class Env extends ServiceInterface {
9
+ get() {
10
+ env = [TYPES.PRODUCTION, TYPES.TEST, TYPES.DEVELOPMENT].indexOf(process.env.NODE_ENV) > -1
11
+ ? process.env.NODE_ENV : TYPES.DEVELOPMENT;
12
+ return env;
13
+ }
14
+ isTest() {
15
+ return this.get() === TYPES.TEST;
16
+ }
17
+ isProduction() {
18
+ return this.get() === TYPES.PRODUCTION;
19
+ }
20
+ isDevelopment() {
21
+ return this.get() === TYPES.DEVELOPMENT;
22
+ }
23
+ }
24
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/services/env.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,gBAAgB,CAAC;AAE9C,IAAI,GAAG,GAAkB,IAAI,CAAC;AAC9B,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,gBAAgB;IAC/C,GAAG;QACD,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAkB,CAAC,GAAG,CAAC,CAAC;YAClG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QACvD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,WAAW,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import EventEmitter from 'events';
2
+ import Logger from './logger.js';
3
+ import ServiceInterface from './interface.js';
4
+ interface EventListener {
5
+ prefix: string;
6
+ actions: string[];
7
+ }
8
+ /**
9
+ * A strict version of EventEmitter
10
+ * 1. listener must be a standard class
11
+ * 2. unregistered event not allow to emit
12
+ * 3. all events register and trigger will be recorded
13
+ */
14
+ declare class EventManager extends ServiceInterface {
15
+ logger: Logger;
16
+ emitter: EventEmitter;
17
+ events: Set<string>;
18
+ constructor(logger: Logger);
19
+ getProto(): typeof EventEmitter;
20
+ getAllowEvents(): Set<string>;
21
+ getEmitter(): EventEmitter;
22
+ /**
23
+ * Allow to register a class such like
24
+ * class Foo { get prefix(){ return 'foo'} get actions() { return ['bar']} }
25
+ */
26
+ addListener(ListenerClass: new () => EventListener): this;
27
+ emit(eventName: string, callback?: unknown): boolean;
28
+ }
29
+ export default EventManager;
@@ -0,0 +1,75 @@
1
+ import constitute from 'constitute';
2
+ import EventEmitter from 'events';
3
+ import camelCase from 'lodash/camelCase.js';
4
+ import { RuntimeException } from "../exceptions/index.js";
5
+ import Logger from "./logger.js";
6
+ import ServiceInterface from "./interface.js";
7
+ /**
8
+ * A strict version of EventEmitter
9
+ * 1. listener must be a standard class
10
+ * 2. unregistered event not allow to emit
11
+ * 3. all events register and trigger will be recorded
12
+ */
13
+ class EventManager extends ServiceInterface {
14
+ logger;
15
+ emitter;
16
+ events;
17
+ constructor(logger) {
18
+ super();
19
+ this.logger = logger;
20
+ this.emitter = new EventEmitter();
21
+ this.events = new Set();
22
+ }
23
+ getProto() {
24
+ return EventEmitter;
25
+ }
26
+ getAllowEvents() {
27
+ return this.events;
28
+ }
29
+ getEmitter() {
30
+ //TODO: 屏蔽写入
31
+ return this.emitter;
32
+ }
33
+ /**
34
+ * Allow to register a class such like
35
+ * class Foo { get prefix(){ return 'foo'} get actions() { return ['bar']} }
36
+ */
37
+ addListener(ListenerClass) {
38
+ if (typeof ListenerClass !== 'function') {
39
+ throw new RuntimeException('Not a standard listener input');
40
+ }
41
+ const listener = new ListenerClass();
42
+ const { prefix, actions } = listener;
43
+ if (!prefix || !actions) {
44
+ throw new RuntimeException('Not a standard listener input');
45
+ }
46
+ const events = {};
47
+ const eventsCount = this.events.size;
48
+ for (const action of actions) {
49
+ events[[prefix, action, 'before'].join(':')] = camelCase(['before', action].join('_'));
50
+ events[[prefix, action, 'after'].join(':')] = camelCase(['after', action].join('_'));
51
+ }
52
+ //TODO: 用Set保存注册的事件
53
+ for (const [eventName, callback] of Object.entries(events)) {
54
+ this.events.add(eventName);
55
+ if (Reflect.has(listener, callback) === false) {
56
+ continue;
57
+ }
58
+ this.emitter.addListener(eventName, listener[callback]);
59
+ }
60
+ if (eventsCount + Object.keys(events).length !== this.events.size) {
61
+ throw new RuntimeException('Repeated event name has been registered, please check');
62
+ }
63
+ // this.logger.debug('Registered events', this.emitter.eventNames());
64
+ return this;
65
+ }
66
+ emit(eventName, callback) {
67
+ if (!this.events.has(eventName)) {
68
+ throw new RuntimeException(`Event ${eventName} not registered yet`);
69
+ }
70
+ return this.emitter.emit(eventName, callback);
71
+ }
72
+ }
73
+ constitute.Dependencies(Logger)(EventManager);
74
+ export default EventManager;
75
+ //# sourceMappingURL=event_manager.js.map