@nboconnect/connect 0.1.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.
@@ -0,0 +1,168 @@
1
+ const MAX_LIFETIME_SECONDS = 600;
2
+ const CLOCK_SKEW_SECONDS = 30;
3
+ const BLOCKED_ACTION_IDS = new Set([
4
+ 'live_value_action',
5
+ 'issue_reward',
6
+ 'reward_issuance',
7
+ 'credit_wallet',
8
+ 'wallet_credit',
9
+ 'execute_redemption',
10
+ 'redemption_execution',
11
+ 'payments',
12
+ 'settlement',
13
+ 'treasury_movement',
14
+ 'qude_mutation',
15
+ 'nbr_unlock',
16
+ 'publish_claim',
17
+ 'public_claim_publishing',
18
+ 'nbo_unit_commit',
19
+ 'scada_control',
20
+ 'hcu_hcus_issuance',
21
+ ]);
22
+ function isNonEmptyString(value) {
23
+ return typeof value === 'string' && value.trim().length > 0;
24
+ }
25
+ function isFiniteInteger(value) {
26
+ return typeof value === 'number' && Number.isFinite(value) && Number.isInteger(value);
27
+ }
28
+ function maskOpaqueRef(value) {
29
+ if (!isNonEmptyString(value))
30
+ return 'masked:missing';
31
+ if (value.length <= 8)
32
+ return 'masked:opaque';
33
+ return `masked:${value.slice(0, 4)}...${value.slice(-4)}`;
34
+ }
35
+ function addMissingClaimCodes(claims, denialCodes) {
36
+ const requiredClaims = [
37
+ 'iss', 'aud', 'sub', 'jti', 'tokenType', 'environment', 'organizationId',
38
+ 'nodeId', 'persona', 'capabilityId', 'actionId', 'scope', 'registryVersion',
39
+ 'iat', 'exp', 'authorizationRef',
40
+ ];
41
+ if (requiredClaims.some((claim) => !isNonEmptyString(claims[claim]) && !isFiniteInteger(claims[claim]))) {
42
+ denialCodes.push('REQUIRED_CLAIM_MISSING');
43
+ }
44
+ }
45
+ function addExactBindingCodes(claims, request, denialCodes) {
46
+ const bindings = [
47
+ ['organizationId', request.organizationId, 'ORGANIZATION_MISMATCH'],
48
+ ['nodeId', request.nodeId, 'NODE_MISMATCH'],
49
+ ['persona', request.persona, 'PERSONA_MISMATCH'],
50
+ ['capabilityId', request.capabilityId, 'CAPABILITY_MISMATCH'],
51
+ ['actionId', request.actionId, 'ACTION_MISMATCH'],
52
+ ['scope', request.scope, 'SCOPE_MISMATCH'],
53
+ ];
54
+ for (const [claim, expected, denialCode] of bindings) {
55
+ if (claims[claim] !== expected)
56
+ denialCodes.push(denialCode);
57
+ }
58
+ if (claims.registryVersion !== request.catalog.registryVersion) {
59
+ denialCodes.push('REGISTRY_VERSION_MISMATCH');
60
+ }
61
+ }
62
+ function addTemporalCodes(claims, nowSeconds, denialCodes) {
63
+ if (!isFiniteInteger(claims.iat) || !isFiniteInteger(claims.exp))
64
+ return;
65
+ if (claims.iat > nowSeconds + CLOCK_SKEW_SECONDS)
66
+ denialCodes.push('TOKEN_NOT_YET_VALID');
67
+ if (claims.exp <= nowSeconds)
68
+ denialCodes.push('TOKEN_EXPIRED');
69
+ if (claims.exp <= claims.iat || claims.exp - claims.iat > MAX_LIFETIME_SECONDS) {
70
+ denialCodes.push('TOKEN_LIFETIME_TOO_LONG');
71
+ }
72
+ }
73
+ function addRegistryCodes(request, denialCodes) {
74
+ const capability = request.catalog.capabilityRegistry.find((item) => item.capabilityId === request.capabilityId);
75
+ if (!capability) {
76
+ denialCodes.push('CAPABILITY_NOT_FOUND');
77
+ return;
78
+ }
79
+ if (!capability.personas.includes(request.persona))
80
+ denialCodes.push('PERSONA_NOT_ALLOWED');
81
+ const action = capability.actions.find((item) => item.actionId === request.actionId);
82
+ if (!action) {
83
+ denialCodes.push('ACTION_NOT_ALLOWED');
84
+ }
85
+ else if (action.mode === 'blocked') {
86
+ denialCodes.push('LIVE_VALUE_ACTION_BLOCKED');
87
+ }
88
+ else if (!action.requiredScopes.includes(request.scope)) {
89
+ denialCodes.push('SCOPE_NOT_ALLOWED');
90
+ }
91
+ if (BLOCKED_ACTION_IDS.has(request.actionId) || request.capabilityId === 'production_value_and_claims') {
92
+ denialCodes.push('LIVE_VALUE_ACTION_BLOCKED');
93
+ }
94
+ }
95
+ function uniqueCodes(codes) {
96
+ return [...new Set(codes)];
97
+ }
98
+ export function evaluateConnectRuntimeTokenShadowV1(request) {
99
+ const claims = request.claims;
100
+ const denialCodes = [];
101
+ if (!claims || typeof claims !== 'object') {
102
+ denialCodes.push('MALFORMED_CLAIMS');
103
+ }
104
+ else {
105
+ if (claims.iss !== 'nbo-connect')
106
+ denialCodes.push('ISSUER_MISMATCH');
107
+ if (claims.aud !== 'nbo-connect-action')
108
+ denialCodes.push('AUDIENCE_MISMATCH');
109
+ if (claims.tokenType !== 'connect_action')
110
+ denialCodes.push('TOKEN_TYPE_MISMATCH');
111
+ if (claims.environment !== 'sandbox' || request.environment !== 'sandbox') {
112
+ denialCodes.push('ENVIRONMENT_MISMATCH');
113
+ }
114
+ addMissingClaimCodes(claims, denialCodes);
115
+ addTemporalCodes(claims, request.nowSeconds, denialCodes);
116
+ addExactBindingCodes(claims, request, denialCodes);
117
+ if (request.authorizationActive === false)
118
+ denialCodes.push('AUTHORIZATION_WITHDRAWN');
119
+ if (request.revokedJtis?.includes(claims.jti ?? ''))
120
+ denialCodes.push('TOKEN_REVOKED');
121
+ if (request.consumedJtis?.includes(claims.jti ?? ''))
122
+ denialCodes.push('TOKEN_REPLAYED');
123
+ }
124
+ addRegistryCodes(request, denialCodes);
125
+ const uniqueDenialCodes = uniqueCodes(denialCodes);
126
+ const wouldAuthorize = uniqueDenialCodes.length === 0;
127
+ const tokenRef = maskOpaqueRef(claims?.jti);
128
+ const auditRef = `runtime-token-shadow:${tokenRef}`;
129
+ const evaluatedAt = new Date(request.nowSeconds * 1000).toISOString();
130
+ const audit = {
131
+ schemaVersion: 'nbo.connect.runtime_token_shadow_audit.v1',
132
+ auditRef,
133
+ outcome: wouldAuthorize ? 'RUNTIME_TOKEN_SHADOW_WOULD_ALLOW' : 'RUNTIME_TOKEN_SHADOW_DENIED',
134
+ tokenRef,
135
+ organizationId: isNonEmptyString(claims?.organizationId) ? claims.organizationId : null,
136
+ nodeId: isNonEmptyString(claims?.nodeId) ? claims.nodeId : null,
137
+ persona: isNonEmptyString(claims?.persona) ? claims.persona : null,
138
+ capabilityId: isNonEmptyString(claims?.capabilityId) ? claims.capabilityId : null,
139
+ actionId: isNonEmptyString(claims?.actionId) ? claims.actionId : null,
140
+ scope: isNonEmptyString(claims?.scope) ? claims.scope : null,
141
+ denialCodes: uniqueDenialCodes,
142
+ acceptedForAuthentication: false,
143
+ liveValueActionAttempted: false,
144
+ evaluatedAt,
145
+ };
146
+ return {
147
+ mode: 'shadow_only',
148
+ wouldAuthorize,
149
+ acceptedForAuthentication: false,
150
+ denialCodes: uniqueDenialCodes,
151
+ audit,
152
+ dashboard: {
153
+ tokenRef,
154
+ auditRef,
155
+ status: wouldAuthorize ? 'would_allow' : 'would_deny',
156
+ environment: request.environment,
157
+ organizationId: audit.organizationId,
158
+ nodeId: audit.nodeId,
159
+ persona: audit.persona,
160
+ capabilityId: audit.capabilityId,
161
+ actionId: audit.actionId,
162
+ scope: audit.scope,
163
+ denialCodes: uniqueDenialCodes,
164
+ acceptedForAuthentication: false,
165
+ },
166
+ };
167
+ }
168
+ //# sourceMappingURL=runtimeTokenShadow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeTokenShadow.js","sourceRoot":"","sources":["../src/runtimeTokenShadow.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@nboconnect/connect",
3
+ "version": "0.1.0",
4
+ "description": "Server-side TypeScript client for the governed NBO Connect API",
5
+ "private": false,
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/Planettechnologies/nbo-monorepo.git",
10
+ "directory": "packages/connect-sdk"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "type": "module",
18
+ "main": "dist/index.js",
19
+ "types": "dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "test": "vitest run",
31
+ "replay:runtime-token": "node scripts/replay-runtime-token-shadow.mjs",
32
+ "verify:runtime-token-shadow-release": "node scripts/verify-runtime-token-shadow-release.mjs"
33
+ },
34
+ "devDependencies": {
35
+ "typescript": "^5.6.3",
36
+ "vitest": "^2.1.9"
37
+ }
38
+ }