@openleash/core 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +13 -29
- package/dist/audit.d.ts +11 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +76 -0
- package/dist/audit.js.map +1 -0
- package/dist/canonicalize.d.ts +5 -0
- package/dist/canonicalize.d.ts.map +1 -0
- package/dist/canonicalize.js +51 -0
- package/dist/canonicalize.js.map +1 -0
- package/dist/constraints.d.ts +3 -0
- package/dist/constraints.d.ts.map +1 -0
- package/dist/constraints.js +51 -0
- package/dist/constraints.js.map +1 -0
- package/dist/engine.d.ts +21 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +139 -0
- package/dist/engine.js.map +1 -0
- package/dist/expression.d.ts +3 -0
- package/dist/expression.d.ts.map +1 -0
- package/dist/expression.js +60 -0
- package/dist/expression.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonpath.d.ts +8 -0
- package/dist/jsonpath.d.ts.map +1 -0
- package/dist/jsonpath.js +48 -0
- package/dist/jsonpath.js.map +1 -0
- package/dist/keys.d.ts +9 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +80 -0
- package/dist/keys.js.map +1 -0
- package/dist/nonce-cache.d.ts +17 -0
- package/dist/nonce-cache.d.ts.map +1 -0
- package/dist/nonce-cache.js +53 -0
- package/dist/nonce-cache.js.map +1 -0
- package/dist/obligations.d.ts +9 -0
- package/dist/obligations.d.ts.map +1 -0
- package/dist/obligations.js +89 -0
- package/dist/obligations.js.map +1 -0
- package/dist/policy-parser.d.ts +192 -0
- package/dist/policy-parser.d.ts.map +1 -0
- package/dist/policy-parser.js +153 -0
- package/dist/policy-parser.js.map +1 -0
- package/dist/signing.d.ts +34 -0
- package/dist/signing.d.ts.map +1 -0
- package/dist/signing.js +79 -0
- package/dist/signing.js.map +1 -0
- package/dist/state.d.ts +12 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +118 -0
- package/dist/state.js.map +1 -0
- package/dist/tokens.d.ts +38 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +56 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +276 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -0
- package/package.json +20 -19
- package/index.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AAE9D,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAcrE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateExpr = evaluateExpr;
|
|
4
|
+
const jsonpath_js_1 = require("./jsonpath.js");
|
|
5
|
+
function evaluateExpr(expr, data) {
|
|
6
|
+
if ('all' in expr) {
|
|
7
|
+
return expr.all.every((e) => evaluateExpr(e, data));
|
|
8
|
+
}
|
|
9
|
+
if ('any' in expr) {
|
|
10
|
+
return expr.any.some((e) => evaluateExpr(e, data));
|
|
11
|
+
}
|
|
12
|
+
if ('not' in expr) {
|
|
13
|
+
return !evaluateExpr(expr.not, data);
|
|
14
|
+
}
|
|
15
|
+
if ('match' in expr) {
|
|
16
|
+
return evaluateMatch(expr.match, data);
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
function evaluateMatch(match, data) {
|
|
21
|
+
const actual = (0, jsonpath_js_1.jsonPathGet)(data, match.path);
|
|
22
|
+
const { op, value } = match;
|
|
23
|
+
switch (op) {
|
|
24
|
+
case 'exists':
|
|
25
|
+
return actual !== undefined && actual !== null;
|
|
26
|
+
case 'eq':
|
|
27
|
+
return actual === value;
|
|
28
|
+
case 'neq':
|
|
29
|
+
return actual !== value;
|
|
30
|
+
case 'in':
|
|
31
|
+
if (!Array.isArray(value))
|
|
32
|
+
return false;
|
|
33
|
+
return value.includes(actual);
|
|
34
|
+
case 'nin':
|
|
35
|
+
if (!Array.isArray(value))
|
|
36
|
+
return false;
|
|
37
|
+
return !value.includes(actual);
|
|
38
|
+
case 'lt':
|
|
39
|
+
return typeof actual === 'number' && typeof value === 'number' && actual < value;
|
|
40
|
+
case 'lte':
|
|
41
|
+
return typeof actual === 'number' && typeof value === 'number' && actual <= value;
|
|
42
|
+
case 'gt':
|
|
43
|
+
return typeof actual === 'number' && typeof value === 'number' && actual > value;
|
|
44
|
+
case 'gte':
|
|
45
|
+
return typeof actual === 'number' && typeof value === 'number' && actual >= value;
|
|
46
|
+
case 'regex': {
|
|
47
|
+
if (typeof actual !== 'string' || typeof value !== 'string')
|
|
48
|
+
return false;
|
|
49
|
+
try {
|
|
50
|
+
return new RegExp(value).test(actual);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":";;AAGA,oCAcC;AAjBD,+CAA4C;AAG5C,SAAgB,YAAY,CAAC,IAAgB,EAAE,IAAa;IAC1D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAsB,EAAE,IAAa;IAC1D,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAE5B,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;QACjD,KAAK,IAAI;YACP,OAAO,MAAM,KAAK,KAAK,CAAC;QAC1B,KAAK,KAAK;YACR,OAAO,MAAM,KAAK,KAAK,CAAC;QAC1B,KAAK,IAAI;YACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,KAAK,KAAK;YACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,IAAI;YACP,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,GAAG,KAAK,CAAC;QACnF,KAAK,KAAK;YACR,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC;QACpF,KAAK,IAAI;YACP,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,GAAG,KAAK,CAAC;QACnF,KAAK,KAAK;YACR,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC;QACpF,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC1E,IAAI,CAAC;gBACH,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './canonicalize.js';
|
|
3
|
+
export * from './jsonpath.js';
|
|
4
|
+
export * from './expression.js';
|
|
5
|
+
export * from './constraints.js';
|
|
6
|
+
export * from './obligations.js';
|
|
7
|
+
export * from './policy-parser.js';
|
|
8
|
+
export * from './engine.js';
|
|
9
|
+
export * from './keys.js';
|
|
10
|
+
export * from './tokens.js';
|
|
11
|
+
export * from './state.js';
|
|
12
|
+
export * from './audit.js';
|
|
13
|
+
export * from './nonce-cache.js';
|
|
14
|
+
export * from './signing.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
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("./types.js"), exports);
|
|
18
|
+
__exportStar(require("./canonicalize.js"), exports);
|
|
19
|
+
__exportStar(require("./jsonpath.js"), exports);
|
|
20
|
+
__exportStar(require("./expression.js"), exports);
|
|
21
|
+
__exportStar(require("./constraints.js"), exports);
|
|
22
|
+
__exportStar(require("./obligations.js"), exports);
|
|
23
|
+
__exportStar(require("./policy-parser.js"), exports);
|
|
24
|
+
__exportStar(require("./engine.js"), exports);
|
|
25
|
+
__exportStar(require("./keys.js"), exports);
|
|
26
|
+
__exportStar(require("./tokens.js"), exports);
|
|
27
|
+
__exportStar(require("./state.js"), exports);
|
|
28
|
+
__exportStar(require("./audit.js"), exports);
|
|
29
|
+
__exportStar(require("./nonce-cache.js"), exports);
|
|
30
|
+
__exportStar(require("./signing.js"), exports);
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,oDAAkC;AAClC,gDAA8B;AAC9B,kDAAgC;AAChC,mDAAiC;AACjC,mDAAiC;AACjC,qDAAmC;AACnC,8CAA4B;AAC5B,4CAA0B;AAC1B,8CAA4B;AAC5B,6CAA2B;AAC3B,6CAA2B;AAC3B,mDAAiC;AACjC,+CAA6B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonpath.d.ts","sourceRoot":"","sources":["../src/jsonpath.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoB/D"}
|
package/dist/jsonpath.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.jsonPathGet = jsonPathGet;
|
|
4
|
+
/**
|
|
5
|
+
* Minimal JSONPath accessor.
|
|
6
|
+
* Supports dot access and array indexes only:
|
|
7
|
+
* $.payload.amount_minor
|
|
8
|
+
* $.payload.items[0].sku
|
|
9
|
+
*/
|
|
10
|
+
function jsonPathGet(obj, path) {
|
|
11
|
+
if (!path.startsWith('$.')) {
|
|
12
|
+
throw new Error(`Invalid JSONPath: must start with "$." — got "${path}"`);
|
|
13
|
+
}
|
|
14
|
+
const stripped = path.slice(2); // remove "$."
|
|
15
|
+
const segments = parseSegments(stripped);
|
|
16
|
+
let current = obj;
|
|
17
|
+
for (const seg of segments) {
|
|
18
|
+
if (current === null || current === undefined)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (seg.type === 'key') {
|
|
21
|
+
if (typeof current !== 'object')
|
|
22
|
+
return undefined;
|
|
23
|
+
current = current[seg.value];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
if (!Array.isArray(current))
|
|
27
|
+
return undefined;
|
|
28
|
+
current = current[seg.value];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return current;
|
|
32
|
+
}
|
|
33
|
+
function parseSegments(path) {
|
|
34
|
+
const segments = [];
|
|
35
|
+
const re = /([a-zA-Z_][a-zA-Z0-9_]*)|\[(\d+)\]|\./g;
|
|
36
|
+
let m;
|
|
37
|
+
while ((m = re.exec(path)) !== null) {
|
|
38
|
+
if (m[1] !== undefined) {
|
|
39
|
+
segments.push({ type: 'key', value: m[1] });
|
|
40
|
+
}
|
|
41
|
+
else if (m[2] !== undefined) {
|
|
42
|
+
segments.push({ type: 'index', value: parseInt(m[2], 10) });
|
|
43
|
+
}
|
|
44
|
+
// dots are just separators
|
|
45
|
+
}
|
|
46
|
+
return segments;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=jsonpath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonpath.js","sourceRoot":"","sources":["../src/jsonpath.ts"],"names":[],"mappings":";;AAMA,kCAoBC;AA1BD;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,GAAY,EAAE,IAAY;IACpD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAChE,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACvB,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAClD,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC9C,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAMD,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,wCAAwC,CAAC;IACpD,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,2BAA2B;IAC7B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/keys.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
import type { ServerKeyFile } from './types.js';
|
|
3
|
+
export declare function generateSigningKey(): ServerKeyFile;
|
|
4
|
+
export declare function writeKeyFile(dataDir: string, key: ServerKeyFile): void;
|
|
5
|
+
export declare function readKeyFile(dataDir: string, kid: string): ServerKeyFile;
|
|
6
|
+
export declare function getPrivateKeyObject(key: ServerKeyFile): crypto.KeyObject;
|
|
7
|
+
export declare function getPublicKeyObject(key: ServerKeyFile): crypto.KeyObject;
|
|
8
|
+
export declare function getPublicKeyObjectFromB64(publicKeyB64: string): crypto.KeyObject;
|
|
9
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAGtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,kBAAkB,IAAI,aAAa,CAclD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAKtE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAGvE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,SAAS,CAGxE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,SAAS,CAGvE;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS,CAGhF"}
|
package/dist/keys.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateSigningKey = generateSigningKey;
|
|
37
|
+
exports.writeKeyFile = writeKeyFile;
|
|
38
|
+
exports.readKeyFile = readKeyFile;
|
|
39
|
+
exports.getPrivateKeyObject = getPrivateKeyObject;
|
|
40
|
+
exports.getPublicKeyObject = getPublicKeyObject;
|
|
41
|
+
exports.getPublicKeyObjectFromB64 = getPublicKeyObjectFromB64;
|
|
42
|
+
const crypto = __importStar(require("node:crypto"));
|
|
43
|
+
const fs = __importStar(require("node:fs"));
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
function generateSigningKey() {
|
|
46
|
+
const kid = crypto.randomUUID();
|
|
47
|
+
const keypair = crypto.generateKeyPairSync('ed25519');
|
|
48
|
+
const publicKeyDer = keypair.publicKey.export({ type: 'spki', format: 'der' });
|
|
49
|
+
const privateKeyDer = keypair.privateKey.export({ type: 'pkcs8', format: 'der' });
|
|
50
|
+
return {
|
|
51
|
+
kid,
|
|
52
|
+
public_key_b64: publicKeyDer.toString('base64'),
|
|
53
|
+
private_key_b64: privateKeyDer.toString('base64'),
|
|
54
|
+
created_at: new Date().toISOString(),
|
|
55
|
+
revoked_at: null,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function writeKeyFile(dataDir, key) {
|
|
59
|
+
const keysDir = path.join(dataDir, 'keys');
|
|
60
|
+
fs.mkdirSync(keysDir, { recursive: true });
|
|
61
|
+
const filePath = path.join(keysDir, `${key.kid}.json`);
|
|
62
|
+
fs.writeFileSync(filePath, JSON.stringify(key, null, 2), 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
function readKeyFile(dataDir, kid) {
|
|
65
|
+
const filePath = path.join(dataDir, 'keys', `${kid}.json`);
|
|
66
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
67
|
+
}
|
|
68
|
+
function getPrivateKeyObject(key) {
|
|
69
|
+
const der = Buffer.from(key.private_key_b64, 'base64');
|
|
70
|
+
return crypto.createPrivateKey({ key: der, format: 'der', type: 'pkcs8' });
|
|
71
|
+
}
|
|
72
|
+
function getPublicKeyObject(key) {
|
|
73
|
+
const der = Buffer.from(key.public_key_b64, 'base64');
|
|
74
|
+
return crypto.createPublicKey({ key: der, format: 'der', type: 'spki' });
|
|
75
|
+
}
|
|
76
|
+
function getPublicKeyObjectFromB64(publicKeyB64) {
|
|
77
|
+
const der = Buffer.from(publicKeyB64, 'base64');
|
|
78
|
+
return crypto.createPublicKey({ key: der, format: 'der', type: 'spki' });
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,gDAcC;AAED,oCAKC;AAED,kCAGC;AAED,kDAGC;AAED,gDAGC;AAED,8DAGC;AA9CD,oDAAsC;AACtC,4CAA8B;AAC9B,gDAAkC;AAGlC,SAAgB,kBAAkB;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAElF,OAAO;QACL,GAAG;QACH,cAAc,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe,EAAE,GAAkB;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IACvD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe,EAAE,GAAW;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAkB;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAkB;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAgB,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL nonce cache for replay protection.
|
|
3
|
+
*/
|
|
4
|
+
export declare class NonceCache {
|
|
5
|
+
private cache;
|
|
6
|
+
private ttlMs;
|
|
7
|
+
private cleanupInterval;
|
|
8
|
+
constructor(ttlSeconds?: number);
|
|
9
|
+
/**
|
|
10
|
+
* Check if nonce has been seen. Returns true if nonce is fresh (not seen before).
|
|
11
|
+
* Returns false if nonce is a replay.
|
|
12
|
+
*/
|
|
13
|
+
check(agentId: string, nonce: string): boolean;
|
|
14
|
+
private cleanup;
|
|
15
|
+
destroy(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=nonce-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-cache.d.ts","sourceRoot":"","sources":["../src/nonce-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAA+C;gBAE1D,UAAU,GAAE,MAAY;IAUpC;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAe9C,OAAO,CAAC,OAAO;IASf,OAAO,IAAI,IAAI;CAOhB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NonceCache = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory TTL nonce cache for replay protection.
|
|
6
|
+
*/
|
|
7
|
+
class NonceCache {
|
|
8
|
+
cache = new Map(); // nonce -> expiry timestamp
|
|
9
|
+
ttlMs;
|
|
10
|
+
cleanupInterval = null;
|
|
11
|
+
constructor(ttlSeconds = 600) {
|
|
12
|
+
this.ttlMs = ttlSeconds * 1000;
|
|
13
|
+
// Periodic cleanup every 60 seconds
|
|
14
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60_000);
|
|
15
|
+
// Allow Node to exit even if interval is running
|
|
16
|
+
if (this.cleanupInterval.unref) {
|
|
17
|
+
this.cleanupInterval.unref();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if nonce has been seen. Returns true if nonce is fresh (not seen before).
|
|
22
|
+
* Returns false if nonce is a replay.
|
|
23
|
+
*/
|
|
24
|
+
check(agentId, nonce) {
|
|
25
|
+
const key = `${agentId}:${nonce}`;
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
// Check if nonce exists and hasn't expired
|
|
28
|
+
const expiry = this.cache.get(key);
|
|
29
|
+
if (expiry !== undefined && expiry > now) {
|
|
30
|
+
return false; // replay
|
|
31
|
+
}
|
|
32
|
+
// Store nonce
|
|
33
|
+
this.cache.set(key, now + this.ttlMs);
|
|
34
|
+
return true; // fresh
|
|
35
|
+
}
|
|
36
|
+
cleanup() {
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
for (const [key, expiry] of this.cache) {
|
|
39
|
+
if (expiry <= now) {
|
|
40
|
+
this.cache.delete(key);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
destroy() {
|
|
45
|
+
if (this.cleanupInterval) {
|
|
46
|
+
clearInterval(this.cleanupInterval);
|
|
47
|
+
this.cleanupInterval = null;
|
|
48
|
+
}
|
|
49
|
+
this.cache.clear();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.NonceCache = NonceCache;
|
|
53
|
+
//# sourceMappingURL=nonce-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-cache.js","sourceRoot":"","sources":["../src/nonce-cache.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,UAAU;IACb,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,4BAA4B;IAC/D,KAAK,CAAS;IACd,eAAe,GAA0C,IAAI,CAAC;IAEtE,YAAY,aAAqB,GAAG;QAClC,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;QAC/B,oCAAoC;QACpC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QACjE,iDAAiD;QACjD,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAe,EAAE,KAAa;QAClC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC,CAAC,SAAS;QACzB,CAAC;QAED,cAAc;QACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,CAAC,QAAQ;IACvB,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAlDD,gCAkDC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ActionRequest, DecisionResult, Obligation, PolicyObligation, PolicyRequirements } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compute obligations from rule obligations + requirements, then derive decision.
|
|
4
|
+
*/
|
|
5
|
+
export declare function computeObligationsAndDecision(ruleObligations: PolicyObligation[] | undefined, requirements: PolicyRequirements | undefined, action: ActionRequest): {
|
|
6
|
+
result: DecisionResult;
|
|
7
|
+
obligations: Obligation[];
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=obligations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligations.d.ts","sourceRoot":"","sources":["../src/obligations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,gBAAgB,EAAE,GAAG,SAAS,EAC/C,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,MAAM,EAAE,aAAa,GACpB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CA6CvD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.computeObligationsAndDecision = computeObligationsAndDecision;
|
|
37
|
+
const crypto = __importStar(require("node:crypto"));
|
|
38
|
+
const ASSURANCE_ORDER = {
|
|
39
|
+
LOW: 0,
|
|
40
|
+
SUBSTANTIAL: 1,
|
|
41
|
+
HIGH: 2,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Compute obligations from rule obligations + requirements, then derive decision.
|
|
45
|
+
*/
|
|
46
|
+
function computeObligationsAndDecision(ruleObligations, requirements, action) {
|
|
47
|
+
const obligations = [];
|
|
48
|
+
// Collect explicit obligations from rule
|
|
49
|
+
if (ruleObligations) {
|
|
50
|
+
for (const ob of ruleObligations) {
|
|
51
|
+
obligations.push({
|
|
52
|
+
obligation_id: crypto.randomUUID(),
|
|
53
|
+
type: ob.type,
|
|
54
|
+
status: 'PENDING',
|
|
55
|
+
details_json: ob.params ?? {},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Check requirements -> may add STEP_UP_AUTH obligation
|
|
60
|
+
if (requirements?.min_assurance_level) {
|
|
61
|
+
const required = requirements.min_assurance_level;
|
|
62
|
+
const actual = action.payload.assurance_level || 'LOW';
|
|
63
|
+
const requiredLevel = ASSURANCE_ORDER[required] ?? 0;
|
|
64
|
+
const actualLevel = ASSURANCE_ORDER[actual] ?? 0;
|
|
65
|
+
if (actualLevel < requiredLevel) {
|
|
66
|
+
obligations.push({
|
|
67
|
+
obligation_id: crypto.randomUUID(),
|
|
68
|
+
type: 'STEP_UP_AUTH',
|
|
69
|
+
status: 'PENDING',
|
|
70
|
+
details_json: { min_assurance_level: required },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Determine decision from obligations (blocking precedence)
|
|
75
|
+
const types = new Set(obligations.map((o) => o.type));
|
|
76
|
+
let result = 'ALLOW';
|
|
77
|
+
if (types.has('HUMAN_APPROVAL')) {
|
|
78
|
+
result = 'REQUIRE_APPROVAL';
|
|
79
|
+
}
|
|
80
|
+
else if (types.has('STEP_UP_AUTH')) {
|
|
81
|
+
result = 'REQUIRE_STEP_UP';
|
|
82
|
+
}
|
|
83
|
+
else if (types.has('DEPOSIT')) {
|
|
84
|
+
result = 'REQUIRE_DEPOSIT';
|
|
85
|
+
}
|
|
86
|
+
// COUNTERPARTY_ATTESTATION is non-blocking: result stays ALLOW
|
|
87
|
+
return { result, obligations };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=obligations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligations.js","sourceRoot":"","sources":["../src/obligations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,sEAiDC;AAnED,oDAAsC;AAStC,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,CAAC;IACN,WAAW,EAAE,CAAC;IACd,IAAI,EAAE,CAAC;CACR,CAAC;AAEF;;GAEG;AACH,SAAgB,6BAA6B,CAC3C,eAA+C,EAC/C,YAA4C,EAC5C,MAAqB;IAErB,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,yCAAyC;IACzC,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;YACjC,WAAW,CAAC,IAAI,CAAC;gBACf,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE;gBAClC,IAAI,EAAE,EAAE,CAAC,IAA0B;gBACnC,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,YAAY,EAAE,mBAAmB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,mBAAmB,CAAC;QAClD,MAAM,MAAM,GAAI,MAAM,CAAC,OAAO,CAAC,eAA0B,IAAI,KAAK,CAAC;QACnE,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC;gBACf,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE;gBAClC,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD,IAAI,MAAM,GAAmB,OAAO,CAAC;IACrC,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,kBAAkB,CAAC;IAC9B,CAAC;SAAM,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,iBAAiB,CAAC;IAC7B,CAAC;SAAM,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,iBAAiB,CAAC;IAC7B,CAAC;IACD,+DAA+D;IAE/D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
|