@similie/hyphen-command-server-types 1.0.0 → 1.0.4
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/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/modules/index.d.ts +2 -2
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +2 -2
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loader.d.ts +1 -1
- package/dist/modules/loader.d.ts.map +1 -1
- package/dist/modules/types.d.ts +1 -1
- package/dist/modules/types.d.ts.map +1 -1
- package/dist/services/index.d.ts +6 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +6 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/jwt.d.ts +12 -0
- package/dist/services/jwt.d.ts.map +1 -0
- package/dist/services/jwt.js +36 -0
- package/dist/services/jwt.js.map +1 -0
- package/dist/services/leader-lock.d.ts.map +1 -1
- package/dist/services/leader-lock.js +1 -1
- package/dist/services/leader-lock.js.map +1 -1
- package/dist/services/objectq.d.ts +39 -0
- package/dist/services/objectq.d.ts.map +1 -0
- package/dist/services/objectq.js +201 -0
- package/dist/services/objectq.js.map +1 -0
- package/dist/services/secrets.d.ts +14 -0
- package/dist/services/secrets.d.ts.map +1 -0
- package/dist/services/secrets.js +44 -0
- package/dist/services/secrets.js.map +1 -0
- package/dist/services/sql.d.ts +27 -0
- package/dist/services/sql.d.ts.map +1 -0
- package/dist/services/sql.js +86 -0
- package/dist/services/sql.js.map +1 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/utils.d.ts +1 -1
- package/dist/tools/utils.d.ts.map +1 -1
- package/package.json +11 -1
- package/CHANGELOG.md +0 -5
- package/src/index.ts +0 -4
- package/src/models/base-model.ts +0 -13
- package/src/models/index.ts +0 -1
- package/src/modules/index.ts +0 -2
- package/src/modules/loader.ts +0 -67
- package/src/modules/types.ts +0 -40
- package/src/services/index.ts +0 -2
- package/src/services/leader-lock.ts +0 -113
- package/src/services/redis.ts +0 -69
- package/src/tools/index.ts +0 -1
- package/src/tools/utils.ts +0 -349
- package/tsconfig.json +0 -46
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from "./models";
|
|
2
|
-
export * from "./tools";
|
|
3
|
-
export * from "./services";
|
|
4
|
-
export * from "./modules";
|
|
1
|
+
export * from "./models/index.js";
|
|
2
|
+
export * from "./tools/index.js";
|
|
3
|
+
export * from "./services/index.js";
|
|
4
|
+
export * from "./modules/index.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from "./models";
|
|
2
|
-
export * from "./tools";
|
|
3
|
-
export * from "./services";
|
|
4
|
-
export * from "./modules";
|
|
1
|
+
export * from "./models/index.js";
|
|
2
|
+
export * from "./tools/index.js";
|
|
3
|
+
export * from "./services/index.js";
|
|
4
|
+
export * from "./modules/index.js";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
|
package/dist/models/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./base-model";
|
|
1
|
+
export * from "./base-model.js";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/dist/models/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./base-model";
|
|
1
|
+
export * from "./base-model.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/models/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/dist/modules/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from "./types";
|
|
2
|
-
export * from "./loader";
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./loader.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
package/dist/modules/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from "./types";
|
|
2
|
-
export * from "./loader";
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./loader.js";
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
package/dist/modules/loader.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ModuleContext, LoadedModule } from "./types";
|
|
1
|
+
import type { ModuleContext, LoadedModule } from "./types.js";
|
|
2
2
|
export declare function loadModulesFromEnv(ctx: ModuleContext): Promise<LoadedModule[]>;
|
|
3
3
|
export declare function shutdownModules(ctx: ModuleContext, loaded: LoadedModule[]): Promise<void>;
|
|
4
4
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/modules/loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,aAAa,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/modules/loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5E,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CA6CzB;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,YAAY,EAAE,iBAYvB"}
|
package/dist/modules/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RedisCache, LeaderElector } from "../services";
|
|
1
|
+
import type { RedisCache, LeaderElector } from "../services/index.js";
|
|
2
2
|
import type { Ellipsies } from "@similie/ellipsies";
|
|
3
3
|
export type EllipsiesInstance = Ellipsies;
|
|
4
4
|
export type CommandCenterSystemIdentity = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/modules/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/modules/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE1C,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,OAAO,UAAU,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IACvC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAE7B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,IAAI,CACF,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC/B,CAAC"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export * from "./leader-lock";
|
|
2
|
-
export * from "./redis";
|
|
1
|
+
export * from "./leader-lock.js";
|
|
2
|
+
export * from "./redis.js";
|
|
3
|
+
export * from "./jwt.js";
|
|
4
|
+
export * from "./sql.js";
|
|
5
|
+
export * from "./objectq.js";
|
|
6
|
+
export * from "./secrets.js";
|
|
3
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
package/dist/services/index.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export * from "./leader-lock";
|
|
2
|
-
export * from "./redis";
|
|
1
|
+
export * from "./leader-lock.js";
|
|
2
|
+
export * from "./redis.js";
|
|
3
|
+
export * from "./jwt.js";
|
|
4
|
+
export * from "./sql.js";
|
|
5
|
+
export * from "./objectq.js";
|
|
6
|
+
export * from "./secrets.js";
|
|
3
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import jwt, { type SignOptions } from "jsonwebtoken";
|
|
2
|
+
import { type ExpressResponse } from "@similie/ellipsies";
|
|
3
|
+
export declare const signToken: (payload: object, expiresIn?: SignOptions["expiresIn"]) => string;
|
|
4
|
+
export declare const verifyToken: (token: string) => string | jwt.JwtPayload | null;
|
|
5
|
+
export declare const decodeToken: (token: string) => string | jwt.JwtPayload | null;
|
|
6
|
+
export declare const verifyTokenValidity: (req: {
|
|
7
|
+
headers: {
|
|
8
|
+
authentication?: string;
|
|
9
|
+
};
|
|
10
|
+
user?: any;
|
|
11
|
+
}, res: ExpressResponse) => boolean;
|
|
12
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/services/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,SAAS,GACpB,SAAS,MAAM,EACf,YAAW,WAAW,CAAC,WAAW,CAAQ,WAI3C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,mCAOxC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,mCAExC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,KAAK;IACH,OAAO,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,EACD,KAAK,eAAe,YAerB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import jwt, {} from "jsonwebtoken";
|
|
2
|
+
import {} from "@similie/ellipsies";
|
|
3
|
+
export const signToken = (payload, expiresIn = "1h") => {
|
|
4
|
+
const JWT_SECRET = process.env.JWT_CLIENT_SECRET ?? "your_jwt_secret";
|
|
5
|
+
return jwt.sign(payload, JWT_SECRET, { expiresIn });
|
|
6
|
+
};
|
|
7
|
+
export const verifyToken = (token) => {
|
|
8
|
+
try {
|
|
9
|
+
const JWT_SECRET = process.env.JWT_CLIENT_SECRET || "your_jwt_secret";
|
|
10
|
+
return jwt.verify(token, JWT_SECRET);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
export const decodeToken = (token) => {
|
|
17
|
+
return jwt.decode(token);
|
|
18
|
+
};
|
|
19
|
+
export const verifyTokenValidity = (req, res) => {
|
|
20
|
+
const token = req.headers.authentication?.split(" ")[1];
|
|
21
|
+
if (!token)
|
|
22
|
+
return false;
|
|
23
|
+
const decoded = verifyToken(token);
|
|
24
|
+
if (!decoded)
|
|
25
|
+
return false;
|
|
26
|
+
const { exp, user } = decoded;
|
|
27
|
+
if (!exp)
|
|
28
|
+
return false;
|
|
29
|
+
const valid = Date.now() < exp * 1000;
|
|
30
|
+
if (valid) {
|
|
31
|
+
res.locals.user = decoded;
|
|
32
|
+
req.user = decoded && user ? user : undefined;
|
|
33
|
+
}
|
|
34
|
+
return valid;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/services/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAiC,MAAM,cAAc,CAAC;AAElE,OAAO,EAAwB,MAAM,oBAAoB,CAAC;AAE1D,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAAe,EACf,YAAsC,IAAI,EAC1C,EAAE;IACF,MAAM,UAAU,GAAW,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;IAC9E,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;QACtE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE;IAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,GAGC,EACD,GAAoB,EACpB,EAAE;IACF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAuC,CAAC;IAC9D,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;QAC1B,GAAG,CAAC,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leader-lock.d.ts","sourceRoot":"","sources":["../../src/services/leader-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"leader-lock.d.ts","sourceRoot":"","sources":["../../src/services/leader-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,IAAI,CAAC,CAAmB;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAE3C,OAAO;IAIP,MAAM,CAAC,GAAG,IAAI,aAAa;IAK3B,IAAI,CAAC,QAAQ,EAAE,MAAM;IAYrB,gEAAgE;IAChE,QAAQ,IAAI,OAAO;IAInB,+CAA+C;IACzC,QAAQ;IASd,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,cAAc;YAcR,UAAU;YAMV,WAAW;CAU1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leader-lock.js","sourceRoot":"","sources":["../../src/services/leader-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,OAAO,
|
|
1
|
+
{"version":3,"file":"leader-lock.js","sourceRoot":"","sources":["../../src/services/leader-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAQpC,MAAM,OAAO,aAAc,SAAQ,YAAY;IACrC,MAAM,CAAC,QAAQ,CAAgB;IAC/B,OAAO,CAAW;IAClB,KAAK,CAAS;IACd,UAAU,CAAkB;IAC5B,YAAY,CAAkB;IAC9B,IAAI,CAAoB;IAEf,OAAO,GAAG,kBAAkB,CAAC;IAC7B,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW;IAC1B,YAAY,GAAG,IAAI,CAAC,CAAC,0BAA0B;IAC/C,YAAY,GAAG,IAAI,CAAC,CAAC,0BAA0B;IAC/C,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC,0BAA0B;IAEtE;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,MAAM,CAAC,GAAG;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,QAAgB;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACvC,mEAAmE;YACnE,4CAA4C;YAC5C,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,gEAAgE;IAChE,QAAQ;QACN,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,QAAQ;QACZ,YAAY,CAAC,IAAI,CAAC,YAAmB,CAAC,CAAC;QACvC,aAAa,CAAC,IAAI,CAAC,UAAiB,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,6BAA6B;IAErB,gBAAgB;QACtB,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;YAC5B,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,iBAAiB;YAExC,IAAI,CAAC;gBACH,gDAAgD;gBAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC;QAEF,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAY,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,cAAc;QACpB,aAAa,CAAC,IAAI,CAAC,UAAiB,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO;YACvB,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,+DAA+D;gBAC/D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,8DAA8D;YAChE,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,aAAa,CAAC,IAAI,CAAC,UAAiB,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SimilieQuery — a safe, human-friendly mini rule language for JSON filtering.
|
|
3
|
+
*/
|
|
4
|
+
export declare class SimilieQuery {
|
|
5
|
+
/**
|
|
6
|
+
* Interpolates placeholders like {device.identity} or {config.apn}
|
|
7
|
+
* in a string or object template using deep path lookup.
|
|
8
|
+
*
|
|
9
|
+
* Supports nested objects, arrays, and strings.
|
|
10
|
+
* Escaped braces {{ ... }} are preserved.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const tpl = "Device={device.identity} APN={config.apn}";
|
|
14
|
+
* SimilieQuery.interpolate(tpl, { device: { identity: "A1" }, config: { apn: "timor" } });
|
|
15
|
+
* // → "Device=A1 APN=timor"
|
|
16
|
+
*/
|
|
17
|
+
static interpolate(template: any, data: Record<string, any>): any;
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* @param obj The object to query
|
|
21
|
+
* @param path The path to the property, e.g. "a.b[0].c"
|
|
22
|
+
* @param defaultValue The value to return if the path does not exist
|
|
23
|
+
* @returns The value at the specified path or the default value if not found
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const data = { device: { identity: "abc123", info: [{ name: "sensor1" }] } };
|
|
27
|
+
* console.log(get(data, "device.identity")); // "abc123"
|
|
28
|
+
* console.log(get(data, "device.info[0].name")); // "sensor1"
|
|
29
|
+
* console.log(get(data, "device.info[1].name", "N/A"));// "N/A"
|
|
30
|
+
*/
|
|
31
|
+
static get(obj: any, path: string, defaultValue?: any): any;
|
|
32
|
+
static evaluate(expr: string, data: Record<string, any>): boolean;
|
|
33
|
+
private static tokenize;
|
|
34
|
+
private static parse;
|
|
35
|
+
private static execute;
|
|
36
|
+
private static contains;
|
|
37
|
+
private static resolveValue;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=objectq.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectq.d.ts","sourceRoot":"","sources":["../../src/services/objectq.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;OAWG;WACW,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;IA+BxE;;;;;;;;;;;;OAYG;WACW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG;IAiBlE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAQjE,OAAO,CAAC,MAAM,CAAC,QAAQ;IAOvB,OAAO,CAAC,MAAM,CAAC,KAAK;IAsDpB,OAAO,CAAC,MAAM,CAAC,OAAO;IAqCtB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAMvB,OAAO,CAAC,MAAM,CAAC,YAAY;CA2B5B"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SimilieQuery — a safe, human-friendly mini rule language for JSON filtering.
|
|
3
|
+
*/
|
|
4
|
+
export class SimilieQuery {
|
|
5
|
+
/**
|
|
6
|
+
* Interpolates placeholders like {device.identity} or {config.apn}
|
|
7
|
+
* in a string or object template using deep path lookup.
|
|
8
|
+
*
|
|
9
|
+
* Supports nested objects, arrays, and strings.
|
|
10
|
+
* Escaped braces {{ ... }} are preserved.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const tpl = "Device={device.identity} APN={config.apn}";
|
|
14
|
+
* SimilieQuery.interpolate(tpl, { device: { identity: "A1" }, config: { apn: "timor" } });
|
|
15
|
+
* // → "Device=A1 APN=timor"
|
|
16
|
+
*/
|
|
17
|
+
static interpolate(template, data) {
|
|
18
|
+
// recursively walk through arrays and objects
|
|
19
|
+
if (Array.isArray(template)) {
|
|
20
|
+
return template.map((v) => this.interpolate(v, data));
|
|
21
|
+
}
|
|
22
|
+
if (template && typeof template === "object") {
|
|
23
|
+
const result = {};
|
|
24
|
+
for (const [k, v] of Object.entries(template)) {
|
|
25
|
+
result[k] = this.interpolate(v, data);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
// only interpolate strings
|
|
30
|
+
if (typeof template !== "string")
|
|
31
|
+
return template;
|
|
32
|
+
// Replace escaped {{ ... }} → keep braces
|
|
33
|
+
const escapeToken = "__ESCAPED_BRACE__";
|
|
34
|
+
template = template.replace(/\{\{(.*?)\}\}/g, (_, inner) => `{${inner}}${escapeToken}`);
|
|
35
|
+
// Match {path.to.value}
|
|
36
|
+
return template
|
|
37
|
+
.replace(/\{([\w.[\]0-9_-]+)\}/g, (_, path) => {
|
|
38
|
+
const value = this.get(data, path);
|
|
39
|
+
return value !== undefined && value !== null ? String(value) : "";
|
|
40
|
+
})
|
|
41
|
+
.replace(new RegExp(escapeToken, "g"), ""); // clean escape markers
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
* @param obj The object to query
|
|
46
|
+
* @param path The path to the property, e.g. "a.b[0].c"
|
|
47
|
+
* @param defaultValue The value to return if the path does not exist
|
|
48
|
+
* @returns The value at the specified path or the default value if not found
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* const data = { device: { identity: "abc123", info: [{ name: "sensor1" }] } };
|
|
52
|
+
* console.log(get(data, "device.identity")); // "abc123"
|
|
53
|
+
* console.log(get(data, "device.info[0].name")); // "sensor1"
|
|
54
|
+
* console.log(get(data, "device.info[1].name", "N/A"));// "N/A"
|
|
55
|
+
*/
|
|
56
|
+
static get(obj, path, defaultValue) {
|
|
57
|
+
if (!obj || typeof path !== "string")
|
|
58
|
+
return defaultValue;
|
|
59
|
+
// Split by dots but support bracket syntax like "a[0].b"
|
|
60
|
+
const keys = path
|
|
61
|
+
.replace(/\[(\w+)\]/g, ".$1") // convert [0] → .0
|
|
62
|
+
.replace(/^\./, "") // strip leading dot
|
|
63
|
+
.split(".");
|
|
64
|
+
let result = obj;
|
|
65
|
+
for (const key of keys) {
|
|
66
|
+
if (result != null && Object.prototype.hasOwnProperty.call(result, key)) {
|
|
67
|
+
result = result[key];
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return defaultValue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
static evaluate(expr, data) {
|
|
76
|
+
if (!expr || !expr.trim())
|
|
77
|
+
return true;
|
|
78
|
+
const tokens = this.tokenize(expr);
|
|
79
|
+
const ast = this.parse(tokens);
|
|
80
|
+
return this.execute(ast, data);
|
|
81
|
+
}
|
|
82
|
+
// ---------------- TOKENIZER ----------------
|
|
83
|
+
static tokenize(input) {
|
|
84
|
+
const re = /\s*(>=|<=|==|!=|>|<|IN|NOT IN|CONTAINS|NOT CONTAINS|\(|\)|AND|OR|[A-Za-z0-9_.]+|"[^"]*"|'[^']*'|\[[^\]]*\]|true|false|null)\s*/gi;
|
|
85
|
+
return input.match(re)?.map((t) => t.trim()) ?? [];
|
|
86
|
+
}
|
|
87
|
+
// ---------------- PARSER ----------------
|
|
88
|
+
static parse(tokens) {
|
|
89
|
+
let i = 0;
|
|
90
|
+
const parseExpression = () => {
|
|
91
|
+
let left = parseTerm();
|
|
92
|
+
while (tokens[i] && /^OR$/i.test(tokens[i] || "")) {
|
|
93
|
+
const op = (tokens[i++] || "").toUpperCase();
|
|
94
|
+
const right = parseTerm();
|
|
95
|
+
left = { op, left, right };
|
|
96
|
+
}
|
|
97
|
+
return left;
|
|
98
|
+
};
|
|
99
|
+
const parseTerm = () => {
|
|
100
|
+
let left = parseFactor();
|
|
101
|
+
while (tokens[i] && /^AND$/i.test(tokens[i] || "")) {
|
|
102
|
+
const op = (tokens[i++] || "").toUpperCase();
|
|
103
|
+
const right = parseFactor();
|
|
104
|
+
left = { op, left, right };
|
|
105
|
+
}
|
|
106
|
+
return left;
|
|
107
|
+
};
|
|
108
|
+
const parseFactor = () => {
|
|
109
|
+
if (tokens[i] === "(") {
|
|
110
|
+
i++;
|
|
111
|
+
const expr = parseExpression();
|
|
112
|
+
i++; // skip ')'
|
|
113
|
+
return expr;
|
|
114
|
+
}
|
|
115
|
+
const left = tokens[i++];
|
|
116
|
+
const opParts = [];
|
|
117
|
+
// support multi-word ops like "NOT IN"
|
|
118
|
+
while (tokens[i] &&
|
|
119
|
+
/^(NOT|IN|CONTAINS)$/i.test(tokens[i] || "") &&
|
|
120
|
+
opParts.join(" ").toUpperCase() !== "NOT CONTAINS") {
|
|
121
|
+
opParts.push((tokens[i++] || "").toUpperCase());
|
|
122
|
+
if (opParts.join(" ") === "NOT CONTAINS")
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
const op = opParts.length ? opParts.join(" ") : tokens[i++];
|
|
126
|
+
const right = tokens[i++];
|
|
127
|
+
return { op: (op || "").toUpperCase(), left, right };
|
|
128
|
+
};
|
|
129
|
+
return parseExpression();
|
|
130
|
+
}
|
|
131
|
+
// ---------------- EXECUTOR ----------------
|
|
132
|
+
static execute(node, data) {
|
|
133
|
+
if (!node)
|
|
134
|
+
return false;
|
|
135
|
+
if (node.op === "AND")
|
|
136
|
+
return this.execute(node.left, data) && this.execute(node.right, data);
|
|
137
|
+
if (node.op === "OR")
|
|
138
|
+
return this.execute(node.left, data) || this.execute(node.right, data);
|
|
139
|
+
const leftVal = this.resolveValue(node.left, data);
|
|
140
|
+
const rightVal = this.resolveValue(node.right, data);
|
|
141
|
+
switch (node.op) {
|
|
142
|
+
case "==":
|
|
143
|
+
return leftVal == rightVal;
|
|
144
|
+
case "!=":
|
|
145
|
+
return leftVal != rightVal;
|
|
146
|
+
case ">":
|
|
147
|
+
return leftVal > rightVal;
|
|
148
|
+
case ">=":
|
|
149
|
+
return leftVal >= rightVal;
|
|
150
|
+
case "<":
|
|
151
|
+
return leftVal < rightVal;
|
|
152
|
+
case "<=":
|
|
153
|
+
return leftVal <= rightVal;
|
|
154
|
+
case "IN":
|
|
155
|
+
return Array.isArray(rightVal) ? rightVal.includes(leftVal) : false;
|
|
156
|
+
case "NOT IN":
|
|
157
|
+
return Array.isArray(rightVal) ? !rightVal.includes(leftVal) : true;
|
|
158
|
+
case "CONTAINS":
|
|
159
|
+
return this.contains(rightVal, leftVal);
|
|
160
|
+
case "NOT CONTAINS":
|
|
161
|
+
return !this.contains(rightVal, leftVal);
|
|
162
|
+
default:
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
static contains(container, value) {
|
|
167
|
+
if (typeof container === "string")
|
|
168
|
+
return container.includes(value);
|
|
169
|
+
if (Array.isArray(container))
|
|
170
|
+
return container.includes(value);
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
static resolveValue(token, data) {
|
|
174
|
+
if (token === undefined || token === null)
|
|
175
|
+
return null;
|
|
176
|
+
// Array literal
|
|
177
|
+
if (/^\[.*\]$/.test(token)) {
|
|
178
|
+
try {
|
|
179
|
+
return JSON.parse(token.replace(/'/g, '"'));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// String literal
|
|
186
|
+
if (/^".*"$|^'.*'$/.test(token))
|
|
187
|
+
return token.slice(1, -1); // remove quotes
|
|
188
|
+
// Boolean
|
|
189
|
+
if (/^(true|false)$/i.test(token))
|
|
190
|
+
return token.toLowerCase() === "true";
|
|
191
|
+
// Null
|
|
192
|
+
if (/^null$/i.test(token))
|
|
193
|
+
return null;
|
|
194
|
+
// Number
|
|
195
|
+
if (!isNaN(Number(token)))
|
|
196
|
+
return Number(token);
|
|
197
|
+
// Otherwise path lookup
|
|
198
|
+
return this.get(data, token);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=objectq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectq.js","sourceRoot":"","sources":["../../src/services/objectq.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class EnvCrypt {
|
|
2
|
+
private readonly _algorithm;
|
|
3
|
+
private readonly _secretKey;
|
|
4
|
+
private _iv;
|
|
5
|
+
constructor(iv: string);
|
|
6
|
+
get convertIv(): Buffer<ArrayBuffer>;
|
|
7
|
+
private get algorithm();
|
|
8
|
+
private get iv();
|
|
9
|
+
static cipherIv(value?: number): string;
|
|
10
|
+
private get secretKey();
|
|
11
|
+
encrypt(text: any): string;
|
|
12
|
+
decrypt: (hash: string) => string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/services/secrets.ts"],"names":[],"mappings":"AACA,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,GAAG,CAAS;gBACR,EAAE,EAAE,MAAM;IAMtB,IAAW,SAAS,wBAEnB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,EAAE,GAEb;IAED,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAE,MAAW,GAAG,MAAM;IAI3C,OAAO,KAAK,SAAS,GAEpB;IAEM,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAO1B,OAAO,GAAI,MAAM,MAAM,YAiB5B;CACH"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
export class EnvCrypt {
|
|
3
|
+
_algorithm = "aes-256-ctr";
|
|
4
|
+
_secretKey;
|
|
5
|
+
_iv;
|
|
6
|
+
constructor(iv) {
|
|
7
|
+
this._iv = iv;
|
|
8
|
+
this._secretKey =
|
|
9
|
+
process.env.ENV_SECRET_KEY || "6241caa2f4b730f7edcb3e115c0948d5";
|
|
10
|
+
}
|
|
11
|
+
get convertIv() {
|
|
12
|
+
return Buffer.from(this.iv, "hex");
|
|
13
|
+
}
|
|
14
|
+
get algorithm() {
|
|
15
|
+
return this._algorithm;
|
|
16
|
+
}
|
|
17
|
+
get iv() {
|
|
18
|
+
return this._iv;
|
|
19
|
+
}
|
|
20
|
+
static cipherIv(value = 16) {
|
|
21
|
+
return crypto.randomBytes(value).toString("hex");
|
|
22
|
+
}
|
|
23
|
+
get secretKey() {
|
|
24
|
+
return this._secretKey;
|
|
25
|
+
}
|
|
26
|
+
encrypt(text) {
|
|
27
|
+
const iv = this.convertIv;
|
|
28
|
+
const cipher = crypto.createCipheriv(this.algorithm, this.secretKey, iv);
|
|
29
|
+
const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
|
|
30
|
+
return encrypted.toString("hex");
|
|
31
|
+
}
|
|
32
|
+
decrypt = (hash) => {
|
|
33
|
+
if (!hash) {
|
|
34
|
+
throw new Error("A String Value is Required");
|
|
35
|
+
}
|
|
36
|
+
const decipher = crypto.createDecipheriv(this.algorithm, this.secretKey, this.convertIv);
|
|
37
|
+
const decrpyted = Buffer.concat([
|
|
38
|
+
decipher.update(Buffer.from(hash, "hex")),
|
|
39
|
+
decipher.final(),
|
|
40
|
+
]);
|
|
41
|
+
return decrpyted.toString();
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/services/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,OAAO,QAAQ;IACF,UAAU,GAAG,aAAa,CAAC;IAC3B,UAAU,CAAS;IAC5B,GAAG,CAAS;IACpB,YAAY,EAAU;QACpB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,UAAU;YACb,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,kCAAkC,CAAC;IACrE,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAY,EAAE;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAgB,EAAE;QAChC,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEM,OAAO,CAAC,IAAS;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CACtC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CACf,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzC,QAAQ,CAAC,KAAK,EAAE;SACjB,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC,CAAC;CACH"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { UUID } from "../models/index.js";
|
|
2
|
+
import { Client } from "pg";
|
|
3
|
+
export type ListenerFragments = {
|
|
4
|
+
id: number | UUID;
|
|
5
|
+
station: number;
|
|
6
|
+
date: string;
|
|
7
|
+
table: string;
|
|
8
|
+
schema: string;
|
|
9
|
+
context: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class SQLService {
|
|
12
|
+
private readonly _triggers;
|
|
13
|
+
private readonly _listeners;
|
|
14
|
+
private static instance;
|
|
15
|
+
private readonly _client;
|
|
16
|
+
private listerCallbacks;
|
|
17
|
+
private constructor();
|
|
18
|
+
get client(): Client;
|
|
19
|
+
static get i(): SQLService;
|
|
20
|
+
static setup(triggers?: string[], listeners?: Record<string, string>): SQLService;
|
|
21
|
+
getStartTriggersSQL(): string[];
|
|
22
|
+
private listenToChannel;
|
|
23
|
+
private applyClientListeners;
|
|
24
|
+
seedTriggers: () => Promise<void>;
|
|
25
|
+
addListener: (key: string, cb: (payload: ListenerFragments) => void | Promise<void>) => Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/services/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,UAAU;IAOnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,eAAe,CAEhB;IACP,OAAO;IAYP,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,WAAkB,CAAC,eAKlB;WAEa,KAAK,CACjB,QAAQ,GAAE,MAAM,EAAO,EACvB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACrC,UAAU;IAON,mBAAmB,IAAI,MAAM,EAAE;IAItC,OAAO,CAAC,eAAe,CAUrB;IAEF,OAAO,CAAC,oBAAoB,CAiB1B;IAEK,YAAY,QAAa,OAAO,CAAC,IAAI,CAAC,CAc3C;IAEK,WAAW,GAChB,KAAK,MAAM,EACX,IAAI,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KACvD,OAAO,CAAC,IAAI,CAAC,CAOd;CACH"}
|