@antares-core/rvs 1.0.0 → 1.0.1
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.js +3 -24
- package/dist/index.js.map +7 -1
- package/dist/rvs.decorators.js +3 -28
- package/dist/rvs.decorators.js.map +7 -1
- package/dist/rvs.middleware.js +3 -145
- package/dist/rvs.middleware.js.map +7 -1
- package/dist/rvs.module.js +3 -119
- package/dist/rvs.module.js.map +7 -1
- package/dist/rvs.registry.js +3 -100
- package/dist/rvs.registry.js.map +7 -1
- package/dist/rvs.service.js +3 -49
- package/dist/rvs.service.js.map +7 -1
- package/dist/rvs.tokens.js +3 -6
- package/dist/rvs.tokens.js.map +7 -1
- package/dist/rvs.types.js +3 -20
- package/dist/rvs.types.js.map +7 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./rvs.types"), exports);
|
|
18
|
-
__exportStar(require("./rvs.tokens"), exports);
|
|
19
|
-
__exportStar(require("./rvs.decorators"), exports);
|
|
20
|
-
__exportStar(require("./rvs.registry"), exports);
|
|
21
|
-
__exportStar(require("./rvs.service"), exports);
|
|
22
|
-
__exportStar(require("./rvs.middleware"), exports);
|
|
23
|
-
__exportStar(require("./rvs.module"), exports);
|
|
24
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var n=Object.defineProperty;var o=(t,e)=>n(t,"name",{value:e,configurable:!0});var __createBinding=this&&this.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r);var s=Object.getOwnPropertyDescriptor(e,r);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:o(function(){return e[r]},"get")}),Object.defineProperty(t,i,s)}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),__exportStar=this&&this.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(e,t,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./rvs.types"),exports),__exportStar(require("./rvs.tokens"),exports),__exportStar(require("./rvs.decorators"),exports),__exportStar(require("./rvs.registry"),exports),__exportStar(require("./rvs.service"),exports),__exportStar(require("./rvs.middleware"),exports),__exportStar(require("./rvs.module"),exports);
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./rvs.types\"), exports);\n__exportStar(require(\"./rvs.tokens\"), exports);\n__exportStar(require(\"./rvs.decorators\"), exports);\n__exportStar(require(\"./rvs.registry\"), exports);\n__exportStar(require(\"./rvs.service\"), exports);\n__exportStar(require(\"./rvs.middleware\"), exports);\n__exportStar(require(\"./rvs.module\"), exports);\n//# sourceMappingURL=index.js.map"],
|
|
5
|
+
"mappings": "4FACA,IAAI,gBAAmB,MAAQ,KAAK,kBAAqB,OAAO,OAAU,SAASA,EAAGC,EAAGC,EAAGC,EAAI,CACxFA,IAAO,SAAWA,EAAKD,GAC3B,IAAIE,EAAO,OAAO,yBAAyBH,EAAGC,CAAC,GAC3C,CAACE,IAAS,QAASA,EAAO,CAACH,EAAE,WAAaG,EAAK,UAAYA,EAAK,iBAClEA,EAAO,CAAE,WAAY,GAAM,IAAKC,EAAA,UAAW,CAAE,OAAOJ,EAAEC,CAAC,CAAG,EAA1B,MAA4B,GAE9D,OAAO,eAAeF,EAAGG,EAAIC,CAAI,CACrC,EAAM,SAASJ,EAAGC,EAAGC,EAAGC,EAAI,CACpBA,IAAO,SAAWA,EAAKD,GAC3BF,EAAEG,CAAE,EAAIF,EAAEC,CAAC,CACf,GACI,aAAgB,MAAQ,KAAK,cAAiB,SAASD,EAAGK,EAAS,CACnE,QAASC,KAAKN,EAAOM,IAAM,WAAa,CAAC,OAAO,UAAU,eAAe,KAAKD,EAASC,CAAC,GAAG,gBAAgBD,EAASL,EAAGM,CAAC,CAC5H,EACA,OAAO,eAAe,QAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,aAAa,QAAQ,aAAa,EAAG,OAAO,EAC5C,aAAa,QAAQ,cAAc,EAAG,OAAO,EAC7C,aAAa,QAAQ,kBAAkB,EAAG,OAAO,EACjD,aAAa,QAAQ,gBAAgB,EAAG,OAAO,EAC/C,aAAa,QAAQ,eAAe,EAAG,OAAO,EAC9C,aAAa,QAAQ,kBAAkB,EAAG,OAAO,EACjD,aAAa,QAAQ,cAAc,EAAG,OAAO",
|
|
6
|
+
"names": ["o", "m", "k", "k2", "desc", "__name", "exports", "p"]
|
|
7
|
+
}
|
package/dist/rvs.decorators.js
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.RVS_SKIP_METADATA = 'antares:rvs:skip';
|
|
6
|
-
exports.RVS_FORCE_METADATA = 'antares:rvs:force';
|
|
7
|
-
/**
|
|
8
|
-
* 跳过该控制器/接口的 RVS 验签与响应加密。
|
|
9
|
-
* 适用:健康检查、回调通知、公开静态资源。
|
|
10
|
-
* 优先级低于 @RvsForce;命名与内核 crypto-kit 的 @CryptoSkip 对齐。
|
|
11
|
-
*/
|
|
12
|
-
const RvsSkip = () => (0, common_1.SetMetadata)(exports.RVS_SKIP_METADATA, true);
|
|
13
|
-
exports.RvsSkip = RvsSkip;
|
|
14
|
-
/**
|
|
15
|
-
* 强制验签:即使命中 skipPaths 或类级 @RvsSkip 也执行校验。
|
|
16
|
-
* 适用:高价值接口在全局放行策略下单独收紧。
|
|
17
|
-
*/
|
|
18
|
-
const RvsForce = () => (0, common_1.SetMetadata)(exports.RVS_FORCE_METADATA, true);
|
|
19
|
-
exports.RvsForce = RvsForce;
|
|
20
|
-
/**
|
|
21
|
-
* 取当前请求的验签上下文(req.rvs)。
|
|
22
|
-
* 上下文含请求级密钥材料,只允许在业务方法内使用,禁止日志输出或透传响应。
|
|
23
|
-
*/
|
|
24
|
-
exports.RvsCtx = (0, common_1.createParamDecorator)((property, ctx) => {
|
|
25
|
-
const request = ctx.switchToHttp().getRequest();
|
|
26
|
-
return request?.[property || 'rvs'];
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=rvs.decorators.js.map
|
|
1
|
+
"use strict";var r=Object.defineProperty;var s=(e,t)=>r(e,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.RvsCtx=exports.RvsForce=exports.RvsSkip=exports.RVS_FORCE_METADATA=exports.RVS_SKIP_METADATA=void 0;const common_1=require("@nestjs/common");exports.RVS_SKIP_METADATA="antares:rvs:skip",exports.RVS_FORCE_METADATA="antares:rvs:force";const RvsSkip=s(()=>(0,common_1.SetMetadata)(exports.RVS_SKIP_METADATA,!0),"RvsSkip");exports.RvsSkip=RvsSkip;const RvsForce=s(()=>(0,common_1.SetMetadata)(exports.RVS_FORCE_METADATA,!0),"RvsForce");exports.RvsForce=RvsForce,exports.RvsCtx=(0,common_1.createParamDecorator)((e,t)=>t.switchToHttp().getRequest()?.[e||"rvs"]);
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.decorators.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RvsCtx = exports.RvsForce = exports.RvsSkip = exports.RVS_FORCE_METADATA = exports.RVS_SKIP_METADATA = void 0;\nconst common_1 = require(\"@nestjs/common\");\nexports.RVS_SKIP_METADATA = 'antares:rvs:skip';\nexports.RVS_FORCE_METADATA = 'antares:rvs:force';\n/**\n * \u8DF3\u8FC7\u8BE5\u63A7\u5236\u5668/\u63A5\u53E3\u7684 RVS \u9A8C\u7B7E\u4E0E\u54CD\u5E94\u52A0\u5BC6\u3002\n * \u9002\u7528\uFF1A\u5065\u5EB7\u68C0\u67E5\u3001\u56DE\u8C03\u901A\u77E5\u3001\u516C\u5F00\u9759\u6001\u8D44\u6E90\u3002\n * \u4F18\u5148\u7EA7\u4F4E\u4E8E @RvsForce\uFF1B\u547D\u540D\u4E0E\u5185\u6838 crypto-kit \u7684 @CryptoSkip \u5BF9\u9F50\u3002\n */\nconst RvsSkip = () => (0, common_1.SetMetadata)(exports.RVS_SKIP_METADATA, true);\nexports.RvsSkip = RvsSkip;\n/**\n * \u5F3A\u5236\u9A8C\u7B7E\uFF1A\u5373\u4F7F\u547D\u4E2D skipPaths \u6216\u7C7B\u7EA7 @RvsSkip \u4E5F\u6267\u884C\u6821\u9A8C\u3002\n * \u9002\u7528\uFF1A\u9AD8\u4EF7\u503C\u63A5\u53E3\u5728\u5168\u5C40\u653E\u884C\u7B56\u7565\u4E0B\u5355\u72EC\u6536\u7D27\u3002\n */\nconst RvsForce = () => (0, common_1.SetMetadata)(exports.RVS_FORCE_METADATA, true);\nexports.RvsForce = RvsForce;\n/**\n * \u53D6\u5F53\u524D\u8BF7\u6C42\u7684\u9A8C\u7B7E\u4E0A\u4E0B\u6587\uFF08req.rvs\uFF09\u3002\n * \u4E0A\u4E0B\u6587\u542B\u8BF7\u6C42\u7EA7\u5BC6\u94A5\u6750\u6599\uFF0C\u53EA\u5141\u8BB8\u5728\u4E1A\u52A1\u65B9\u6CD5\u5185\u4F7F\u7528\uFF0C\u7981\u6B62\u65E5\u5FD7\u8F93\u51FA\u6216\u900F\u4F20\u54CD\u5E94\u3002\n */\nexports.RvsCtx = (0, common_1.createParamDecorator)((property, ctx) => {\n const request = ctx.switchToHttp().getRequest();\n return request?.[property || 'rvs'];\n});\n//# sourceMappingURL=rvs.decorators.js.map"],
|
|
5
|
+
"mappings": "4FACA,OAAO,eAAe,QAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,QAAQ,OAAS,QAAQ,SAAW,QAAQ,QAAU,QAAQ,mBAAqB,QAAQ,kBAAoB,OAC/G,MAAM,SAAW,QAAQ,gBAAgB,EACzC,QAAQ,kBAAoB,mBAC5B,QAAQ,mBAAqB,oBAM7B,MAAM,QAAUA,EAAA,OAAU,SAAS,aAAa,QAAQ,kBAAmB,EAAI,EAA/D,WAChB,QAAQ,QAAU,QAKlB,MAAM,SAAWA,EAAA,OAAU,SAAS,aAAa,QAAQ,mBAAoB,EAAI,EAAhE,YACjB,QAAQ,SAAW,SAKnB,QAAQ,UAAa,SAAS,sBAAsB,CAACC,EAAUC,IAC3CA,EAAI,aAAa,EAAE,WAAW,IAC7BD,GAAY,KAAK,CACrC",
|
|
6
|
+
"names": ["__name", "property", "ctx"]
|
|
7
|
+
}
|
package/dist/rvs.middleware.js
CHANGED
|
@@ -1,145 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.RvsMiddleware = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const core_1 = require("@antares-core/core");
|
|
18
|
-
const rand_vec_sig_1 = require("rand-vec-sig");
|
|
19
|
-
const rvs_registry_1 = require("./rvs.registry");
|
|
20
|
-
const rvs_tokens_1 = require("./rvs.tokens");
|
|
21
|
-
const rvs_types_1 = require("./rvs.types");
|
|
22
|
-
/**
|
|
23
|
-
* RVS 全局中间件(Express 壳层)。
|
|
24
|
-
*
|
|
25
|
-
* 职责顺序(顺序即安全语义,改动前请先读注释):
|
|
26
|
-
* 1. 动态会话端点直通:客户端拿 sessSeed 的引导请求不能要求先验签
|
|
27
|
-
* 2. @RvsForce 命中 → 无条件验签(覆盖 skipPaths / @RvsSkip)
|
|
28
|
-
* 3. skipPaths / @RvsSkip 命中 → 直通
|
|
29
|
-
* 4. tolerant 模式且未携带标识头 → 视为明文请求放行(已带标识头但验签失败仍拒绝)
|
|
30
|
-
* 5. 安装响应加密出口(包住 res.json,保证拦截器包装后的最终报文被整体加密)
|
|
31
|
-
* 6. 委托 rand-vec-sig 中间件完成验签/解密/上下文挂载/防重放
|
|
32
|
-
*
|
|
33
|
-
* 响应加密必须在 res.json 层完成:客户端按顶层混淆信封(alg="r")解密,
|
|
34
|
-
* 因此任何 Nest 拦截器(统一响应壳 / 序列化)产生的最终 body 才是加密输入。
|
|
35
|
-
*/
|
|
36
|
-
let RvsMiddleware = class RvsMiddleware {
|
|
37
|
-
constructor(server, options, registry) {
|
|
38
|
-
this.server = server;
|
|
39
|
-
this.options = options;
|
|
40
|
-
this.registry = registry;
|
|
41
|
-
this.expressMiddleware = server.middleware({
|
|
42
|
-
// 跳过判定在 use() 中统一完成(需要叠加装饰器注册表),此处不再传 skipPaths
|
|
43
|
-
skipPaths: [],
|
|
44
|
-
contextProperty: options.contextProperty,
|
|
45
|
-
replaceBody: true,
|
|
46
|
-
onReject: (result, request) => {
|
|
47
|
-
core_1.logger.warn('rvs request rejected', {
|
|
48
|
-
code: result.code,
|
|
49
|
-
status: result.status,
|
|
50
|
-
url: request?.url,
|
|
51
|
-
method: request?.method,
|
|
52
|
-
});
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
const overrides = options.identifyHeaders ?? {};
|
|
56
|
-
this.identifyHeaderNames = [
|
|
57
|
-
(overrides.version ?? rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.version).toLowerCase(),
|
|
58
|
-
(overrides.session ?? rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.session).toLowerCase(),
|
|
59
|
-
(overrides.nonce ?? rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.nonce).toLowerCase(),
|
|
60
|
-
];
|
|
61
|
-
}
|
|
62
|
-
use(req, res, next) {
|
|
63
|
-
const url = req.originalUrl ?? req.url ?? '';
|
|
64
|
-
const pathname = url.split('?')[0];
|
|
65
|
-
// 1) 动态会话端点
|
|
66
|
-
if (this.options.sessionEndpoint && req.method === 'GET' && this.isSessionPath(pathname)) {
|
|
67
|
-
try {
|
|
68
|
-
res.json(this.server.issueSession());
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
next(err);
|
|
72
|
-
}
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// 2) @RvsForce 优先于一切放行规则
|
|
76
|
-
const forced = this.registry.isForced(url);
|
|
77
|
-
if (!forced) {
|
|
78
|
-
// 3) 放行清单
|
|
79
|
-
if (this.registry.isSkipped(url) || (0, rvs_types_1.matchesAnyPath)(this.options.skipPaths, url)) {
|
|
80
|
-
next();
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
// 4) 明文请求(tolerant 模式)
|
|
84
|
-
if (this.options.unprotected === 'tolerant' && !this.hasIdentifyHeaders(req)) {
|
|
85
|
-
next();
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// 5) 响应加密出口
|
|
90
|
-
if (this.options.responseEncryption)
|
|
91
|
-
this.patchResponseJson(req, res);
|
|
92
|
-
// 6) 验签/解密;rand-vec-sig 中间件内部已捕获异常并转 next(error)
|
|
93
|
-
void this.expressMiddleware(req, res, next);
|
|
94
|
-
}
|
|
95
|
-
isSessionPath(pathname) {
|
|
96
|
-
const endpoint = this.options.sessionEndpoint;
|
|
97
|
-
return pathname === endpoint || pathname.endsWith(endpoint);
|
|
98
|
-
}
|
|
99
|
-
hasIdentifyHeaders(req) {
|
|
100
|
-
const headers = req.headers;
|
|
101
|
-
if (!headers)
|
|
102
|
-
return false;
|
|
103
|
-
return this.identifyHeaderNames.some((name) => {
|
|
104
|
-
if (typeof headers.get === 'function') {
|
|
105
|
-
return Boolean(headers.get(name));
|
|
106
|
-
}
|
|
107
|
-
return Boolean(headers[name]);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
patchResponseJson(req, res) {
|
|
111
|
-
if (typeof res.json !== 'function')
|
|
112
|
-
return;
|
|
113
|
-
const original = res.json.bind(res);
|
|
114
|
-
const property = this.options.contextProperty;
|
|
115
|
-
res.json = (body) => {
|
|
116
|
-
const context = req[property];
|
|
117
|
-
if (!context)
|
|
118
|
-
return original(body);
|
|
119
|
-
try {
|
|
120
|
-
return original(this.server.encryptResponse(body, context));
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
// 加密失败绝不回退明文(会泄露业务数据);改为通用错误壳,由客户端按明文错误处理
|
|
124
|
-
core_1.alertBus.error('rvs:response-encrypt-failed', 'RVS 响应加密失败,已阻止明文业务数据返回', {
|
|
125
|
-
reason: err?.message,
|
|
126
|
-
});
|
|
127
|
-
try {
|
|
128
|
-
res.statusCode = 500;
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
/* 头已发出则忽略 */
|
|
132
|
-
}
|
|
133
|
-
return original({ code: 'RVS_RESPONSE_ENCRYPT_FAILED', message: 'response encryption failed' });
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
exports.RvsMiddleware = RvsMiddleware;
|
|
139
|
-
exports.RvsMiddleware = RvsMiddleware = __decorate([
|
|
140
|
-
(0, common_1.Injectable)(),
|
|
141
|
-
__param(0, (0, common_1.Inject)(rvs_tokens_1.RVS_SERVER)),
|
|
142
|
-
__param(1, (0, common_1.Inject)(rvs_tokens_1.RVS_OPTIONS)),
|
|
143
|
-
__metadata("design:paramtypes", [Object, Object, rvs_registry_1.RvsRouteRegistry])
|
|
144
|
-
], RvsMiddleware);
|
|
145
|
-
//# sourceMappingURL=rvs.middleware.js.map
|
|
1
|
+
"use strict";var d=Object.defineProperty;var a=(i,e)=>d(i,"name",{value:e,configurable:!0});var __decorate=this&&this.__decorate||function(i,e,t,s){var o=arguments.length,r=o<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(i,e,t,s);else for(var c=i.length-1;c>=0;c--)(n=i[c])&&(r=(o<3?n(r):o>3?n(e,t,r):n(e,t))||r);return o>3&&r&&Object.defineProperty(e,t,r),r},__metadata=this&&this.__metadata||function(i,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(i,e)},__param=this&&this.__param||function(i,e){return function(t,s){e(t,s,i)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.RvsMiddleware=void 0;const common_1=require("@nestjs/common"),core_1=require("@antares-core/core"),rand_vec_sig_1=require("rand-vec-sig"),rvs_registry_1=require("./rvs.registry"),rvs_tokens_1=require("./rvs.tokens"),rvs_types_1=require("./rvs.types");let RvsMiddleware=class{static{a(this,"RvsMiddleware")}constructor(e,t,s){this.server=e,this.options=t,this.registry=s,this.expressMiddleware=e.middleware({skipPaths:[],contextProperty:t.contextProperty,replaceBody:!0,onReject:a((r,n)=>{core_1.logger.warn("rvs request rejected",{code:r.code,status:r.status,url:n?.url,method:n?.method})},"onReject")});const o=t.identifyHeaders??{};this.identifyHeaderNames=[(o.version??rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.version).toLowerCase(),(o.session??rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.session).toLowerCase(),(o.nonce??rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.nonce).toLowerCase()]}use(e,t,s){const o=e.originalUrl??e.url??"",r=o.split("?")[0];if(this.options.sessionEndpoint&&e.method==="GET"&&this.isSessionPath(r)){try{t.json(this.server.issueSession())}catch(c){s(c)}return}if(!this.registry.isForced(o)){if(this.registry.isSkipped(o)||(0,rvs_types_1.matchesAnyPath)(this.options.skipPaths,o)){s();return}if(this.options.unprotected==="tolerant"&&!this.hasIdentifyHeaders(e)){s();return}}this.options.responseEncryption&&this.patchResponseJson(e,t),this.expressMiddleware(e,t,s)}isSessionPath(e){const t=this.options.sessionEndpoint;return e===t||e.endsWith(t)}hasIdentifyHeaders(e){const t=e.headers;return t?this.identifyHeaderNames.some(s=>typeof t.get=="function"?!!t.get(s):!!t[s]):!1}patchResponseJson(e,t){if(typeof t.json!="function")return;const s=t.json.bind(t),o=this.options.contextProperty;t.json=r=>{const n=e[o];if(!n)return s(r);try{return s(this.server.encryptResponse(r,n))}catch(c){core_1.alertBus.error("rvs:response-encrypt-failed","RVS \u54CD\u5E94\u52A0\u5BC6\u5931\u8D25\uFF0C\u5DF2\u963B\u6B62\u660E\u6587\u4E1A\u52A1\u6570\u636E\u8FD4\u56DE",{reason:c?.message});try{t.statusCode=500}catch{}return s({code:"RVS_RESPONSE_ENCRYPT_FAILED",message:"response encryption failed"})}}}};exports.RvsMiddleware=RvsMiddleware,exports.RvsMiddleware=RvsMiddleware=__decorate([(0,common_1.Injectable)(),__param(0,(0,common_1.Inject)(rvs_tokens_1.RVS_SERVER)),__param(1,(0,common_1.Inject)(rvs_tokens_1.RVS_OPTIONS)),__metadata("design:paramtypes",[Object,Object,rvs_registry_1.RvsRouteRegistry])],RvsMiddleware);
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.middleware.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RvsMiddleware = void 0;\nconst common_1 = require(\"@nestjs/common\");\nconst core_1 = require(\"@antares-core/core\");\nconst rand_vec_sig_1 = require(\"rand-vec-sig\");\nconst rvs_registry_1 = require(\"./rvs.registry\");\nconst rvs_tokens_1 = require(\"./rvs.tokens\");\nconst rvs_types_1 = require(\"./rvs.types\");\n/**\n * RVS \u5168\u5C40\u4E2D\u95F4\u4EF6\uFF08Express \u58F3\u5C42\uFF09\u3002\n *\n * \u804C\u8D23\u987A\u5E8F\uFF08\u987A\u5E8F\u5373\u5B89\u5168\u8BED\u4E49\uFF0C\u6539\u52A8\u524D\u8BF7\u5148\u8BFB\u6CE8\u91CA\uFF09\uFF1A\n * 1. \u52A8\u6001\u4F1A\u8BDD\u7AEF\u70B9\u76F4\u901A\uFF1A\u5BA2\u6237\u7AEF\u62FF sessSeed \u7684\u5F15\u5BFC\u8BF7\u6C42\u4E0D\u80FD\u8981\u6C42\u5148\u9A8C\u7B7E\n * 2. @RvsForce \u547D\u4E2D \u2192 \u65E0\u6761\u4EF6\u9A8C\u7B7E\uFF08\u8986\u76D6 skipPaths / @RvsSkip\uFF09\n * 3. skipPaths / @RvsSkip \u547D\u4E2D \u2192 \u76F4\u901A\n * 4. tolerant \u6A21\u5F0F\u4E14\u672A\u643A\u5E26\u6807\u8BC6\u5934 \u2192 \u89C6\u4E3A\u660E\u6587\u8BF7\u6C42\u653E\u884C\uFF08\u5DF2\u5E26\u6807\u8BC6\u5934\u4F46\u9A8C\u7B7E\u5931\u8D25\u4ECD\u62D2\u7EDD\uFF09\n * 5. \u5B89\u88C5\u54CD\u5E94\u52A0\u5BC6\u51FA\u53E3\uFF08\u5305\u4F4F res.json\uFF0C\u4FDD\u8BC1\u62E6\u622A\u5668\u5305\u88C5\u540E\u7684\u6700\u7EC8\u62A5\u6587\u88AB\u6574\u4F53\u52A0\u5BC6\uFF09\n * 6. \u59D4\u6258 rand-vec-sig \u4E2D\u95F4\u4EF6\u5B8C\u6210\u9A8C\u7B7E/\u89E3\u5BC6/\u4E0A\u4E0B\u6587\u6302\u8F7D/\u9632\u91CD\u653E\n *\n * \u54CD\u5E94\u52A0\u5BC6\u5FC5\u987B\u5728 res.json \u5C42\u5B8C\u6210\uFF1A\u5BA2\u6237\u7AEF\u6309\u9876\u5C42\u6DF7\u6DC6\u4FE1\u5C01\uFF08alg=\"r\"\uFF09\u89E3\u5BC6\uFF0C\n * \u56E0\u6B64\u4EFB\u4F55 Nest \u62E6\u622A\u5668\uFF08\u7EDF\u4E00\u54CD\u5E94\u58F3 / \u5E8F\u5217\u5316\uFF09\u4EA7\u751F\u7684\u6700\u7EC8 body \u624D\u662F\u52A0\u5BC6\u8F93\u5165\u3002\n */\nlet RvsMiddleware = class RvsMiddleware {\n constructor(server, options, registry) {\n this.server = server;\n this.options = options;\n this.registry = registry;\n this.expressMiddleware = server.middleware({\n // \u8DF3\u8FC7\u5224\u5B9A\u5728 use() \u4E2D\u7EDF\u4E00\u5B8C\u6210\uFF08\u9700\u8981\u53E0\u52A0\u88C5\u9970\u5668\u6CE8\u518C\u8868\uFF09\uFF0C\u6B64\u5904\u4E0D\u518D\u4F20 skipPaths\n skipPaths: [],\n contextProperty: options.contextProperty,\n replaceBody: true,\n onReject: (result, request) => {\n core_1.logger.warn('rvs request rejected', {\n code: result.code,\n status: result.status,\n url: request?.url,\n method: request?.method,\n });\n },\n });\n const overrides = options.identifyHeaders ?? {};\n this.identifyHeaderNames = [\n (overrides.version ?? rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.version).toLowerCase(),\n (overrides.session ?? rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.session).toLowerCase(),\n (overrides.nonce ?? rand_vec_sig_1.DEFAULT_IDENTIFY_HEADERS.nonce).toLowerCase(),\n ];\n }\n use(req, res, next) {\n const url = req.originalUrl ?? req.url ?? '';\n const pathname = url.split('?')[0];\n // 1) \u52A8\u6001\u4F1A\u8BDD\u7AEF\u70B9\n if (this.options.sessionEndpoint && req.method === 'GET' && this.isSessionPath(pathname)) {\n try {\n res.json(this.server.issueSession());\n }\n catch (err) {\n next(err);\n }\n return;\n }\n // 2) @RvsForce \u4F18\u5148\u4E8E\u4E00\u5207\u653E\u884C\u89C4\u5219\n const forced = this.registry.isForced(url);\n if (!forced) {\n // 3) \u653E\u884C\u6E05\u5355\n if (this.registry.isSkipped(url) || (0, rvs_types_1.matchesAnyPath)(this.options.skipPaths, url)) {\n next();\n return;\n }\n // 4) \u660E\u6587\u8BF7\u6C42\uFF08tolerant \u6A21\u5F0F\uFF09\n if (this.options.unprotected === 'tolerant' && !this.hasIdentifyHeaders(req)) {\n next();\n return;\n }\n }\n // 5) \u54CD\u5E94\u52A0\u5BC6\u51FA\u53E3\n if (this.options.responseEncryption)\n this.patchResponseJson(req, res);\n // 6) \u9A8C\u7B7E/\u89E3\u5BC6\uFF1Brand-vec-sig \u4E2D\u95F4\u4EF6\u5185\u90E8\u5DF2\u6355\u83B7\u5F02\u5E38\u5E76\u8F6C next(error)\n void this.expressMiddleware(req, res, next);\n }\n isSessionPath(pathname) {\n const endpoint = this.options.sessionEndpoint;\n return pathname === endpoint || pathname.endsWith(endpoint);\n }\n hasIdentifyHeaders(req) {\n const headers = req.headers;\n if (!headers)\n return false;\n return this.identifyHeaderNames.some((name) => {\n if (typeof headers.get === 'function') {\n return Boolean(headers.get(name));\n }\n return Boolean(headers[name]);\n });\n }\n patchResponseJson(req, res) {\n if (typeof res.json !== 'function')\n return;\n const original = res.json.bind(res);\n const property = this.options.contextProperty;\n res.json = (body) => {\n const context = req[property];\n if (!context)\n return original(body);\n try {\n return original(this.server.encryptResponse(body, context));\n }\n catch (err) {\n // \u52A0\u5BC6\u5931\u8D25\u7EDD\u4E0D\u56DE\u9000\u660E\u6587\uFF08\u4F1A\u6CC4\u9732\u4E1A\u52A1\u6570\u636E\uFF09\uFF1B\u6539\u4E3A\u901A\u7528\u9519\u8BEF\u58F3\uFF0C\u7531\u5BA2\u6237\u7AEF\u6309\u660E\u6587\u9519\u8BEF\u5904\u7406\n core_1.alertBus.error('rvs:response-encrypt-failed', 'RVS \u54CD\u5E94\u52A0\u5BC6\u5931\u8D25\uFF0C\u5DF2\u963B\u6B62\u660E\u6587\u4E1A\u52A1\u6570\u636E\u8FD4\u56DE', {\n reason: err?.message,\n });\n try {\n res.statusCode = 500;\n }\n catch {\n /* \u5934\u5DF2\u53D1\u51FA\u5219\u5FFD\u7565 */\n }\n return original({ code: 'RVS_RESPONSE_ENCRYPT_FAILED', message: 'response encryption failed' });\n }\n };\n }\n};\nexports.RvsMiddleware = RvsMiddleware;\nexports.RvsMiddleware = RvsMiddleware = __decorate([\n (0, common_1.Injectable)(),\n __param(0, (0, common_1.Inject)(rvs_tokens_1.RVS_SERVER)),\n __param(1, (0, common_1.Inject)(rvs_tokens_1.RVS_OPTIONS)),\n __metadata(\"design:paramtypes\", [Object, Object, rvs_registry_1.RvsRouteRegistry])\n], RvsMiddleware);\n//# sourceMappingURL=rvs.middleware.js.map"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["decorators", "target", "key", "desc", "c", "d", "i", "k", "v", "paramIndex", "decorator", "__name", "server", "options", "registry", "result", "request", "overrides", "req", "res", "next", "url", "pathname", "err", "endpoint", "headers", "name", "original", "property", "body", "context"]
|
|
7
|
+
}
|
package/dist/rvs.module.js
CHANGED
|
@@ -1,119 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.RvsModule = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const core_1 = require("@nestjs/core");
|
|
18
|
-
const core_2 = require("@antares-core/core");
|
|
19
|
-
const rand_vec_sig_1 = require("rand-vec-sig");
|
|
20
|
-
const rvs_middleware_1 = require("./rvs.middleware");
|
|
21
|
-
const rvs_registry_1 = require("./rvs.registry");
|
|
22
|
-
const rvs_service_1 = require("./rvs.service");
|
|
23
|
-
const rvs_tokens_1 = require("./rvs.tokens");
|
|
24
|
-
const rvs_types_1 = require("./rvs.types");
|
|
25
|
-
/**
|
|
26
|
-
* RVS 适配模块:全局验签/解密 + 响应加密 + 装饰器粒度控制 + 会话端点。
|
|
27
|
-
*
|
|
28
|
-
* imports: [RvsModule.forRoot({ mode: 'static', serverPrivateKey: env.RVS_RSK, redis: redisClient })]
|
|
29
|
-
*
|
|
30
|
-
* 装配注意:
|
|
31
|
-
* - 与 crypto-kit 互斥:启用 RVS 时宿主应关闭 cryptoOption.enableCrypto(双加密通道无法共存)
|
|
32
|
-
* - 多实例必须传 redis(防重放存储共享),否则启动期告警
|
|
33
|
-
* - 响应加密依赖 res.json 出口,@Res() 直写响应不经过加密(与内核 Transform 拦截器的既有约定一致)
|
|
34
|
-
*/
|
|
35
|
-
let RvsModule = class RvsModule {
|
|
36
|
-
constructor(options) {
|
|
37
|
-
this.options = options;
|
|
38
|
-
}
|
|
39
|
-
configure(consumer) {
|
|
40
|
-
consumer.apply(rvs_middleware_1.RvsMiddleware).forRoutes('*');
|
|
41
|
-
}
|
|
42
|
-
static forRoot(options) {
|
|
43
|
-
return buildRvsModule((0, rvs_types_1.resolveRvsOptions)(options));
|
|
44
|
-
}
|
|
45
|
-
static async forRootAsync(factory) {
|
|
46
|
-
return buildRvsModule((0, rvs_types_1.resolveRvsOptions)(await factory()));
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
exports.RvsModule = RvsModule;
|
|
50
|
-
exports.RvsModule = RvsModule = __decorate([
|
|
51
|
-
(0, common_1.Module)({}),
|
|
52
|
-
__param(0, (0, common_1.Inject)(rvs_tokens_1.RVS_OPTIONS)),
|
|
53
|
-
__metadata("design:paramtypes", [Object])
|
|
54
|
-
], RvsModule);
|
|
55
|
-
function buildRvsModule(options) {
|
|
56
|
-
return {
|
|
57
|
-
module: RvsModule,
|
|
58
|
-
imports: [core_1.DiscoveryModule],
|
|
59
|
-
providers: [
|
|
60
|
-
{ provide: rvs_tokens_1.RVS_OPTIONS, useValue: options },
|
|
61
|
-
{ provide: rvs_tokens_1.RVS_SERVER, useFactory: () => createRvsServer(options) },
|
|
62
|
-
rvs_registry_1.RvsRouteRegistry,
|
|
63
|
-
rvs_service_1.RvsService,
|
|
64
|
-
rvs_middleware_1.RvsMiddleware,
|
|
65
|
-
],
|
|
66
|
-
exports: [rvs_tokens_1.RVS_SERVER, rvs_tokens_1.RVS_OPTIONS, rvs_service_1.RvsService],
|
|
67
|
-
global: true,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
function createRvsServer(options) {
|
|
71
|
-
if (!options.serverPrivateKey) {
|
|
72
|
-
throw new Error('RvsModule: serverPrivateKey 缺失。私钥仅允许来自环境变量 / KMS,禁止硬编码');
|
|
73
|
-
}
|
|
74
|
-
const processModel = (0, core_2.detectProcessModel)();
|
|
75
|
-
const replayStore = options.replayStore ?? (options.redis ? (0, rand_vec_sig_1.createRedisReplayStore)(options.redis) : undefined);
|
|
76
|
-
if (!replayStore && processModel.isCluster) {
|
|
77
|
-
core_2.alertBus.error('rvs:replay-store-per-process', '多实例未配置共享防重放存储:跨实例重放无法拦截', {
|
|
78
|
-
instances: processModel.instances,
|
|
79
|
-
runtime: processModel.runtime,
|
|
80
|
-
hint: 'RvsModule 传入 redis(共享 ioredis 实例)',
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
if (options.mode === 'dynamic' && processModel.isCluster) {
|
|
84
|
-
core_2.logger.warn('rvs dynamic mode with multiple instances: sessSeed 仅存在进程内存', {
|
|
85
|
-
instances: processModel.instances,
|
|
86
|
-
hint: '开启粘性路由,或依赖客户端 410 重试自愈(客户端已内置)',
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
const server = (0, rand_vec_sig_1.createRandVecSigServer)({
|
|
90
|
-
mode: options.mode,
|
|
91
|
-
serverPrivateKey: options.serverPrivateKey,
|
|
92
|
-
versionSeed: options.versionSeed,
|
|
93
|
-
versionSeeds: options.versionSeeds,
|
|
94
|
-
deploymentId: options.deploymentId,
|
|
95
|
-
identifyHeaders: options.identifyHeaders,
|
|
96
|
-
profile: options.profile,
|
|
97
|
-
allowedPayloadModes: options.allowedPayloadModes,
|
|
98
|
-
timestampToleranceMs: options.timestampToleranceMs,
|
|
99
|
-
nonceTtlMs: options.nonceTtlMs,
|
|
100
|
-
strictSubgroupCheck: options.strictSubgroupCheck,
|
|
101
|
-
responseEncryption: options.responseEncryption,
|
|
102
|
-
session: options.session,
|
|
103
|
-
replayStore,
|
|
104
|
-
logger: options.logger ??
|
|
105
|
-
((event, detail) => core_2.logger.debug(`rvs ${event}`, detail)),
|
|
106
|
-
});
|
|
107
|
-
// 四阶段优雅关闭的资源释放阶段:释放会话定时器与存储连接
|
|
108
|
-
(0, core_2.registerResourceCloser)('rvs-server', () => server.close());
|
|
109
|
-
core_2.logger.info('rvs module initialized', {
|
|
110
|
-
mode: options.mode,
|
|
111
|
-
responseEncryption: Boolean(options.responseEncryption),
|
|
112
|
-
unprotected: options.unprotected,
|
|
113
|
-
replayStore: replayStore ? 'shared' : 'memory',
|
|
114
|
-
sessionEndpoint: options.sessionEndpoint ?? null,
|
|
115
|
-
instances: processModel.instances,
|
|
116
|
-
});
|
|
117
|
-
return server;
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=rvs.module.js.map
|
|
1
|
+
"use strict";var a=Object.defineProperty;var i=(e,r)=>a(e,"name",{value:r,configurable:!0});var __decorate=this&&this.__decorate||function(e,r,s,o){var n=arguments.length,t=n<3?r:o===null?o=Object.getOwnPropertyDescriptor(r,s):o,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(e,r,s,o);else for(var d=e.length-1;d>=0;d--)(c=e[d])&&(t=(n<3?c(t):n>3?c(r,s,t):c(r,s))||t);return n>3&&t&&Object.defineProperty(r,s,t),t},__metadata=this&&this.__metadata||function(e,r){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(e,r)},__param=this&&this.__param||function(e,r){return function(s,o){r(s,o,e)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.RvsModule=void 0;const common_1=require("@nestjs/common"),core_1=require("@nestjs/core"),core_2=require("@antares-core/core"),rand_vec_sig_1=require("rand-vec-sig"),rvs_middleware_1=require("./rvs.middleware"),rvs_registry_1=require("./rvs.registry"),rvs_service_1=require("./rvs.service"),rvs_tokens_1=require("./rvs.tokens"),rvs_types_1=require("./rvs.types");let RvsModule=class{static{i(this,"RvsModule")}constructor(r){this.options=r}configure(r){r.apply(rvs_middleware_1.RvsMiddleware).forRoutes("*")}static forRoot(r){return buildRvsModule((0,rvs_types_1.resolveRvsOptions)(r))}static async forRootAsync(r){return buildRvsModule((0,rvs_types_1.resolveRvsOptions)(await r()))}};exports.RvsModule=RvsModule,exports.RvsModule=RvsModule=__decorate([(0,common_1.Module)({}),__param(0,(0,common_1.Inject)(rvs_tokens_1.RVS_OPTIONS)),__metadata("design:paramtypes",[Object])],RvsModule);function buildRvsModule(e){return{module:RvsModule,imports:[core_1.DiscoveryModule],providers:[{provide:rvs_tokens_1.RVS_OPTIONS,useValue:e},{provide:rvs_tokens_1.RVS_SERVER,useFactory:i(()=>createRvsServer(e),"useFactory")},rvs_registry_1.RvsRouteRegistry,rvs_service_1.RvsService,rvs_middleware_1.RvsMiddleware],exports:[rvs_tokens_1.RVS_SERVER,rvs_tokens_1.RVS_OPTIONS,rvs_service_1.RvsService],global:!0}}i(buildRvsModule,"buildRvsModule");function createRvsServer(e){if(!e.serverPrivateKey)throw new Error("RvsModule: serverPrivateKey \u7F3A\u5931\u3002\u79C1\u94A5\u4EC5\u5141\u8BB8\u6765\u81EA\u73AF\u5883\u53D8\u91CF / KMS\uFF0C\u7981\u6B62\u786C\u7F16\u7801");const r=(0,core_2.detectProcessModel)(),s=e.replayStore??(e.redis?(0,rand_vec_sig_1.createRedisReplayStore)(e.redis):void 0);!s&&r.isCluster&&core_2.alertBus.error("rvs:replay-store-per-process","\u591A\u5B9E\u4F8B\u672A\u914D\u7F6E\u5171\u4EAB\u9632\u91CD\u653E\u5B58\u50A8\uFF1A\u8DE8\u5B9E\u4F8B\u91CD\u653E\u65E0\u6CD5\u62E6\u622A",{instances:r.instances,runtime:r.runtime,hint:"RvsModule \u4F20\u5165 redis\uFF08\u5171\u4EAB ioredis \u5B9E\u4F8B\uFF09"}),e.mode==="dynamic"&&r.isCluster&&core_2.logger.warn("rvs dynamic mode with multiple instances: sessSeed \u4EC5\u5B58\u5728\u8FDB\u7A0B\u5185\u5B58",{instances:r.instances,hint:"\u5F00\u542F\u7C98\u6027\u8DEF\u7531\uFF0C\u6216\u4F9D\u8D56\u5BA2\u6237\u7AEF 410 \u91CD\u8BD5\u81EA\u6108\uFF08\u5BA2\u6237\u7AEF\u5DF2\u5185\u7F6E\uFF09"});const o=(0,rand_vec_sig_1.createRandVecSigServer)({mode:e.mode,serverPrivateKey:e.serverPrivateKey,versionSeed:e.versionSeed,versionSeeds:e.versionSeeds,deploymentId:e.deploymentId,identifyHeaders:e.identifyHeaders,profile:e.profile,allowedPayloadModes:e.allowedPayloadModes,timestampToleranceMs:e.timestampToleranceMs,nonceTtlMs:e.nonceTtlMs,strictSubgroupCheck:e.strictSubgroupCheck,responseEncryption:e.responseEncryption,session:e.session,replayStore:s,logger:e.logger??((n,t)=>core_2.logger.debug(`rvs ${n}`,t))});return(0,core_2.registerResourceCloser)("rvs-server",()=>o.close()),core_2.logger.info("rvs module initialized",{mode:e.mode,responseEncryption:!!e.responseEncryption,unprotected:e.unprotected,replayStore:s?"shared":"memory",sessionEndpoint:e.sessionEndpoint??null,instances:r.instances}),o}i(createRvsServer,"createRvsServer");
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.module.js.map
|
package/dist/rvs.module.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RvsModule = void 0;\nconst common_1 = require(\"@nestjs/common\");\nconst core_1 = require(\"@nestjs/core\");\nconst core_2 = require(\"@antares-core/core\");\nconst rand_vec_sig_1 = require(\"rand-vec-sig\");\nconst rvs_middleware_1 = require(\"./rvs.middleware\");\nconst rvs_registry_1 = require(\"./rvs.registry\");\nconst rvs_service_1 = require(\"./rvs.service\");\nconst rvs_tokens_1 = require(\"./rvs.tokens\");\nconst rvs_types_1 = require(\"./rvs.types\");\n/**\n * RVS \u9002\u914D\u6A21\u5757\uFF1A\u5168\u5C40\u9A8C\u7B7E/\u89E3\u5BC6 + \u54CD\u5E94\u52A0\u5BC6 + \u88C5\u9970\u5668\u7C92\u5EA6\u63A7\u5236 + \u4F1A\u8BDD\u7AEF\u70B9\u3002\n *\n * imports: [RvsModule.forRoot({ mode: 'static', serverPrivateKey: env.RVS_RSK, redis: redisClient })]\n *\n * \u88C5\u914D\u6CE8\u610F\uFF1A\n * - \u4E0E crypto-kit \u4E92\u65A5\uFF1A\u542F\u7528 RVS \u65F6\u5BBF\u4E3B\u5E94\u5173\u95ED cryptoOption.enableCrypto\uFF08\u53CC\u52A0\u5BC6\u901A\u9053\u65E0\u6CD5\u5171\u5B58\uFF09\n * - \u591A\u5B9E\u4F8B\u5FC5\u987B\u4F20 redis\uFF08\u9632\u91CD\u653E\u5B58\u50A8\u5171\u4EAB\uFF09\uFF0C\u5426\u5219\u542F\u52A8\u671F\u544A\u8B66\n * - \u54CD\u5E94\u52A0\u5BC6\u4F9D\u8D56 res.json \u51FA\u53E3\uFF0C@Res() \u76F4\u5199\u54CD\u5E94\u4E0D\u7ECF\u8FC7\u52A0\u5BC6\uFF08\u4E0E\u5185\u6838 Transform \u62E6\u622A\u5668\u7684\u65E2\u6709\u7EA6\u5B9A\u4E00\u81F4\uFF09\n */\nlet RvsModule = class RvsModule {\n constructor(options) {\n this.options = options;\n }\n configure(consumer) {\n consumer.apply(rvs_middleware_1.RvsMiddleware).forRoutes('*');\n }\n static forRoot(options) {\n return buildRvsModule((0, rvs_types_1.resolveRvsOptions)(options));\n }\n static async forRootAsync(factory) {\n return buildRvsModule((0, rvs_types_1.resolveRvsOptions)(await factory()));\n }\n};\nexports.RvsModule = RvsModule;\nexports.RvsModule = RvsModule = __decorate([\n (0, common_1.Module)({}),\n __param(0, (0, common_1.Inject)(rvs_tokens_1.RVS_OPTIONS)),\n __metadata(\"design:paramtypes\", [Object])\n], RvsModule);\nfunction buildRvsModule(options) {\n return {\n module: RvsModule,\n imports: [core_1.DiscoveryModule],\n providers: [\n { provide: rvs_tokens_1.RVS_OPTIONS, useValue: options },\n { provide: rvs_tokens_1.RVS_SERVER, useFactory: () => createRvsServer(options) },\n rvs_registry_1.RvsRouteRegistry,\n rvs_service_1.RvsService,\n rvs_middleware_1.RvsMiddleware,\n ],\n exports: [rvs_tokens_1.RVS_SERVER, rvs_tokens_1.RVS_OPTIONS, rvs_service_1.RvsService],\n global: true,\n };\n}\nfunction createRvsServer(options) {\n if (!options.serverPrivateKey) {\n throw new Error('RvsModule: serverPrivateKey \u7F3A\u5931\u3002\u79C1\u94A5\u4EC5\u5141\u8BB8\u6765\u81EA\u73AF\u5883\u53D8\u91CF / KMS\uFF0C\u7981\u6B62\u786C\u7F16\u7801');\n }\n const processModel = (0, core_2.detectProcessModel)();\n const replayStore = options.replayStore ?? (options.redis ? (0, rand_vec_sig_1.createRedisReplayStore)(options.redis) : undefined);\n if (!replayStore && processModel.isCluster) {\n core_2.alertBus.error('rvs:replay-store-per-process', '\u591A\u5B9E\u4F8B\u672A\u914D\u7F6E\u5171\u4EAB\u9632\u91CD\u653E\u5B58\u50A8\uFF1A\u8DE8\u5B9E\u4F8B\u91CD\u653E\u65E0\u6CD5\u62E6\u622A', {\n instances: processModel.instances,\n runtime: processModel.runtime,\n hint: 'RvsModule \u4F20\u5165 redis\uFF08\u5171\u4EAB ioredis \u5B9E\u4F8B\uFF09',\n });\n }\n if (options.mode === 'dynamic' && processModel.isCluster) {\n core_2.logger.warn('rvs dynamic mode with multiple instances: sessSeed \u4EC5\u5B58\u5728\u8FDB\u7A0B\u5185\u5B58', {\n instances: processModel.instances,\n hint: '\u5F00\u542F\u7C98\u6027\u8DEF\u7531\uFF0C\u6216\u4F9D\u8D56\u5BA2\u6237\u7AEF 410 \u91CD\u8BD5\u81EA\u6108\uFF08\u5BA2\u6237\u7AEF\u5DF2\u5185\u7F6E\uFF09',\n });\n }\n const server = (0, rand_vec_sig_1.createRandVecSigServer)({\n mode: options.mode,\n serverPrivateKey: options.serverPrivateKey,\n versionSeed: options.versionSeed,\n versionSeeds: options.versionSeeds,\n deploymentId: options.deploymentId,\n identifyHeaders: options.identifyHeaders,\n profile: options.profile,\n allowedPayloadModes: options.allowedPayloadModes,\n timestampToleranceMs: options.timestampToleranceMs,\n nonceTtlMs: options.nonceTtlMs,\n strictSubgroupCheck: options.strictSubgroupCheck,\n responseEncryption: options.responseEncryption,\n session: options.session,\n replayStore,\n logger: options.logger ??\n ((event, detail) => core_2.logger.debug(`rvs ${event}`, detail)),\n });\n // \u56DB\u9636\u6BB5\u4F18\u96C5\u5173\u95ED\u7684\u8D44\u6E90\u91CA\u653E\u9636\u6BB5\uFF1A\u91CA\u653E\u4F1A\u8BDD\u5B9A\u65F6\u5668\u4E0E\u5B58\u50A8\u8FDE\u63A5\n (0, core_2.registerResourceCloser)('rvs-server', () => server.close());\n core_2.logger.info('rvs module initialized', {\n mode: options.mode,\n responseEncryption: Boolean(options.responseEncryption),\n unprotected: options.unprotected,\n replayStore: replayStore ? 'shared' : 'memory',\n sessionEndpoint: options.sessionEndpoint ?? null,\n instances: processModel.instances,\n });\n return server;\n}\n//# sourceMappingURL=rvs.module.js.map"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["decorators", "target", "key", "desc", "c", "r", "d", "i", "k", "v", "paramIndex", "decorator", "__name", "options", "consumer", "factory", "processModel", "replayStore", "server", "event", "detail"]
|
|
7
|
+
}
|
package/dist/rvs.registry.js
CHANGED
|
@@ -1,100 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.RvsRouteRegistry = void 0;
|
|
13
|
-
exports.pathToRegex = pathToRegex;
|
|
14
|
-
exports.collectRvsRouteMatchers = collectRvsRouteMatchers;
|
|
15
|
-
const common_1 = require("@nestjs/common");
|
|
16
|
-
const constants_1 = require("@nestjs/common/constants");
|
|
17
|
-
const core_1 = require("@nestjs/core");
|
|
18
|
-
const rvs_decorators_1 = require("./rvs.decorators");
|
|
19
|
-
/** 路由路径转正则:支持 :param 与 * 通配;允许全局前缀(如 /api/health/live 命中 health/live) */
|
|
20
|
-
function pathToRegex(routePath) {
|
|
21
|
-
const normalized = routePath.replace(/^\/+|\/+$/g, '');
|
|
22
|
-
if (!normalized)
|
|
23
|
-
return /^.*$/;
|
|
24
|
-
const pattern = normalized
|
|
25
|
-
.split('/')
|
|
26
|
-
.map((segment) => {
|
|
27
|
-
if (segment === '*')
|
|
28
|
-
return '.*';
|
|
29
|
-
if (segment.startsWith(':'))
|
|
30
|
-
return '[^/]+';
|
|
31
|
-
return segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
32
|
-
})
|
|
33
|
-
.join('/');
|
|
34
|
-
return new RegExp(`(?:^|/)${pattern}(?:/)?(?:\\?|#|$)`);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* 扫描控制器元数据,收集 @RvsSkip / @RvsForce 标记的路由正则。
|
|
38
|
-
* 抽成纯函数以便测试;Nest 容器相关逻辑全部在 RvsRouteRegistry。
|
|
39
|
-
*/
|
|
40
|
-
function collectRvsRouteMatchers(controllers, reflector) {
|
|
41
|
-
const skip = [];
|
|
42
|
-
const force = [];
|
|
43
|
-
for (const wrapper of controllers) {
|
|
44
|
-
const { instance, metatype } = wrapper;
|
|
45
|
-
if (!instance || !metatype)
|
|
46
|
-
continue;
|
|
47
|
-
const classPath = Reflect.getMetadata(constants_1.PATH_METADATA, metatype) ?? '';
|
|
48
|
-
const classSkip = reflector.get(rvs_decorators_1.RVS_SKIP_METADATA, metatype);
|
|
49
|
-
const classForce = reflector.get(rvs_decorators_1.RVS_FORCE_METADATA, metatype);
|
|
50
|
-
const proto = Object.getPrototypeOf(instance);
|
|
51
|
-
for (const methodName of Object.getOwnPropertyNames(proto)) {
|
|
52
|
-
if (methodName === 'constructor')
|
|
53
|
-
continue;
|
|
54
|
-
const handler = proto[methodName];
|
|
55
|
-
if (typeof handler !== 'function')
|
|
56
|
-
continue;
|
|
57
|
-
const methodPath = Reflect.getMetadata(constants_1.PATH_METADATA, handler);
|
|
58
|
-
if (methodPath === undefined)
|
|
59
|
-
continue; // 非路由方法
|
|
60
|
-
const joined = [classPath, methodPath].filter((p) => p !== undefined && p !== '').join('/');
|
|
61
|
-
const forceHit = classForce || reflector.get(rvs_decorators_1.RVS_FORCE_METADATA, handler);
|
|
62
|
-
const skipHit = classSkip || reflector.get(rvs_decorators_1.RVS_SKIP_METADATA, handler);
|
|
63
|
-
if (forceHit)
|
|
64
|
-
force.push(pathToRegex(joined));
|
|
65
|
-
else if (skipHit)
|
|
66
|
-
skip.push(pathToRegex(joined));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return { skip, force };
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* 装饰器路由注册表:应用启动完成后扫描一次。
|
|
73
|
-
* 中间件在请求期查询;启动完成前不会有请求,因此时序安全。
|
|
74
|
-
*/
|
|
75
|
-
let RvsRouteRegistry = class RvsRouteRegistry {
|
|
76
|
-
constructor(discovery, reflector) {
|
|
77
|
-
this.discovery = discovery;
|
|
78
|
-
this.reflector = reflector;
|
|
79
|
-
this.skipMatchers = [];
|
|
80
|
-
this.forceMatchers = [];
|
|
81
|
-
}
|
|
82
|
-
onApplicationBootstrap() {
|
|
83
|
-
const { skip, force } = collectRvsRouteMatchers(this.discovery.getControllers(), this.reflector);
|
|
84
|
-
this.skipMatchers = skip;
|
|
85
|
-
this.forceMatchers = force;
|
|
86
|
-
}
|
|
87
|
-
isSkipped(url) {
|
|
88
|
-
return this.skipMatchers.some((re) => re.test(url));
|
|
89
|
-
}
|
|
90
|
-
isForced(url) {
|
|
91
|
-
return this.forceMatchers.some((re) => re.test(url));
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
exports.RvsRouteRegistry = RvsRouteRegistry;
|
|
95
|
-
exports.RvsRouteRegistry = RvsRouteRegistry = __decorate([
|
|
96
|
-
(0, common_1.Injectable)(),
|
|
97
|
-
__metadata("design:paramtypes", [core_1.DiscoveryService,
|
|
98
|
-
core_1.Reflector])
|
|
99
|
-
], RvsRouteRegistry);
|
|
100
|
-
//# sourceMappingURL=rvs.registry.js.map
|
|
1
|
+
"use strict";var v=Object.defineProperty;var f=(o,t)=>v(o,"name",{value:t,configurable:!0});var __decorate=this&&this.__decorate||function(o,t,e,s){var n=arguments.length,r=n<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,e):s,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,t,e,s);else for(var i=o.length-1;i>=0;i--)(c=o[i])&&(r=(n<3?c(r):n>3?c(t,e,r):c(t,e))||r);return n>3&&r&&Object.defineProperty(t,e,r),r},__metadata=this&&this.__metadata||function(o,t){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,t)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.RvsRouteRegistry=void 0,exports.pathToRegex=pathToRegex,exports.collectRvsRouteMatchers=collectRvsRouteMatchers;const common_1=require("@nestjs/common"),constants_1=require("@nestjs/common/constants"),core_1=require("@nestjs/core"),rvs_decorators_1=require("./rvs.decorators");function pathToRegex(o){const t=o.replace(/^\/+|\/+$/g,"");if(!t)return/^.*$/;const e=t.split("/").map(s=>s==="*"?".*":s.startsWith(":")?"[^/]+":s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("/");return new RegExp(`(?:^|/)${e}(?:/)?(?:\\?|#|$)`)}f(pathToRegex,"pathToRegex");function collectRvsRouteMatchers(o,t){const e=[],s=[];for(const n of o){const{instance:r,metatype:c}=n;if(!r||!c)continue;const i=Reflect.getMetadata(constants_1.PATH_METADATA,c)??"",d=t.get(rvs_decorators_1.RVS_SKIP_METADATA,c),_=t.get(rvs_decorators_1.RVS_FORCE_METADATA,c),p=Object.getPrototypeOf(r);for(const u of Object.getOwnPropertyNames(p)){if(u==="constructor")continue;const a=p[u];if(typeof a!="function")continue;const R=Reflect.getMetadata(constants_1.PATH_METADATA,a);if(R===void 0)continue;const l=[i,R].filter(h=>h!==void 0&&h!=="").join("/"),A=_||t.get(rvs_decorators_1.RVS_FORCE_METADATA,a),m=d||t.get(rvs_decorators_1.RVS_SKIP_METADATA,a);A?s.push(pathToRegex(l)):m&&e.push(pathToRegex(l))}}return{skip:e,force:s}}f(collectRvsRouteMatchers,"collectRvsRouteMatchers");let RvsRouteRegistry=class{static{f(this,"RvsRouteRegistry")}constructor(t,e){this.discovery=t,this.reflector=e,this.skipMatchers=[],this.forceMatchers=[]}onApplicationBootstrap(){const{skip:t,force:e}=collectRvsRouteMatchers(this.discovery.getControllers(),this.reflector);this.skipMatchers=t,this.forceMatchers=e}isSkipped(t){return this.skipMatchers.some(e=>e.test(t))}isForced(t){return this.forceMatchers.some(e=>e.test(t))}};exports.RvsRouteRegistry=RvsRouteRegistry,exports.RvsRouteRegistry=RvsRouteRegistry=__decorate([(0,common_1.Injectable)(),__metadata("design:paramtypes",[core_1.DiscoveryService,core_1.Reflector])],RvsRouteRegistry);
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.registry.js.map
|
package/dist/rvs.registry.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RvsRouteRegistry = void 0;\nexports.pathToRegex = pathToRegex;\nexports.collectRvsRouteMatchers = collectRvsRouteMatchers;\nconst common_1 = require(\"@nestjs/common\");\nconst constants_1 = require(\"@nestjs/common/constants\");\nconst core_1 = require(\"@nestjs/core\");\nconst rvs_decorators_1 = require(\"./rvs.decorators\");\n/** \u8DEF\u7531\u8DEF\u5F84\u8F6C\u6B63\u5219\uFF1A\u652F\u6301 :param \u4E0E * \u901A\u914D\uFF1B\u5141\u8BB8\u5168\u5C40\u524D\u7F00\uFF08\u5982 /api/health/live \u547D\u4E2D health/live\uFF09 */\nfunction pathToRegex(routePath) {\n const normalized = routePath.replace(/^\\/+|\\/+$/g, '');\n if (!normalized)\n return /^.*$/;\n const pattern = normalized\n .split('/')\n .map((segment) => {\n if (segment === '*')\n return '.*';\n if (segment.startsWith(':'))\n return '[^/]+';\n return segment.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n })\n .join('/');\n return new RegExp(`(?:^|/)${pattern}(?:/)?(?:\\\\?|#|$)`);\n}\n/**\n * \u626B\u63CF\u63A7\u5236\u5668\u5143\u6570\u636E\uFF0C\u6536\u96C6 @RvsSkip / @RvsForce \u6807\u8BB0\u7684\u8DEF\u7531\u6B63\u5219\u3002\n * \u62BD\u6210\u7EAF\u51FD\u6570\u4EE5\u4FBF\u6D4B\u8BD5\uFF1BNest \u5BB9\u5668\u76F8\u5173\u903B\u8F91\u5168\u90E8\u5728 RvsRouteRegistry\u3002\n */\nfunction collectRvsRouteMatchers(controllers, reflector) {\n const skip = [];\n const force = [];\n for (const wrapper of controllers) {\n const { instance, metatype } = wrapper;\n if (!instance || !metatype)\n continue;\n const classPath = Reflect.getMetadata(constants_1.PATH_METADATA, metatype) ?? '';\n const classSkip = reflector.get(rvs_decorators_1.RVS_SKIP_METADATA, metatype);\n const classForce = reflector.get(rvs_decorators_1.RVS_FORCE_METADATA, metatype);\n const proto = Object.getPrototypeOf(instance);\n for (const methodName of Object.getOwnPropertyNames(proto)) {\n if (methodName === 'constructor')\n continue;\n const handler = proto[methodName];\n if (typeof handler !== 'function')\n continue;\n const methodPath = Reflect.getMetadata(constants_1.PATH_METADATA, handler);\n if (methodPath === undefined)\n continue; // \u975E\u8DEF\u7531\u65B9\u6CD5\n const joined = [classPath, methodPath].filter((p) => p !== undefined && p !== '').join('/');\n const forceHit = classForce || reflector.get(rvs_decorators_1.RVS_FORCE_METADATA, handler);\n const skipHit = classSkip || reflector.get(rvs_decorators_1.RVS_SKIP_METADATA, handler);\n if (forceHit)\n force.push(pathToRegex(joined));\n else if (skipHit)\n skip.push(pathToRegex(joined));\n }\n }\n return { skip, force };\n}\n/**\n * \u88C5\u9970\u5668\u8DEF\u7531\u6CE8\u518C\u8868\uFF1A\u5E94\u7528\u542F\u52A8\u5B8C\u6210\u540E\u626B\u63CF\u4E00\u6B21\u3002\n * \u4E2D\u95F4\u4EF6\u5728\u8BF7\u6C42\u671F\u67E5\u8BE2\uFF1B\u542F\u52A8\u5B8C\u6210\u524D\u4E0D\u4F1A\u6709\u8BF7\u6C42\uFF0C\u56E0\u6B64\u65F6\u5E8F\u5B89\u5168\u3002\n */\nlet RvsRouteRegistry = class RvsRouteRegistry {\n constructor(discovery, reflector) {\n this.discovery = discovery;\n this.reflector = reflector;\n this.skipMatchers = [];\n this.forceMatchers = [];\n }\n onApplicationBootstrap() {\n const { skip, force } = collectRvsRouteMatchers(this.discovery.getControllers(), this.reflector);\n this.skipMatchers = skip;\n this.forceMatchers = force;\n }\n isSkipped(url) {\n return this.skipMatchers.some((re) => re.test(url));\n }\n isForced(url) {\n return this.forceMatchers.some((re) => re.test(url));\n }\n};\nexports.RvsRouteRegistry = RvsRouteRegistry;\nexports.RvsRouteRegistry = RvsRouteRegistry = __decorate([\n (0, common_1.Injectable)(),\n __metadata(\"design:paramtypes\", [core_1.DiscoveryService,\n core_1.Reflector])\n], RvsRouteRegistry);\n//# sourceMappingURL=rvs.registry.js.map"],
|
|
5
|
+
"mappings": "4FACA,IAAI,WAAc,MAAQ,KAAK,YAAe,SAAUA,EAAYC,EAAQC,EAAKC,EAAM,CACnF,IAAIC,EAAI,UAAU,OAAQ,EAAIA,EAAI,EAAIH,EAASE,IAAS,KAAOA,EAAO,OAAO,yBAAyBF,EAAQC,CAAG,EAAIC,EAAME,EAC3H,GAAI,OAAO,SAAY,UAAY,OAAO,QAAQ,UAAa,WAAY,EAAI,QAAQ,SAASL,EAAYC,EAAQC,EAAKC,CAAI,MACxH,SAAS,EAAIH,EAAW,OAAS,EAAG,GAAK,EAAG,KAASK,EAAIL,EAAW,CAAC,KAAG,GAAKI,EAAI,EAAIC,EAAE,CAAC,EAAID,EAAI,EAAIC,EAAEJ,EAAQC,EAAK,CAAC,EAAIG,EAAEJ,EAAQC,CAAG,IAAM,GAChJ,OAAOE,EAAI,GAAK,GAAK,OAAO,eAAeH,EAAQC,EAAK,CAAC,EAAG,CAChE,EACI,WAAc,MAAQ,KAAK,YAAe,SAAUI,EAAGC,EAAG,CAC1D,GAAI,OAAO,SAAY,UAAY,OAAO,QAAQ,UAAa,WAAY,OAAO,QAAQ,SAASD,EAAGC,CAAC,CAC3G,EACA,OAAO,eAAe,QAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,QAAQ,iBAAmB,OAC3B,QAAQ,YAAc,YACtB,QAAQ,wBAA0B,wBAClC,MAAM,SAAW,QAAQ,gBAAgB,EACnC,YAAc,QAAQ,0BAA0B,EAChD,OAAS,QAAQ,cAAc,EAC/B,iBAAmB,QAAQ,kBAAkB,EAEnD,SAAS,YAAYC,EAAW,CAC5B,MAAMC,EAAaD,EAAU,QAAQ,aAAc,EAAE,EACrD,GAAI,CAACC,EACD,MAAO,OACX,MAAMC,EAAUD,EACX,MAAM,GAAG,EACT,IAAKE,GACFA,IAAY,IACL,KACPA,EAAQ,WAAW,GAAG,EACf,QACJA,EAAQ,QAAQ,sBAAuB,MAAM,CACvD,EACI,KAAK,GAAG,EACb,OAAO,IAAI,OAAO,UAAUD,CAAO,mBAAmB,CAC1D,CAfSE,EAAA,2BAoBT,SAAS,wBAAwBC,EAAaC,EAAW,CACrD,MAAMC,EAAO,CAAC,EACRC,EAAQ,CAAC,EACf,UAAWC,KAAWJ,EAAa,CAC/B,KAAM,CAAE,SAAAK,EAAU,SAAAC,CAAS,EAAIF,EAC/B,GAAI,CAACC,GAAY,CAACC,EACd,SACJ,MAAMC,EAAY,QAAQ,YAAY,YAAY,cAAeD,CAAQ,GAAK,GACxEE,EAAYP,EAAU,IAAI,iBAAiB,kBAAmBK,CAAQ,EACtEG,EAAaR,EAAU,IAAI,iBAAiB,mBAAoBK,CAAQ,EACxEI,EAAQ,OAAO,eAAeL,CAAQ,EAC5C,UAAWM,KAAc,OAAO,oBAAoBD,CAAK,EAAG,CACxD,GAAIC,IAAe,cACf,SACJ,MAAMC,EAAUF,EAAMC,CAAU,EAChC,GAAI,OAAOC,GAAY,WACnB,SACJ,MAAMC,EAAa,QAAQ,YAAY,YAAY,cAAeD,CAAO,EACzE,GAAIC,IAAe,OACf,SACJ,MAAMC,EAAS,CAACP,EAAWM,CAAU,EAAE,OAAQE,GAAMA,IAAM,QAAaA,IAAM,EAAE,EAAE,KAAK,GAAG,EACpFC,EAAWP,GAAcR,EAAU,IAAI,iBAAiB,mBAAoBW,CAAO,EACnFK,EAAUT,GAAaP,EAAU,IAAI,iBAAiB,kBAAmBW,CAAO,EAClFI,EACAb,EAAM,KAAK,YAAYW,CAAM,CAAC,EACzBG,GACLf,EAAK,KAAK,YAAYY,CAAM,CAAC,CACrC,CACJ,CACA,MAAO,CAAE,KAAAZ,EAAM,MAAAC,CAAM,CACzB,CA9BSJ,EAAA,mDAmCT,IAAI,iBAAmB,KAAuB,CA1E9C,MA0E8C,CAAAA,EAAA,yBAC1C,YAAYmB,EAAWjB,EAAW,CAC9B,KAAK,UAAYiB,EACjB,KAAK,UAAYjB,EACjB,KAAK,aAAe,CAAC,EACrB,KAAK,cAAgB,CAAC,CAC1B,CACA,wBAAyB,CACrB,KAAM,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAI,wBAAwB,KAAK,UAAU,eAAe,EAAG,KAAK,SAAS,EAC/F,KAAK,aAAeD,EACpB,KAAK,cAAgBC,CACzB,CACA,UAAUgB,EAAK,CACX,OAAO,KAAK,aAAa,KAAMC,GAAOA,EAAG,KAAKD,CAAG,CAAC,CACtD,CACA,SAASA,EAAK,CACV,OAAO,KAAK,cAAc,KAAMC,GAAOA,EAAG,KAAKD,CAAG,CAAC,CACvD,CACJ,EACA,QAAQ,iBAAmB,iBAC3B,QAAQ,iBAAmB,iBAAmB,WAAW,IACjD,SAAS,YAAY,EACzB,WAAW,oBAAqB,CAAC,OAAO,iBACpC,OAAO,SAAS,CAAC,CACzB,EAAG,gBAAgB",
|
|
6
|
+
"names": ["decorators", "target", "key", "desc", "c", "d", "k", "v", "routePath", "normalized", "pattern", "segment", "__name", "controllers", "reflector", "skip", "force", "wrapper", "instance", "metatype", "classPath", "classSkip", "classForce", "proto", "methodName", "handler", "methodPath", "joined", "p", "forceHit", "skipHit", "discovery", "url", "re"]
|
|
7
|
+
}
|
package/dist/rvs.service.js
CHANGED
|
@@ -1,49 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.RvsService = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const rvs_tokens_1 = require("./rvs.tokens");
|
|
18
|
-
/**
|
|
19
|
-
* RvsService:业务侧访问 RVS 能力的唯一出口。
|
|
20
|
-
* 直接暴露 server 供高级用法(自定义 verify 流程 / internals),常规路径用封装方法。
|
|
21
|
-
*/
|
|
22
|
-
let RvsService = class RvsService {
|
|
23
|
-
constructor(server) {
|
|
24
|
-
this.server = server;
|
|
25
|
-
}
|
|
26
|
-
/** 手动验签(自定义中间件/网关场景);不抛异常,失败经 result.ok 判断 */
|
|
27
|
-
verify(input) {
|
|
28
|
-
return this.server.verify(input);
|
|
29
|
-
}
|
|
30
|
-
/** 动态模式:签发会话种子(宿主自定义下发渠道时使用) */
|
|
31
|
-
issueSession(options) {
|
|
32
|
-
return this.server.issueSession(options);
|
|
33
|
-
}
|
|
34
|
-
/** 动态模式:吊销会话(登出等场景) */
|
|
35
|
-
revokeSession(sessionId) {
|
|
36
|
-
this.server.revokeSession(sessionId);
|
|
37
|
-
}
|
|
38
|
-
/** 加密响应体(自定义响应出口时使用) */
|
|
39
|
-
encryptResponse(payload, context) {
|
|
40
|
-
return this.server.encryptResponse(payload, context);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
exports.RvsService = RvsService;
|
|
44
|
-
exports.RvsService = RvsService = __decorate([
|
|
45
|
-
(0, common_1.Injectable)(),
|
|
46
|
-
__param(0, (0, common_1.Inject)(rvs_tokens_1.RVS_SERVER)),
|
|
47
|
-
__metadata("design:paramtypes", [Object])
|
|
48
|
-
], RvsService);
|
|
49
|
-
//# sourceMappingURL=rvs.service.js.map
|
|
1
|
+
"use strict";var a=Object.defineProperty;var v=(t,e)=>a(t,"name",{value:e,configurable:!0});var __decorate=this&&this.__decorate||function(t,e,r,n){var o=arguments.length,s=o<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,r):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(t,e,r,n);else for(var c=t.length-1;c>=0;c--)(i=t[c])&&(s=(o<3?i(s):o>3?i(e,r,s):i(e,r))||s);return o>3&&s&&Object.defineProperty(e,r,s),s},__metadata=this&&this.__metadata||function(t,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(t,e)},__param=this&&this.__param||function(t,e){return function(r,n){e(r,n,t)}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.RvsService=void 0;const common_1=require("@nestjs/common"),rvs_tokens_1=require("./rvs.tokens");let RvsService=class{static{v(this,"RvsService")}constructor(e){this.server=e}verify(e){return this.server.verify(e)}issueSession(e){return this.server.issueSession(e)}revokeSession(e){this.server.revokeSession(e)}encryptResponse(e,r){return this.server.encryptResponse(e,r)}};exports.RvsService=RvsService,exports.RvsService=RvsService=__decorate([(0,common_1.Injectable)(),__param(0,(0,common_1.Inject)(rvs_tokens_1.RVS_SERVER)),__metadata("design:paramtypes",[Object])],RvsService);
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.service.js.map
|
package/dist/rvs.service.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RvsService = void 0;\nconst common_1 = require(\"@nestjs/common\");\nconst rvs_tokens_1 = require(\"./rvs.tokens\");\n/**\n * RvsService\uFF1A\u4E1A\u52A1\u4FA7\u8BBF\u95EE RVS \u80FD\u529B\u7684\u552F\u4E00\u51FA\u53E3\u3002\n * \u76F4\u63A5\u66B4\u9732 server \u4F9B\u9AD8\u7EA7\u7528\u6CD5\uFF08\u81EA\u5B9A\u4E49 verify \u6D41\u7A0B / internals\uFF09\uFF0C\u5E38\u89C4\u8DEF\u5F84\u7528\u5C01\u88C5\u65B9\u6CD5\u3002\n */\nlet RvsService = class RvsService {\n constructor(server) {\n this.server = server;\n }\n /** \u624B\u52A8\u9A8C\u7B7E\uFF08\u81EA\u5B9A\u4E49\u4E2D\u95F4\u4EF6/\u7F51\u5173\u573A\u666F\uFF09\uFF1B\u4E0D\u629B\u5F02\u5E38\uFF0C\u5931\u8D25\u7ECF result.ok \u5224\u65AD */\n verify(input) {\n return this.server.verify(input);\n }\n /** \u52A8\u6001\u6A21\u5F0F\uFF1A\u7B7E\u53D1\u4F1A\u8BDD\u79CD\u5B50\uFF08\u5BBF\u4E3B\u81EA\u5B9A\u4E49\u4E0B\u53D1\u6E20\u9053\u65F6\u4F7F\u7528\uFF09 */\n issueSession(options) {\n return this.server.issueSession(options);\n }\n /** \u52A8\u6001\u6A21\u5F0F\uFF1A\u540A\u9500\u4F1A\u8BDD\uFF08\u767B\u51FA\u7B49\u573A\u666F\uFF09 */\n revokeSession(sessionId) {\n this.server.revokeSession(sessionId);\n }\n /** \u52A0\u5BC6\u54CD\u5E94\u4F53\uFF08\u81EA\u5B9A\u4E49\u54CD\u5E94\u51FA\u53E3\u65F6\u4F7F\u7528\uFF09 */\n encryptResponse(payload, context) {\n return this.server.encryptResponse(payload, context);\n }\n};\nexports.RvsService = RvsService;\nexports.RvsService = RvsService = __decorate([\n (0, common_1.Injectable)(),\n __param(0, (0, common_1.Inject)(rvs_tokens_1.RVS_SERVER)),\n __metadata(\"design:paramtypes\", [Object])\n], RvsService);\n//# sourceMappingURL=rvs.service.js.map"],
|
|
5
|
+
"mappings": "4FACA,IAAI,WAAc,MAAQ,KAAK,YAAe,SAAUA,EAAYC,EAAQC,EAAKC,EAAM,CACnF,IAAIC,EAAI,UAAU,OAAQC,EAAID,EAAI,EAAIH,EAASE,IAAS,KAAOA,EAAO,OAAO,yBAAyBF,EAAQC,CAAG,EAAIC,EAAMG,EAC3H,GAAI,OAAO,SAAY,UAAY,OAAO,QAAQ,UAAa,WAAYD,EAAI,QAAQ,SAASL,EAAYC,EAAQC,EAAKC,CAAI,MACxH,SAASI,EAAIP,EAAW,OAAS,EAAGO,GAAK,EAAGA,KAASD,EAAIN,EAAWO,CAAC,KAAGF,GAAKD,EAAI,EAAIE,EAAED,CAAC,EAAID,EAAI,EAAIE,EAAEL,EAAQC,EAAKG,CAAC,EAAIC,EAAEL,EAAQC,CAAG,IAAMG,GAChJ,OAAOD,EAAI,GAAKC,GAAK,OAAO,eAAeJ,EAAQC,EAAKG,CAAC,EAAGA,CAChE,EACI,WAAc,MAAQ,KAAK,YAAe,SAAUG,EAAGC,EAAG,CAC1D,GAAI,OAAO,SAAY,UAAY,OAAO,QAAQ,UAAa,WAAY,OAAO,QAAQ,SAASD,EAAGC,CAAC,CAC3G,EACI,QAAW,MAAQ,KAAK,SAAY,SAAUC,EAAYC,EAAW,CACrE,OAAO,SAAUV,EAAQC,EAAK,CAAES,EAAUV,EAAQC,EAAKQ,CAAU,CAAG,CACxE,EACA,OAAO,eAAe,QAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,QAAQ,WAAa,OACrB,MAAM,SAAW,QAAQ,gBAAgB,EACnC,aAAe,QAAQ,cAAc,EAK3C,IAAI,WAAa,KAAiB,CArBlC,MAqBkC,CAAAE,EAAA,mBAC9B,YAAYC,EAAQ,CAChB,KAAK,OAASA,CAClB,CAEA,OAAOC,EAAO,CACV,OAAO,KAAK,OAAO,OAAOA,CAAK,CACnC,CAEA,aAAaC,EAAS,CAClB,OAAO,KAAK,OAAO,aAAaA,CAAO,CAC3C,CAEA,cAAcC,EAAW,CACrB,KAAK,OAAO,cAAcA,CAAS,CACvC,CAEA,gBAAgBC,EAASC,EAAS,CAC9B,OAAO,KAAK,OAAO,gBAAgBD,EAASC,CAAO,CACvD,CACJ,EACA,QAAQ,WAAa,WACrB,QAAQ,WAAa,WAAa,WAAW,IACrC,SAAS,YAAY,EACzB,QAAQ,KAAO,SAAS,QAAQ,aAAa,UAAU,CAAC,EACxD,WAAW,oBAAqB,CAAC,MAAM,CAAC,CAC5C,EAAG,UAAU",
|
|
6
|
+
"names": ["decorators", "target", "key", "desc", "c", "r", "d", "i", "k", "v", "paramIndex", "decorator", "__name", "server", "input", "options", "sessionId", "payload", "context"]
|
|
7
|
+
}
|
package/dist/rvs.tokens.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
exports.RVS_SERVER = 'ANTARES_RVS_SERVER';
|
|
5
|
-
exports.RVS_OPTIONS = 'ANTARES_RVS_OPTIONS';
|
|
6
|
-
//# sourceMappingURL=rvs.tokens.js.map
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.RVS_OPTIONS=exports.RVS_SERVER=void 0,exports.RVS_SERVER="ANTARES_RVS_SERVER",exports.RVS_OPTIONS="ANTARES_RVS_OPTIONS";
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.tokens.js.map
|
package/dist/rvs.tokens.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RVS_OPTIONS = exports.RVS_SERVER = void 0;\nexports.RVS_SERVER = 'ANTARES_RVS_SERVER';\nexports.RVS_OPTIONS = 'ANTARES_RVS_OPTIONS';\n//# sourceMappingURL=rvs.tokens.js.map"],
|
|
5
|
+
"mappings": "aACA,OAAO,eAAe,QAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,QAAQ,YAAc,QAAQ,WAAa,OAC3C,QAAQ,WAAa,qBACrB,QAAQ,YAAc",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/rvs.types.js
CHANGED
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
exports.matchesAnyPath = matchesAnyPath;
|
|
5
|
-
function resolveRvsOptions(options) {
|
|
6
|
-
const isProd = process.env.NODE_ENV === 'production';
|
|
7
|
-
const sessionEndpoint = options.sessionEndpoint === undefined ? '/rvs/session' : options.sessionEndpoint;
|
|
8
|
-
return {
|
|
9
|
-
...options,
|
|
10
|
-
contextProperty: options.contextProperty ?? 'rvs',
|
|
11
|
-
unprotected: options.unprotected ?? (isProd ? 'strict' : 'tolerant'),
|
|
12
|
-
skipPaths: [...(options.skipPaths ?? [])],
|
|
13
|
-
sessionEndpoint: options.mode === 'dynamic' ? sessionEndpoint : null,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
/** 字符串按前缀匹配(与 rand-vec-sig 中间件语义一致),RegExp 按正则匹配 */
|
|
17
|
-
function matchesAnyPath(patterns, url) {
|
|
18
|
-
return patterns.some((pattern) => typeof pattern === 'string' ? url === pattern || url.startsWith(pattern) : pattern.test(url));
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=rvs.types.js.map
|
|
1
|
+
"use strict";var o=Object.defineProperty;var n=(s,e)=>o(s,"name",{value:e,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveRvsOptions=resolveRvsOptions,exports.matchesAnyPath=matchesAnyPath;function resolveRvsOptions(s){const e=process.env.NODE_ENV==="production",t=s.sessionEndpoint===void 0?"/rvs/session":s.sessionEndpoint;return{...s,contextProperty:s.contextProperty??"rvs",unprotected:s.unprotected??(e?"strict":"tolerant"),skipPaths:[...s.skipPaths??[]],sessionEndpoint:s.mode==="dynamic"?t:null}}n(resolveRvsOptions,"resolveRvsOptions");function matchesAnyPath(s,e){return s.some(t=>typeof t=="string"?e===t||e.startsWith(t):t.test(e))}n(matchesAnyPath,"matchesAnyPath");
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=rvs.types.js.map
|
package/dist/rvs.types.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["<stdin>"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRvsOptions = resolveRvsOptions;\nexports.matchesAnyPath = matchesAnyPath;\nfunction resolveRvsOptions(options) {\n const isProd = process.env.NODE_ENV === 'production';\n const sessionEndpoint = options.sessionEndpoint === undefined ? '/rvs/session' : options.sessionEndpoint;\n return {\n ...options,\n contextProperty: options.contextProperty ?? 'rvs',\n unprotected: options.unprotected ?? (isProd ? 'strict' : 'tolerant'),\n skipPaths: [...(options.skipPaths ?? [])],\n sessionEndpoint: options.mode === 'dynamic' ? sessionEndpoint : null,\n };\n}\n/** \u5B57\u7B26\u4E32\u6309\u524D\u7F00\u5339\u914D\uFF08\u4E0E rand-vec-sig \u4E2D\u95F4\u4EF6\u8BED\u4E49\u4E00\u81F4\uFF09\uFF0CRegExp \u6309\u6B63\u5219\u5339\u914D */\nfunction matchesAnyPath(patterns, url) {\n return patterns.some((pattern) => typeof pattern === 'string' ? url === pattern || url.startsWith(pattern) : pattern.test(url));\n}\n//# sourceMappingURL=rvs.types.js.map"],
|
|
5
|
+
"mappings": "4FACA,OAAO,eAAe,QAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,QAAQ,kBAAoB,kBAC5B,QAAQ,eAAiB,eACzB,SAAS,kBAAkBA,EAAS,CAChC,MAAMC,EAAS,QAAQ,IAAI,WAAa,aAClCC,EAAkBF,EAAQ,kBAAoB,OAAY,eAAiBA,EAAQ,gBACzF,MAAO,CACH,GAAGA,EACH,gBAAiBA,EAAQ,iBAAmB,MAC5C,YAAaA,EAAQ,cAAgBC,EAAS,SAAW,YACzD,UAAW,CAAC,GAAID,EAAQ,WAAa,CAAC,CAAE,EACxC,gBAAiBA,EAAQ,OAAS,UAAYE,EAAkB,IACpE,CACJ,CAVSC,EAAA,uCAYT,SAAS,eAAeC,EAAUC,EAAK,CACnC,OAAOD,EAAS,KAAME,GAAY,OAAOA,GAAY,SAAWD,IAAQC,GAAWD,EAAI,WAAWC,CAAO,EAAIA,EAAQ,KAAKD,CAAG,CAAC,CAClI,CAFSF,EAAA",
|
|
6
|
+
"names": ["options", "isProd", "sessionEndpoint", "__name", "patterns", "url", "pattern"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antares-core/rvs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "rand-vec-sig 的 NestJS 适配层:全局验签/解密中间件、响应加密管线、装饰器粒度控制、Redis 防重放与会话端点",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@nestjs/core": "^10.3.7",
|
|
16
16
|
"rand-vec-sig": "^1.0.0",
|
|
17
17
|
"rxjs": "^7.8.1",
|
|
18
|
-
"@antares-core/core": "^2.
|
|
18
|
+
"@antares-core/core": "^2.4.0"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@nestjs/common": "^10.3.7",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"rxjs": "^7.8.1",
|
|
30
30
|
"typescript": "^5.4.5",
|
|
31
31
|
"vitest": "^2.1.8",
|
|
32
|
-
"@antares-core/core": "2.
|
|
32
|
+
"@antares-core/core": "2.4.0"
|
|
33
33
|
},
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"scripts": {
|
|
36
|
-
"build": "tsc -p tsconfig.build.json",
|
|
36
|
+
"build": "tsc -p tsconfig.build.json && node ../../scripts/minify-dist.mjs dist",
|
|
37
37
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
38
|
"test": "vitest run",
|
|
39
39
|
"test:watch": "vitest",
|