evaengine 1.0.14 → 3.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.
- package/README.md +15 -7
- package/bin/engine +2 -31
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +32 -0
- package/dist/bin.js.map +1 -0
- package/{src/commands/index.js → dist/commands/index.d.ts} +1 -8
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/interface.d.ts +18 -0
- package/dist/commands/interface.js +40 -0
- package/dist/commands/interface.js.map +1 -0
- package/dist/commands/make_entity.d.ts +47 -0
- package/dist/commands/make_entity.js +410 -0
- package/dist/commands/make_entity.js.map +1 -0
- package/dist/commands/tramp.d.ts +7 -0
- package/dist/commands/tramp.js +29 -0
- package/dist/commands/tramp.js.map +1 -0
- package/dist/config/index.d.ts +92 -0
- package/dist/config/index.js +96 -0
- package/dist/config/index.js.map +1 -0
- package/dist/di.d.ts +131 -0
- package/dist/di.js +197 -0
- package/dist/di.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.js +404 -0
- package/dist/engine.js.map +1 -0
- package/dist/entities/index.d.ts +54 -0
- package/dist/entities/index.js +228 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/exceptions/index.d.ts +153 -0
- package/dist/exceptions/index.js +466 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/auth.d.ts +5 -0
- package/dist/middlewares/auth.js +63 -0
- package/dist/middlewares/auth.js.map +1 -0
- package/dist/middlewares/auth_kong.d.ts +2 -0
- package/dist/middlewares/auth_kong.js +24 -0
- package/dist/middlewares/auth_kong.js.map +1 -0
- package/dist/middlewares/debug.d.ts +3 -0
- package/dist/middlewares/debug.js +50 -0
- package/dist/middlewares/debug.js.map +1 -0
- package/{src/middlewares/index.js → dist/middlewares/index.d.ts} +1 -11
- package/dist/middlewares/index.js +9 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/providers.d.ts +25 -0
- package/dist/middlewares/providers.js +63 -0
- package/dist/middlewares/providers.js.map +1 -0
- package/dist/middlewares/session.d.ts +5 -0
- package/dist/middlewares/session.js +46 -0
- package/dist/middlewares/session.js.map +1 -0
- package/dist/middlewares/trace.d.ts +52 -0
- package/dist/middlewares/trace.js +225 -0
- package/dist/middlewares/trace.js.map +1 -0
- package/dist/middlewares/validator.d.ts +10 -0
- package/dist/middlewares/validator.js +43 -0
- package/dist/middlewares/validator.js.map +1 -0
- package/dist/middlewares/view_cache.d.ts +14 -0
- package/dist/middlewares/view_cache.js +102 -0
- package/dist/middlewares/view_cache.js.map +1 -0
- package/dist/services/cache.d.ts +68 -0
- package/dist/services/cache.js +206 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/config.d.ts +17 -0
- package/dist/services/config.js +67 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/env.d.ts +12 -0
- package/dist/services/env.js +24 -0
- package/dist/services/env.js.map +1 -0
- package/dist/services/event_manager.d.ts +30 -0
- package/dist/services/event_manager.js +74 -0
- package/dist/services/event_manager.js.map +1 -0
- package/dist/services/http_client.d.ts +67 -0
- package/dist/services/http_client.js +61 -0
- package/dist/services/http_client.js.map +1 -0
- package/{src/services/index.js → dist/services/index.d.ts} +1 -15
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -0
- package/{src/services/interface.js → dist/services/interface.d.ts} +1 -3
- package/dist/services/interface.js +6 -0
- package/dist/services/interface.js.map +1 -0
- package/{src/services/joi.js → dist/services/joi.d.ts} +2 -9
- package/dist/services/joi.js +11 -0
- package/dist/services/joi.js.map +1 -0
- package/dist/services/jwt_token.d.ts +25 -0
- package/dist/services/jwt_token.js +76 -0
- package/dist/services/jwt_token.js.map +1 -0
- package/dist/services/jwt_token_kong.d.ts +26 -0
- package/dist/services/jwt_token_kong.js +64 -0
- package/dist/services/jwt_token_kong.js.map +1 -0
- package/dist/services/logger.d.ts +31 -0
- package/dist/services/logger.js +125 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/namespace.d.ts +62 -0
- package/dist/services/namespace.js +171 -0
- package/dist/services/namespace.js.map +1 -0
- package/dist/services/now.d.ts +15 -0
- package/dist/services/now.js +42 -0
- package/dist/services/now.js.map +1 -0
- package/dist/services/providers.d.ts +55 -0
- package/dist/services/providers.js +134 -0
- package/dist/services/providers.js.map +1 -0
- package/dist/services/redis.d.ts +19 -0
- package/dist/services/redis.js +52 -0
- package/dist/services/redis.js.map +1 -0
- package/dist/services/rest_client.d.ts +49 -0
- package/dist/services/rest_client.js +95 -0
- package/dist/services/rest_client.js.map +1 -0
- package/dist/swagger/index.d.ts +223 -0
- package/dist/swagger/index.js +564 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/types/express.d.ts +14 -0
- package/dist/types/vendor.d.ts +30 -0
- package/dist/utils/api_scaffold.d.ts +74 -0
- package/dist/utils/api_scaffold.js +220 -0
- package/dist/utils/api_scaffold.js.map +1 -0
- package/dist/utils/case_converter.d.ts +7 -0
- package/dist/utils/case_converter.js +29 -0
- package/dist/utils/case_converter.js.map +1 -0
- package/dist/utils/crc32.d.ts +2 -0
- package/dist/utils/crc32.js +43 -0
- package/dist/utils/crc32.js.map +1 -0
- package/dist/utils/cron.d.ts +27 -0
- package/dist/utils/cron.js +186 -0
- package/dist/utils/cron.js.map +1 -0
- package/dist/utils/datetime.d.ts +4 -0
- package/dist/utils/datetime.js +6 -0
- package/dist/utils/datetime.js.map +1 -0
- package/dist/utils/host.d.ts +18 -0
- package/dist/utils/host.js +33 -0
- package/dist/utils/host.js.map +1 -0
- package/{src/utils/index.js → dist/utils/index.d.ts} +2 -26
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/jwt.d.ts +16 -0
- package/dist/utils/jwt.js +93 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/pagination.d.ts +150 -0
- package/dist/utils/pagination.js +242 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/random.d.ts +3 -0
- package/dist/utils/random.js +18 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/request_client.d.ts +33 -0
- package/dist/utils/request_client.js +153 -0
- package/dist/utils/request_client.js.map +1 -0
- package/dist/utils/smart_query.d.ts +144 -0
- package/dist/utils/smart_query.js +310 -0
- package/dist/utils/smart_query.js.map +1 -0
- package/dist/utils/test.d.ts +14 -0
- package/dist/utils/test.js +37 -0
- package/dist/utils/test.js.map +1 -0
- package/dist/utils/wrapper.d.ts +3 -0
- package/dist/utils/wrapper.js +5 -0
- package/dist/utils/wrapper.js.map +1 -0
- package/package.json +22 -15
- package/index.js +0 -2
- package/src/commands/interface.js +0 -45
- package/src/commands/make_entity.js +0 -490
- package/src/commands/tramp.js +0 -34
- package/src/config/index.js +0 -95
- package/src/di.js +0 -96
- package/src/engine.js +0 -556
- package/src/entities/index.js +0 -272
- package/src/exceptions/index.js +0 -501
- package/src/index.js +0 -55
- package/src/middlewares/auth.js +0 -67
- package/src/middlewares/auth_kong.js +0 -28
- package/src/middlewares/debug.js +0 -88
- package/src/middlewares/providers.js +0 -73
- package/src/middlewares/session.js +0 -63
- package/src/middlewares/trace.js +0 -254
- package/src/middlewares/validator.js +0 -50
- package/src/middlewares/view_cache.js +0 -127
- package/src/services/cache.js +0 -223
- package/src/services/config.js +0 -115
- package/src/services/env.js +0 -28
- package/src/services/event_manager.js +0 -84
- package/src/services/http_client.js +0 -69
- package/src/services/jwt_token.js +0 -89
- package/src/services/jwt_token_kong.js +0 -75
- package/src/services/logger.js +0 -150
- package/src/services/namespace.js +0 -176
- package/src/services/now.js +0 -49
- package/src/services/providers.js +0 -158
- package/src/services/redis.js +0 -63
- package/src/services/rest_client.js +0 -112
- package/src/swagger/index.js +0 -665
- package/src/utils/api_scaffold.js +0 -240
- package/src/utils/case_converter.js +0 -33
- package/src/utils/crc32.js +0 -44
- package/src/utils/cron.js +0 -208
- package/src/utils/datetime.js +0 -13
- package/src/utils/host.js +0 -39
- package/src/utils/pagination.js +0 -260
- package/src/utils/random.js +0 -23
- package/src/utils/request_client.js +0 -179
- package/src/utils/smart_query.js +0 -352
- package/src/utils/test.js +0 -48
- package/src/utils/wrapper.js +0 -8
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Dependencies } from "../di.js";
|
|
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
|
+
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,68 @@
|
|
|
1
|
+
import Redis from './redis.js';
|
|
2
|
+
import Config from './config.js';
|
|
3
|
+
import ServiceInterface from './interface.js';
|
|
4
|
+
import type { Redis as RedisClient } from 'ioredis';
|
|
5
|
+
export declare class Store {
|
|
6
|
+
getInstance(): unknown;
|
|
7
|
+
has(...args: unknown[]): Promise<boolean | number>;
|
|
8
|
+
get(...args: unknown[]): Promise<unknown>;
|
|
9
|
+
set(...args: unknown[]): Promise<unknown>;
|
|
10
|
+
del(...args: unknown[]): Promise<unknown>;
|
|
11
|
+
flush(): Promise<unknown>;
|
|
12
|
+
tags(): unknown;
|
|
13
|
+
}
|
|
14
|
+
export declare class NullStore extends Store {
|
|
15
|
+
constructor(...args: unknown[]);
|
|
16
|
+
namespace(): this;
|
|
17
|
+
tags(): this;
|
|
18
|
+
}
|
|
19
|
+
export declare class RedisNamespaceStore extends Store {
|
|
20
|
+
prefix: string;
|
|
21
|
+
namespace: string;
|
|
22
|
+
redis: RedisClient;
|
|
23
|
+
constructor(prefix: string, namespace: string, redis: RedisClient);
|
|
24
|
+
getInstance(): RedisClient;
|
|
25
|
+
has(key: string): Promise<boolean>;
|
|
26
|
+
key(key: string): string;
|
|
27
|
+
get(key: string): Promise<unknown>;
|
|
28
|
+
del(key: string): Promise<number>;
|
|
29
|
+
set(key: string, value: unknown, minutes?: number, mutex?: string): Promise<unknown>;
|
|
30
|
+
flush(): Promise<number>;
|
|
31
|
+
}
|
|
32
|
+
export declare class RedisStore extends Store {
|
|
33
|
+
prefix: string;
|
|
34
|
+
namespaceHandler: Record<string, RedisNamespaceStore>;
|
|
35
|
+
redis: RedisClient;
|
|
36
|
+
constructor(prefix: string, redis?: RedisClient | null);
|
|
37
|
+
getInstance(): RedisClient;
|
|
38
|
+
namespace(namespace: string): RedisNamespaceStore;
|
|
39
|
+
has(key: string): Promise<number>;
|
|
40
|
+
key(key: string): string;
|
|
41
|
+
get(key: string): Promise<unknown>;
|
|
42
|
+
del(key: string): Promise<number>;
|
|
43
|
+
set(key: string, value: unknown, minutes?: number, mutex?: string): Promise<unknown>;
|
|
44
|
+
flush(): Promise<'OK'>;
|
|
45
|
+
}
|
|
46
|
+
interface CacheConfig {
|
|
47
|
+
prefix?: string;
|
|
48
|
+
driver?: string;
|
|
49
|
+
}
|
|
50
|
+
declare class Cache extends ServiceInterface {
|
|
51
|
+
config: CacheConfig;
|
|
52
|
+
prefix: string;
|
|
53
|
+
driver: string | undefined;
|
|
54
|
+
store: Store | null;
|
|
55
|
+
static dependencies: (typeof Config | typeof Redis)[];
|
|
56
|
+
constructor(config: Config);
|
|
57
|
+
setStore(store: Store): this;
|
|
58
|
+
getStore(): Store;
|
|
59
|
+
setPrefix(prefix: string): void;
|
|
60
|
+
getPrefix(): string;
|
|
61
|
+
namespace(...args: [namespace: string]): NullStore | RedisNamespaceStore;
|
|
62
|
+
has(key: string): Promise<boolean | number>;
|
|
63
|
+
get(key: string): Promise<unknown>;
|
|
64
|
+
set(...args: unknown[]): Promise<unknown>;
|
|
65
|
+
del(...args: unknown[]): Promise<unknown>;
|
|
66
|
+
flush(): Promise<unknown>;
|
|
67
|
+
}
|
|
68
|
+
export default Cache;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { OperationUnsupportedException } from "../exceptions/index.js";
|
|
2
|
+
import Redis from "./redis.js";
|
|
3
|
+
import DI from "../di.js";
|
|
4
|
+
import Config from "./config.js";
|
|
5
|
+
import ServiceInterface from "./interface.js";
|
|
6
|
+
export class Store {
|
|
7
|
+
getInstance() {
|
|
8
|
+
return this;
|
|
9
|
+
}
|
|
10
|
+
// Concrete stores forward their arguments to the underlying redis client
|
|
11
|
+
// while these base implementations are no-ops that accept and ignore
|
|
12
|
+
// whatever is passed, as in the original JS signatures.
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
14
|
+
has(...args) {
|
|
15
|
+
return Promise.resolve(false);
|
|
16
|
+
}
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
+
get(...args) {
|
|
19
|
+
return Promise.resolve(null);
|
|
20
|
+
}
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
22
|
+
set(...args) {
|
|
23
|
+
return Promise.resolve(this);
|
|
24
|
+
}
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
26
|
+
del(...args) {
|
|
27
|
+
return Promise.resolve(this);
|
|
28
|
+
}
|
|
29
|
+
flush() {
|
|
30
|
+
return Promise.resolve(true);
|
|
31
|
+
}
|
|
32
|
+
tags() {
|
|
33
|
+
throw new OperationUnsupportedException('Not support tag feature');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class NullStore extends Store {
|
|
37
|
+
// Accepts and ignores the prefix argument, as the implicit constructor did.
|
|
38
|
+
constructor(...args) {
|
|
39
|
+
super(...args);
|
|
40
|
+
}
|
|
41
|
+
namespace() {
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
tags() {
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class RedisNamespaceStore extends Store {
|
|
49
|
+
prefix;
|
|
50
|
+
namespace;
|
|
51
|
+
redis;
|
|
52
|
+
constructor(prefix, namespace, redis) {
|
|
53
|
+
super();
|
|
54
|
+
this.prefix = prefix;
|
|
55
|
+
this.namespace = namespace;
|
|
56
|
+
this.redis = redis;
|
|
57
|
+
}
|
|
58
|
+
getInstance() {
|
|
59
|
+
return this.redis;
|
|
60
|
+
}
|
|
61
|
+
has(key) {
|
|
62
|
+
return this.redis.exists(this.key(key)).then(res => res > 0);
|
|
63
|
+
}
|
|
64
|
+
key(key) {
|
|
65
|
+
return this.prefix ? [this.prefix, this.namespace, key].join(':') : key;
|
|
66
|
+
}
|
|
67
|
+
get(key) {
|
|
68
|
+
return this.redis.get(this.key(key)).then(res => JSON.parse(res));
|
|
69
|
+
}
|
|
70
|
+
del(key) {
|
|
71
|
+
return this.redis.del(this.key(key));
|
|
72
|
+
}
|
|
73
|
+
set(key, value, minutes, mutex) {
|
|
74
|
+
const args = [
|
|
75
|
+
this.key(key),
|
|
76
|
+
JSON.stringify(value)
|
|
77
|
+
];
|
|
78
|
+
if (minutes) {
|
|
79
|
+
args.push('ex', minutes * 60);
|
|
80
|
+
}
|
|
81
|
+
if (mutex) {
|
|
82
|
+
const m = mutex.toUpperCase();
|
|
83
|
+
if (m === 'NX' || m === 'XX') {
|
|
84
|
+
args.push(m);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ioredis types SET as fixed overloads without a variadic spread form, so
|
|
88
|
+
// the dynamically built argument list is asserted to keep the call shape.
|
|
89
|
+
return this.redis.set(...args);
|
|
90
|
+
}
|
|
91
|
+
flush() {
|
|
92
|
+
return this.redis.keys([this.prefix, this.namespace, '*'].join(':'))
|
|
93
|
+
.then((keys) => {
|
|
94
|
+
if (keys.length) {
|
|
95
|
+
return this.redis.del(keys);
|
|
96
|
+
}
|
|
97
|
+
return 0;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export class RedisStore extends Store {
|
|
102
|
+
prefix;
|
|
103
|
+
namespaceHandler;
|
|
104
|
+
redis;
|
|
105
|
+
constructor(prefix, redis) {
|
|
106
|
+
super();
|
|
107
|
+
this.prefix = prefix;
|
|
108
|
+
this.namespaceHandler = {};
|
|
109
|
+
this.redis = redis || DI.get('redis').getInstance();
|
|
110
|
+
}
|
|
111
|
+
getInstance() {
|
|
112
|
+
return this.redis;
|
|
113
|
+
}
|
|
114
|
+
namespace(namespace) {
|
|
115
|
+
if ({}.hasOwnProperty.call(this.namespaceHandler, namespace)) {
|
|
116
|
+
return this.namespaceHandler[namespace];
|
|
117
|
+
}
|
|
118
|
+
this.namespaceHandler[namespace] = new RedisNamespaceStore(this.prefix, namespace, this.redis);
|
|
119
|
+
return this.namespaceHandler[namespace];
|
|
120
|
+
}
|
|
121
|
+
has(key) {
|
|
122
|
+
return this.redis.exists(this.key(key));
|
|
123
|
+
}
|
|
124
|
+
key(key) {
|
|
125
|
+
return this.prefix ? [this.prefix, key].join(':') : key;
|
|
126
|
+
}
|
|
127
|
+
get(key) {
|
|
128
|
+
return this.redis.get(this.key(key)).then(res => JSON.parse(res));
|
|
129
|
+
}
|
|
130
|
+
del(key) {
|
|
131
|
+
return this.redis.del(this.key(key));
|
|
132
|
+
}
|
|
133
|
+
set(key, value, minutes, mutex) {
|
|
134
|
+
const args = [
|
|
135
|
+
this.key(key),
|
|
136
|
+
JSON.stringify(value)
|
|
137
|
+
];
|
|
138
|
+
if (minutes) {
|
|
139
|
+
args.push('ex', minutes * 60);
|
|
140
|
+
}
|
|
141
|
+
if (mutex) {
|
|
142
|
+
const m = mutex.toUpperCase();
|
|
143
|
+
if (m === 'NX' || m === 'XX') {
|
|
144
|
+
args.push(m);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ioredis types SET as fixed overloads without a variadic spread form, so
|
|
148
|
+
// the dynamically built argument list is asserted to keep the call shape.
|
|
149
|
+
return this.redis.set(...args);
|
|
150
|
+
}
|
|
151
|
+
flush() {
|
|
152
|
+
return this.redis.flushall();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
class Cache extends ServiceInterface {
|
|
156
|
+
config;
|
|
157
|
+
prefix;
|
|
158
|
+
driver;
|
|
159
|
+
store;
|
|
160
|
+
static dependencies = [Config, Redis];
|
|
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
|
+
export default Cache;
|
|
206
|
+
//# 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,17 @@
|
|
|
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
|
+
static dependencies: (typeof Env)[];
|
|
9
|
+
constructor(env: Env);
|
|
10
|
+
setPath(path: string | undefined): this;
|
|
11
|
+
get(key?: string): unknown;
|
|
12
|
+
loadConfigFromFiles(): object;
|
|
13
|
+
getMergedFiles(): string[];
|
|
14
|
+
reload(): void;
|
|
15
|
+
static search(keyString: unknown, target: object): unknown;
|
|
16
|
+
}
|
|
17
|
+
export default Config;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import get from 'lodash/get.js';
|
|
2
|
+
import merge from 'lodash/merge.js';
|
|
3
|
+
import { createRequire } from 'module';
|
|
4
|
+
import Env from "./env.js";
|
|
5
|
+
import EngineConfig from "../config/index.js";
|
|
6
|
+
import ServiceInterface from "./interface.js";
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
class Config extends ServiceInterface {
|
|
9
|
+
env;
|
|
10
|
+
path;
|
|
11
|
+
mergedFiles;
|
|
12
|
+
config;
|
|
13
|
+
static dependencies = [Env];
|
|
14
|
+
constructor(env) {
|
|
15
|
+
super();
|
|
16
|
+
this.env = env;
|
|
17
|
+
this.path = null;
|
|
18
|
+
this.mergedFiles = [];
|
|
19
|
+
this.config = null;
|
|
20
|
+
}
|
|
21
|
+
setPath(path) {
|
|
22
|
+
this.path = path;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
get(key) {
|
|
26
|
+
if (this.config) {
|
|
27
|
+
return key ? Config.search(key, this.config) : this.config;
|
|
28
|
+
}
|
|
29
|
+
this.config = this.loadConfigFromFiles();
|
|
30
|
+
return key ? Config.search(key, this.config) : this.config;
|
|
31
|
+
}
|
|
32
|
+
loadConfigFromFiles() {
|
|
33
|
+
const env = this.env.get();
|
|
34
|
+
const configPath = this.path;
|
|
35
|
+
const pathDefault = `${configPath}/config.default.cjs`;
|
|
36
|
+
const pathEnv = `${configPath}/config.${env}.cjs`;
|
|
37
|
+
const pathLocal = `${configPath}/config.local.${env}.cjs`;
|
|
38
|
+
const configDefault = require(pathDefault);
|
|
39
|
+
this.mergedFiles.push(pathDefault);
|
|
40
|
+
const configEnv = require(pathEnv);
|
|
41
|
+
this.mergedFiles.push(pathEnv);
|
|
42
|
+
let configLocal = {};
|
|
43
|
+
try {
|
|
44
|
+
configLocal = require(pathLocal);
|
|
45
|
+
this.mergedFiles.push(pathLocal);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
configLocal = {};
|
|
49
|
+
}
|
|
50
|
+
return merge({}, EngineConfig, configDefault, configEnv, configLocal);
|
|
51
|
+
}
|
|
52
|
+
getMergedFiles() {
|
|
53
|
+
return this.mergedFiles;
|
|
54
|
+
}
|
|
55
|
+
reload() {
|
|
56
|
+
this.config = null;
|
|
57
|
+
this.mergedFiles = [];
|
|
58
|
+
}
|
|
59
|
+
static search(keyString, target) {
|
|
60
|
+
if (typeof keyString !== 'string') {
|
|
61
|
+
return target;
|
|
62
|
+
}
|
|
63
|
+
return get(target, keyString);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export default Config;
|
|
67
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,gBAAgB,CAAC;AAE9C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,MAAO,SAAQ,gBAAgB;IACnC,GAAG,CAAM;IACT,IAAI,CAA4B;IAChC,WAAW,CAAW;IACtB,MAAM,CAAgB;IAEtB,MAAM,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;IAE5B,YAAY,GAAQ;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,IAAwB;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAY;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzC,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC7D,CAAC;IAED,mBAAmB;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7B,MAAM,WAAW,GAAG,GAAG,UAAU,qBAAqB,CAAC;QACvD,MAAM,OAAO,GAAG,GAAG,UAAU,WAAW,GAAG,MAAM,CAAC;QAClD,MAAM,SAAS,GAAG,GAAG,UAAU,iBAAiB,GAAG,MAAM,CAAC;QAG1D,MAAM,aAAa,GAAY,OAAO,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,SAAS,GAAY,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,WAAW,GAAY,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;QAGD,OAAO,KAAK,CAAC,EAAE,EAAE,YAAY,EAAE,aAAuB,EAAE,SAAmB,EAAE,WAAqB,CAAC,CAAC;IACtG,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,SAAkB,EAAE,MAAc;QAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;;AAGH,eAAe,MAAM,CAAC"}
|
|
@@ -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,30 @@
|
|
|
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
|
+
static dependencies: (typeof Logger)[];
|
|
19
|
+
constructor(logger: Logger);
|
|
20
|
+
getProto(): typeof EventEmitter;
|
|
21
|
+
getAllowEvents(): Set<string>;
|
|
22
|
+
getEmitter(): EventEmitter;
|
|
23
|
+
/**
|
|
24
|
+
* Allow to register a class such like
|
|
25
|
+
* class Foo { get prefix(){ return 'foo'} get actions() { return ['bar']} }
|
|
26
|
+
*/
|
|
27
|
+
addListener(ListenerClass: new () => EventListener): this;
|
|
28
|
+
emit(eventName: string, callback?: unknown): boolean;
|
|
29
|
+
}
|
|
30
|
+
export default EventManager;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import camelCase from 'lodash/camelCase.js';
|
|
3
|
+
import { RuntimeException } from "../exceptions/index.js";
|
|
4
|
+
import Logger from "./logger.js";
|
|
5
|
+
import ServiceInterface from "./interface.js";
|
|
6
|
+
/**
|
|
7
|
+
* A strict version of EventEmitter
|
|
8
|
+
* 1. listener must be a standard class
|
|
9
|
+
* 2. unregistered event not allow to emit
|
|
10
|
+
* 3. all events register and trigger will be recorded
|
|
11
|
+
*/
|
|
12
|
+
class EventManager extends ServiceInterface {
|
|
13
|
+
logger;
|
|
14
|
+
emitter;
|
|
15
|
+
events;
|
|
16
|
+
static dependencies = [Logger];
|
|
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
|
+
export default EventManager;
|
|
74
|
+
//# sourceMappingURL=event_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event_manager.js","sourceRoot":"","sources":["../../src/services/event_manager.ts"],"names":[],"mappings":"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"}
|