@stratum-hq/lib 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.
- package/dist/__tests__/crypto.test.d.ts +2 -0
- package/dist/__tests__/crypto.test.d.ts.map +1 -0
- package/dist/__tests__/crypto.test.js +41 -0
- package/dist/__tests__/crypto.test.js.map +1 -0
- package/dist/crypto.d.ts +7 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +74 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/pool-helpers.d.ts +4 -0
- package/dist/pool-helpers.d.ts.map +1 -0
- package/dist/pool-helpers.js +31 -0
- package/dist/pool-helpers.js.map +1 -0
- package/dist/services/__tests__/audit-service.test.d.ts +2 -0
- package/dist/services/__tests__/audit-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/audit-service.test.js +220 -0
- package/dist/services/__tests__/audit-service.test.js.map +1 -0
- package/dist/services/__tests__/config-service.test.d.ts +2 -0
- package/dist/services/__tests__/config-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/config-service.test.js +555 -0
- package/dist/services/__tests__/config-service.test.js.map +1 -0
- package/dist/services/__tests__/consent-service.test.d.ts +2 -0
- package/dist/services/__tests__/consent-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/consent-service.test.js +159 -0
- package/dist/services/__tests__/consent-service.test.js.map +1 -0
- package/dist/services/__tests__/event-service.test.d.ts +2 -0
- package/dist/services/__tests__/event-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/event-service.test.js +151 -0
- package/dist/services/__tests__/event-service.test.js.map +1 -0
- package/dist/services/__tests__/permission-service.test.d.ts +2 -0
- package/dist/services/__tests__/permission-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/permission-service.test.js +470 -0
- package/dist/services/__tests__/permission-service.test.js.map +1 -0
- package/dist/services/__tests__/retention-service.test.d.ts +2 -0
- package/dist/services/__tests__/retention-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/retention-service.test.js +126 -0
- package/dist/services/__tests__/retention-service.test.js.map +1 -0
- package/dist/services/__tests__/tenant-service.test.d.ts +2 -0
- package/dist/services/__tests__/tenant-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/tenant-service.test.js +451 -0
- package/dist/services/__tests__/tenant-service.test.js.map +1 -0
- package/dist/services/__tests__/test-helpers.d.ts +9 -0
- package/dist/services/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/services/__tests__/test-helpers.js +20 -0
- package/dist/services/__tests__/test-helpers.js.map +1 -0
- package/dist/services/__tests__/webhook-service.test.d.ts +2 -0
- package/dist/services/__tests__/webhook-service.test.d.ts.map +1 -0
- package/dist/services/__tests__/webhook-service.test.js +174 -0
- package/dist/services/__tests__/webhook-service.test.js.map +1 -0
- package/dist/services/api-key-service.d.ts +61 -0
- package/dist/services/api-key-service.d.ts.map +1 -0
- package/dist/services/api-key-service.js +164 -0
- package/dist/services/api-key-service.js.map +1 -0
- package/dist/services/audit-service.d.ts +6 -0
- package/dist/services/audit-service.d.ts.map +1 -0
- package/dist/services/audit-service.js +85 -0
- package/dist/services/audit-service.js.map +1 -0
- package/dist/services/config-service.d.ts +33 -0
- package/dist/services/config-service.d.ts.map +1 -0
- package/dist/services/config-service.js +271 -0
- package/dist/services/config-service.js.map +1 -0
- package/dist/services/consent-service.d.ts +7 -0
- package/dist/services/consent-service.d.ts.map +1 -0
- package/dist/services/consent-service.js +71 -0
- package/dist/services/consent-service.js.map +1 -0
- package/dist/services/event-service.d.ts +39 -0
- package/dist/services/event-service.d.ts.map +1 -0
- package/dist/services/event-service.js +331 -0
- package/dist/services/event-service.js.map +1 -0
- package/dist/services/key-rotation-service.d.ts +15 -0
- package/dist/services/key-rotation-service.d.ts.map +1 -0
- package/dist/services/key-rotation-service.js +41 -0
- package/dist/services/key-rotation-service.js.map +1 -0
- package/dist/services/permission-service.d.ts +21 -0
- package/dist/services/permission-service.d.ts.map +1 -0
- package/dist/services/permission-service.js +213 -0
- package/dist/services/permission-service.js.map +1 -0
- package/dist/services/region-service.d.ts +9 -0
- package/dist/services/region-service.d.ts.map +1 -0
- package/dist/services/region-service.js +105 -0
- package/dist/services/region-service.js.map +1 -0
- package/dist/services/retention-service.d.ts +19 -0
- package/dist/services/retention-service.d.ts.map +1 -0
- package/dist/services/retention-service.js +88 -0
- package/dist/services/retention-service.js.map +1 -0
- package/dist/services/role-service.d.ts +35 -0
- package/dist/services/role-service.d.ts.map +1 -0
- package/dist/services/role-service.js +101 -0
- package/dist/services/role-service.js.map +1 -0
- package/dist/services/tenant-service.d.ts +25 -0
- package/dist/services/tenant-service.d.ts.map +1 -0
- package/dist/services/tenant-service.js +335 -0
- package/dist/services/tenant-service.js.map +1 -0
- package/dist/services/webhook-service.d.ts +12 -0
- package/dist/services/webhook-service.d.ts.map +1 -0
- package/dist/services/webhook-service.js +129 -0
- package/dist/services/webhook-service.js.map +1 -0
- package/dist/stratum.d.ts +107 -0
- package/dist/stratum.d.ts.map +1 -0
- package/dist/stratum.js +531 -0
- package/dist/stratum.js.map +1 -0
- package/dist/telemetry.d.ts +27 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +94 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +46 -0
package/dist/stratum.js
ADDED
|
@@ -0,0 +1,531 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.Stratum = void 0;
|
|
30
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
31
|
+
const tenantService = __importStar(require("./services/tenant-service.js"));
|
|
32
|
+
const configService = __importStar(require("./services/config-service.js"));
|
|
33
|
+
const permissionService = __importStar(require("./services/permission-service.js"));
|
|
34
|
+
const apiKeyService = __importStar(require("./services/api-key-service.js"));
|
|
35
|
+
const webhookService = __importStar(require("./services/webhook-service.js"));
|
|
36
|
+
const eventService = __importStar(require("./services/event-service.js"));
|
|
37
|
+
const auditService = __importStar(require("./services/audit-service.js"));
|
|
38
|
+
const consentService = __importStar(require("./services/consent-service.js"));
|
|
39
|
+
const retentionService = __importStar(require("./services/retention-service.js"));
|
|
40
|
+
const regionService = __importStar(require("./services/region-service.js"));
|
|
41
|
+
const keyRotationService = __importStar(require("./services/key-rotation-service.js"));
|
|
42
|
+
const roleService = __importStar(require("./services/role-service.js"));
|
|
43
|
+
const telemetry_js_1 = require("./telemetry.js");
|
|
44
|
+
const core_1 = require("@stratum-hq/core");
|
|
45
|
+
class Stratum {
|
|
46
|
+
pool;
|
|
47
|
+
keyPrefix;
|
|
48
|
+
constructor(options) {
|
|
49
|
+
this.pool = options.pool;
|
|
50
|
+
this.keyPrefix = options.keyPrefix ?? "sk_live_";
|
|
51
|
+
}
|
|
52
|
+
// Internal event emission — fire-and-forget, errors are non-fatal
|
|
53
|
+
emitEvent(type, tenantId, data,
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
55
|
+
parentSpan) {
|
|
56
|
+
eventService.emitEvent(this.pool, type, tenantId, data).catch((err) => {
|
|
57
|
+
// Record emission failure on the parent span if available, but never throw
|
|
58
|
+
if (parentSpan) {
|
|
59
|
+
try {
|
|
60
|
+
parentSpan.addEvent("stratum.event_emission_failed", {
|
|
61
|
+
"stratum.event_type": type,
|
|
62
|
+
"stratum.error": err instanceof Error ? err.message : String(err),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Swallow — telemetry must never affect the primary operation
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Tenant operations
|
|
72
|
+
async createTenant(input, audit) {
|
|
73
|
+
return (0, telemetry_js_1.traced)("tenant.create", { slug: input.slug ?? "" }, async (span) => {
|
|
74
|
+
const tenant = await tenantService.createTenant(this.pool, input);
|
|
75
|
+
span.setAttribute("stratum.tenant_id", tenant.id);
|
|
76
|
+
this.emitEvent(core_1.TenantEvent.TENANT_CREATED, tenant.id, { tenant }, span);
|
|
77
|
+
if (audit) {
|
|
78
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.created", "tenant", tenant.id, tenant.id, null, tenant);
|
|
79
|
+
}
|
|
80
|
+
return tenant;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
getTenant(id, includeArchived) {
|
|
84
|
+
return (0, telemetry_js_1.traced)("tenant.get", { tenant_id: id }, async () => {
|
|
85
|
+
return tenantService.getTenant(this.pool, id, includeArchived);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
listTenants(pagination) {
|
|
89
|
+
return tenantService.listTenants(this.pool, pagination);
|
|
90
|
+
}
|
|
91
|
+
async updateTenant(id, patch, audit) {
|
|
92
|
+
return (0, telemetry_js_1.traced)("tenant.update", { tenant_id: id }, async (span) => {
|
|
93
|
+
const tenant = await tenantService.updateTenant(this.pool, id, patch);
|
|
94
|
+
this.emitEvent(core_1.TenantEvent.TENANT_UPDATED, tenant.id, { tenant }, span);
|
|
95
|
+
if (audit) {
|
|
96
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.updated", "tenant", id, id, null, patch);
|
|
97
|
+
}
|
|
98
|
+
return tenant;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async deleteTenant(id, audit) {
|
|
102
|
+
return (0, telemetry_js_1.traced)("tenant.delete", { tenant_id: id }, async (span) => {
|
|
103
|
+
await tenantService.deleteTenant(this.pool, id);
|
|
104
|
+
this.emitEvent(core_1.TenantEvent.TENANT_DELETED, id, { tenant_id: id }, span);
|
|
105
|
+
if (audit) {
|
|
106
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.deleted", "tenant", id, id);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async moveTenant(id, newParentId, audit) {
|
|
111
|
+
return (0, telemetry_js_1.traced)("tenant.move", { tenant_id: id, new_parent_id: newParentId }, async (span) => {
|
|
112
|
+
const tenant = await tenantService.moveTenant(this.pool, id, newParentId);
|
|
113
|
+
this.emitEvent(core_1.TenantEvent.TENANT_MOVED, tenant.id, { tenant, new_parent_id: newParentId }, span);
|
|
114
|
+
if (audit) {
|
|
115
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.moved", "tenant", id, id, null, null, { new_parent_id: newParentId });
|
|
116
|
+
}
|
|
117
|
+
return tenant;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
getAncestors(id) {
|
|
121
|
+
return tenantService.getAncestors(this.pool, id);
|
|
122
|
+
}
|
|
123
|
+
getDescendants(id) {
|
|
124
|
+
return tenantService.getDescendants(this.pool, id);
|
|
125
|
+
}
|
|
126
|
+
getChildren(id) {
|
|
127
|
+
return tenantService.getChildren(this.pool, id);
|
|
128
|
+
}
|
|
129
|
+
// Tenant impersonation context
|
|
130
|
+
async getTenantContext(tenantId) {
|
|
131
|
+
const [tenant, config, permissions, ancestors] = await Promise.all([
|
|
132
|
+
this.getTenant(tenantId),
|
|
133
|
+
this.resolveConfig(tenantId),
|
|
134
|
+
this.resolvePermissions(tenantId),
|
|
135
|
+
this.getAncestors(tenantId),
|
|
136
|
+
]);
|
|
137
|
+
return { tenant, config, permissions, ancestors };
|
|
138
|
+
}
|
|
139
|
+
// Config operations
|
|
140
|
+
resolveConfig(tenantId) {
|
|
141
|
+
return (0, telemetry_js_1.traced)("config.resolve", { tenant_id: tenantId }, async () => {
|
|
142
|
+
return configService.resolveConfig(this.pool, tenantId);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async setConfig(tenantId, key, input, audit) {
|
|
146
|
+
return (0, telemetry_js_1.traced)("config.set", { tenant_id: tenantId, config_key: key }, async (span) => {
|
|
147
|
+
const entry = await configService.setConfig(this.pool, tenantId, key, input);
|
|
148
|
+
this.emitEvent(core_1.TenantEvent.CONFIG_UPDATED, tenantId, { key, entry }, span);
|
|
149
|
+
if (audit) {
|
|
150
|
+
await auditService.createAuditEntry(this.pool, audit, "config.updated", "config", key, tenantId, null, input);
|
|
151
|
+
}
|
|
152
|
+
return entry;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async deleteConfig(tenantId, key, audit) {
|
|
156
|
+
await configService.deleteConfig(this.pool, tenantId, key);
|
|
157
|
+
this.emitEvent(core_1.TenantEvent.CONFIG_DELETED, tenantId, { key });
|
|
158
|
+
if (audit) {
|
|
159
|
+
await auditService.createAuditEntry(this.pool, audit, "config.deleted", "config", key, tenantId);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
getConfigWithInheritance(tenantId) {
|
|
163
|
+
return configService.getConfigWithInheritance(this.pool, tenantId);
|
|
164
|
+
}
|
|
165
|
+
// Config diff
|
|
166
|
+
async diffConfig(tenantIdA, tenantIdB) {
|
|
167
|
+
const [tenantA, tenantB, configA, configB] = await Promise.all([
|
|
168
|
+
this.getTenant(tenantIdA),
|
|
169
|
+
this.getTenant(tenantIdB),
|
|
170
|
+
this.resolveConfig(tenantIdA),
|
|
171
|
+
this.resolveConfig(tenantIdB),
|
|
172
|
+
]);
|
|
173
|
+
const allKeys = new Set([
|
|
174
|
+
...Object.keys(configA),
|
|
175
|
+
...Object.keys(configB),
|
|
176
|
+
]);
|
|
177
|
+
const toDiffEntry = (entry) => {
|
|
178
|
+
let status;
|
|
179
|
+
if (entry.locked) {
|
|
180
|
+
status = "locked";
|
|
181
|
+
}
|
|
182
|
+
else if (entry.inherited) {
|
|
183
|
+
status = "inherited";
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
status = "own";
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
value: entry.value,
|
|
190
|
+
status,
|
|
191
|
+
source: entry.source_tenant_id,
|
|
192
|
+
};
|
|
193
|
+
};
|
|
194
|
+
const diff = [];
|
|
195
|
+
for (const key of [...allKeys].sort()) {
|
|
196
|
+
diff.push({
|
|
197
|
+
key,
|
|
198
|
+
tenant_a: configA[key] ? toDiffEntry(configA[key]) : null,
|
|
199
|
+
tenant_b: configB[key] ? toDiffEntry(configB[key]) : null,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
tenant_a: { id: tenantA.id, name: tenantA.name },
|
|
204
|
+
tenant_b: { id: tenantB.id, name: tenantB.name },
|
|
205
|
+
diff,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Permission operations
|
|
209
|
+
resolvePermissions(tenantId) {
|
|
210
|
+
return (0, telemetry_js_1.traced)("permissions.resolve", { tenant_id: tenantId }, async () => {
|
|
211
|
+
return permissionService.resolvePermissions(this.pool, tenantId);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
async createPermission(tenantId, input, audit) {
|
|
215
|
+
return (0, telemetry_js_1.traced)("permission.create", { tenant_id: tenantId }, async (span) => {
|
|
216
|
+
const policy = await permissionService.createPermission(this.pool, tenantId, input);
|
|
217
|
+
this.emitEvent(core_1.TenantEvent.PERMISSION_CREATED, tenantId, { policy }, span);
|
|
218
|
+
if (audit) {
|
|
219
|
+
await auditService.createAuditEntry(this.pool, audit, "permission.created", "permission", policy.id, tenantId, null, policy);
|
|
220
|
+
}
|
|
221
|
+
return policy;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async updatePermission(tenantId, policyId, input, audit) {
|
|
225
|
+
const policy = await permissionService.updatePermission(this.pool, tenantId, policyId, input);
|
|
226
|
+
this.emitEvent(core_1.TenantEvent.PERMISSION_UPDATED, tenantId, { policy });
|
|
227
|
+
if (audit) {
|
|
228
|
+
await auditService.createAuditEntry(this.pool, audit, "permission.updated", "permission", policyId, tenantId, null, input);
|
|
229
|
+
}
|
|
230
|
+
return policy;
|
|
231
|
+
}
|
|
232
|
+
async deletePermission(tenantId, policyId, audit) {
|
|
233
|
+
await permissionService.deletePermission(this.pool, tenantId, policyId);
|
|
234
|
+
this.emitEvent(core_1.TenantEvent.PERMISSION_DELETED, tenantId, { policy_id: policyId });
|
|
235
|
+
if (audit) {
|
|
236
|
+
await auditService.createAuditEntry(this.pool, audit, "permission.deleted", "permission", policyId, tenantId);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// API Key operations
|
|
240
|
+
createApiKey(tenantId, nameOrOptions, expiresAt) {
|
|
241
|
+
return (0, telemetry_js_1.traced)("api_key.create", { tenant_id: tenantId }, async () => {
|
|
242
|
+
return apiKeyService.createApiKey(this.pool, this.keyPrefix, tenantId, nameOrOptions, expiresAt);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
validateApiKey(key) {
|
|
246
|
+
return (0, telemetry_js_1.traced)("api_key.validate", {}, async () => {
|
|
247
|
+
return apiKeyService.validateApiKey(this.pool, key);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
revokeApiKey(keyId) {
|
|
251
|
+
return (0, telemetry_js_1.traced)("api_key.revoke", { key_id: keyId }, async () => {
|
|
252
|
+
return apiKeyService.revokeApiKey(this.pool, keyId);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
rotateApiKey(keyId, newName) {
|
|
256
|
+
return apiKeyService.rotateApiKey(this.pool, this.keyPrefix, keyId, newName);
|
|
257
|
+
}
|
|
258
|
+
listApiKeys(tenantId) {
|
|
259
|
+
return apiKeyService.listApiKeys(this.pool, tenantId);
|
|
260
|
+
}
|
|
261
|
+
listDormantKeys(dormantDays) {
|
|
262
|
+
return apiKeyService.listDormantKeys(this.pool, dormantDays);
|
|
263
|
+
}
|
|
264
|
+
// Webhook operations
|
|
265
|
+
async createWebhook(input, audit) {
|
|
266
|
+
this.validateWebhookUrl(input.url);
|
|
267
|
+
const webhook = await webhookService.createWebhook(this.pool, input);
|
|
268
|
+
if (audit) {
|
|
269
|
+
await auditService.createAuditEntry(this.pool, audit, "webhook.created", "webhook", webhook.id, input.tenant_id ?? null, null, { url: webhook.url, events: webhook.events });
|
|
270
|
+
}
|
|
271
|
+
return webhook;
|
|
272
|
+
}
|
|
273
|
+
getWebhook(id) {
|
|
274
|
+
return webhookService.getWebhook(this.pool, id);
|
|
275
|
+
}
|
|
276
|
+
listWebhooks(tenantId) {
|
|
277
|
+
return webhookService.listWebhooks(this.pool, tenantId);
|
|
278
|
+
}
|
|
279
|
+
async updateWebhook(id, input, audit) {
|
|
280
|
+
if (input.url !== undefined) {
|
|
281
|
+
this.validateWebhookUrl(input.url);
|
|
282
|
+
}
|
|
283
|
+
const webhook = await webhookService.updateWebhook(this.pool, id, input);
|
|
284
|
+
if (audit) {
|
|
285
|
+
await auditService.createAuditEntry(this.pool, audit, "webhook.updated", "webhook", id, webhook.tenant_id, null, input);
|
|
286
|
+
}
|
|
287
|
+
return webhook;
|
|
288
|
+
}
|
|
289
|
+
async deleteWebhook(id, audit) {
|
|
290
|
+
if (audit) {
|
|
291
|
+
const webhook = await webhookService.getWebhook(this.pool, id);
|
|
292
|
+
await webhookService.deleteWebhook(this.pool, id);
|
|
293
|
+
await auditService.createAuditEntry(this.pool, audit, "webhook.deleted", "webhook", id, webhook.tenant_id);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
await webhookService.deleteWebhook(this.pool, id);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
listWebhookDeliveries(webhookId) {
|
|
300
|
+
return webhookService.listWebhookDeliveries(this.pool, webhookId);
|
|
301
|
+
}
|
|
302
|
+
async testWebhook(id) {
|
|
303
|
+
const webhook = await webhookService.getWebhook(this.pool, id);
|
|
304
|
+
// SSRF protection
|
|
305
|
+
this.validateWebhookUrl(webhook.url);
|
|
306
|
+
const testPayload = JSON.stringify({
|
|
307
|
+
id: node_crypto_1.default.randomUUID(),
|
|
308
|
+
type: "webhook.test",
|
|
309
|
+
tenant_id: webhook.tenant_id ?? "00000000-0000-0000-0000-000000000000",
|
|
310
|
+
data: { message: "This is a test delivery from Stratum" },
|
|
311
|
+
created_at: new Date().toISOString(),
|
|
312
|
+
});
|
|
313
|
+
// Sign with the actual secret (decrypted)
|
|
314
|
+
const rawSecret = webhookService.decryptSecret(webhook.secret_hash);
|
|
315
|
+
const signature = "sha256=" +
|
|
316
|
+
node_crypto_1.default.createHmac("sha256", rawSecret).update(testPayload).digest("hex");
|
|
317
|
+
const timestamp = new Date().toISOString();
|
|
318
|
+
try {
|
|
319
|
+
const response = await globalThis.fetch(webhook.url, {
|
|
320
|
+
method: "POST",
|
|
321
|
+
headers: {
|
|
322
|
+
"Content-Type": "application/json",
|
|
323
|
+
"X-Stratum-Event": "webhook.test",
|
|
324
|
+
"X-Stratum-Signature": signature,
|
|
325
|
+
"X-Stratum-Delivery-ID": node_crypto_1.default.randomUUID(),
|
|
326
|
+
"X-Stratum-Timestamp": timestamp,
|
|
327
|
+
},
|
|
328
|
+
body: testPayload,
|
|
329
|
+
signal: AbortSignal.timeout(10_000),
|
|
330
|
+
});
|
|
331
|
+
return { success: response.ok, response_code: response.status };
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
return {
|
|
335
|
+
success: false,
|
|
336
|
+
response_code: null,
|
|
337
|
+
error: err instanceof Error ? err.message : String(err),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Webhook delivery operations
|
|
342
|
+
listFailedDeliveries(limit, tenantId) {
|
|
343
|
+
return eventService.listFailedDeliveries(this.pool, limit, tenantId);
|
|
344
|
+
}
|
|
345
|
+
retryDelivery(deliveryId) {
|
|
346
|
+
return eventService.retryDelivery(this.pool, deliveryId);
|
|
347
|
+
}
|
|
348
|
+
retryFailedDeliveries(tenantId) {
|
|
349
|
+
return eventService.retryFailedDeliveries(this.pool, tenantId);
|
|
350
|
+
}
|
|
351
|
+
getDeliveryStats(tenantId) {
|
|
352
|
+
return eventService.getDeliveryStats(this.pool, tenantId);
|
|
353
|
+
}
|
|
354
|
+
// Audit log operations
|
|
355
|
+
queryAuditLogs(query) {
|
|
356
|
+
return auditService.queryAuditLogs(this.pool, query);
|
|
357
|
+
}
|
|
358
|
+
getAuditEntry(id) {
|
|
359
|
+
return auditService.getAuditEntry(this.pool, id);
|
|
360
|
+
}
|
|
361
|
+
// Consent operations
|
|
362
|
+
async grantConsent(tenantId, input, audit) {
|
|
363
|
+
const record = await consentService.grantConsent(this.pool, tenantId, input);
|
|
364
|
+
if (audit) {
|
|
365
|
+
await auditService.createAuditEntry(this.pool, audit, "consent.granted", "consent", record.id, tenantId, null, { subject_id: input.subject_id, purpose: input.purpose });
|
|
366
|
+
}
|
|
367
|
+
return record;
|
|
368
|
+
}
|
|
369
|
+
async revokeConsent(tenantId, subjectId, purpose, audit) {
|
|
370
|
+
const result = await consentService.revokeConsent(this.pool, tenantId, subjectId, purpose);
|
|
371
|
+
if (audit) {
|
|
372
|
+
await auditService.createAuditEntry(this.pool, audit, "consent.revoked", "consent", purpose, tenantId);
|
|
373
|
+
}
|
|
374
|
+
return result;
|
|
375
|
+
}
|
|
376
|
+
listConsent(tenantId, subjectId) {
|
|
377
|
+
return consentService.listConsent(this.pool, tenantId, subjectId);
|
|
378
|
+
}
|
|
379
|
+
getActiveConsent(tenantId, subjectId, purpose) {
|
|
380
|
+
return consentService.getActiveConsent(this.pool, tenantId, subjectId, purpose);
|
|
381
|
+
}
|
|
382
|
+
// Data retention & GDPR operations
|
|
383
|
+
async purgeExpiredData(retentionDays) {
|
|
384
|
+
return retentionService.purgeExpiredData(this.pool, retentionDays);
|
|
385
|
+
}
|
|
386
|
+
async purgeTenant(tenantId, audit) {
|
|
387
|
+
await retentionService.purgeTenant(this.pool, tenantId);
|
|
388
|
+
// Write audit entry AFTER purge with null tenant_id so it survives the purge
|
|
389
|
+
if (audit) {
|
|
390
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.purged", "tenant", tenantId, null, null, null, { purged_tenant_id: tenantId });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async exportTenantData(tenantId) {
|
|
394
|
+
return retentionService.exportTenantData(this.pool, tenantId);
|
|
395
|
+
}
|
|
396
|
+
// Region operations
|
|
397
|
+
async createRegion(input, audit) {
|
|
398
|
+
const region = await regionService.createRegion(this.pool, input);
|
|
399
|
+
if (audit) {
|
|
400
|
+
await auditService.createAuditEntry(this.pool, audit, "region.created", "region", region.id, null, null, input);
|
|
401
|
+
}
|
|
402
|
+
return region;
|
|
403
|
+
}
|
|
404
|
+
getRegion(id) {
|
|
405
|
+
return regionService.getRegion(this.pool, id);
|
|
406
|
+
}
|
|
407
|
+
listRegions() {
|
|
408
|
+
return regionService.listRegions(this.pool);
|
|
409
|
+
}
|
|
410
|
+
async updateRegion(id, input, audit) {
|
|
411
|
+
const region = await regionService.updateRegion(this.pool, id, input);
|
|
412
|
+
if (audit) {
|
|
413
|
+
await auditService.createAuditEntry(this.pool, audit, "region.updated", "region", id, null, null, input);
|
|
414
|
+
}
|
|
415
|
+
return region;
|
|
416
|
+
}
|
|
417
|
+
async deleteRegion(id, audit) {
|
|
418
|
+
await regionService.deleteRegion(this.pool, id);
|
|
419
|
+
if (audit) {
|
|
420
|
+
await auditService.createAuditEntry(this.pool, audit, "region.deleted", "region", id, null);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async migrateRegion(tenantId, newRegionId, audit) {
|
|
424
|
+
await regionService.migrateRegion(this.pool, tenantId, newRegionId);
|
|
425
|
+
if (audit) {
|
|
426
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.region_migrated", "tenant", tenantId, tenantId, null, null, { new_region_id: newRegionId });
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// Role operations (RBAC)
|
|
430
|
+
async createRole(input, audit) {
|
|
431
|
+
const role = await roleService.createRole(this.pool, input);
|
|
432
|
+
if (audit) {
|
|
433
|
+
await auditService.createAuditEntry(this.pool, audit, "role.created", "role", role.id, input.tenant_id ?? null, null, { name: role.name, scopes: role.scopes });
|
|
434
|
+
}
|
|
435
|
+
return role;
|
|
436
|
+
}
|
|
437
|
+
getRole(id) {
|
|
438
|
+
return roleService.getRole(this.pool, id);
|
|
439
|
+
}
|
|
440
|
+
listRoles(tenantId) {
|
|
441
|
+
return roleService.listRoles(this.pool, tenantId);
|
|
442
|
+
}
|
|
443
|
+
async updateRole(id, input, audit) {
|
|
444
|
+
const role = await roleService.updateRole(this.pool, id, input);
|
|
445
|
+
if (audit && role) {
|
|
446
|
+
await auditService.createAuditEntry(this.pool, audit, "role.updated", "role", id, role.tenant_id, null, input);
|
|
447
|
+
}
|
|
448
|
+
return role;
|
|
449
|
+
}
|
|
450
|
+
async deleteRole(id, audit) {
|
|
451
|
+
const deleted = await roleService.deleteRole(this.pool, id);
|
|
452
|
+
if (audit && deleted) {
|
|
453
|
+
await auditService.createAuditEntry(this.pool, audit, "role.deleted", "role", id, null);
|
|
454
|
+
}
|
|
455
|
+
return deleted;
|
|
456
|
+
}
|
|
457
|
+
assignRoleToKey(keyId, roleId) {
|
|
458
|
+
return roleService.assignRoleToKey(this.pool, keyId, roleId);
|
|
459
|
+
}
|
|
460
|
+
removeRoleFromKey(keyId) {
|
|
461
|
+
return roleService.removeRoleFromKey(this.pool, keyId);
|
|
462
|
+
}
|
|
463
|
+
resolveKeyScopes(keyId) {
|
|
464
|
+
return roleService.resolveKeyScopes(this.pool, keyId);
|
|
465
|
+
}
|
|
466
|
+
// Batch operations
|
|
467
|
+
async batchCreateTenants(inputs, audit) {
|
|
468
|
+
const result = await tenantService.batchCreateTenants(this.pool, inputs);
|
|
469
|
+
for (const tenant of result.created) {
|
|
470
|
+
this.emitEvent(core_1.TenantEvent.TENANT_CREATED, tenant.id, { tenant });
|
|
471
|
+
}
|
|
472
|
+
if (audit && result.created.length > 0) {
|
|
473
|
+
await auditService.createAuditEntry(this.pool, audit, "tenant.batch_created", "tenant", result.created[0].id, null, null, { count: result.created.length, slugs: result.created.map((t) => t.slug) });
|
|
474
|
+
}
|
|
475
|
+
return result;
|
|
476
|
+
}
|
|
477
|
+
async batchSetConfig(tenantId, entries, audit) {
|
|
478
|
+
return (0, telemetry_js_1.traced)("config.batch_set", { tenant_id: tenantId, entry_count: entries.length }, async (span) => {
|
|
479
|
+
const batchResult = await configService.batchSetConfig(this.pool, tenantId, entries);
|
|
480
|
+
const succeededResults = batchResult.results.filter((r) => r.status === "ok" && r.entry);
|
|
481
|
+
for (const r of succeededResults) {
|
|
482
|
+
this.emitEvent(core_1.TenantEvent.CONFIG_UPDATED, tenantId, { key: r.key, entry: r.entry }, span);
|
|
483
|
+
}
|
|
484
|
+
if (audit && succeededResults.length > 0) {
|
|
485
|
+
await auditService.createAuditEntry(this.pool, audit, "config.batch_updated", "config", succeededResults[0].key, tenantId, null, {
|
|
486
|
+
count: succeededResults.length,
|
|
487
|
+
keys: succeededResults.map((r) => r.key),
|
|
488
|
+
failed: batchResult.failed,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
return batchResult;
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
// Encryption key rotation
|
|
495
|
+
async rotateEncryptionKey(oldKeyMaterial, newKeyMaterial, audit) {
|
|
496
|
+
const result = await keyRotationService.rotateEncryptionKey(this.pool, oldKeyMaterial, newKeyMaterial);
|
|
497
|
+
if (audit) {
|
|
498
|
+
await auditService.createAuditEntry(this.pool, audit, "encryption.key_rotated", "system", "encryption_key", null, null, { config_entries_rotated: result.config_entries_rotated, webhooks_rotated: result.webhooks_rotated });
|
|
499
|
+
}
|
|
500
|
+
return result;
|
|
501
|
+
}
|
|
502
|
+
/** Validates that a webhook URL does not target internal/private networks. */
|
|
503
|
+
validateWebhookUrl(url) {
|
|
504
|
+
let parsed;
|
|
505
|
+
try {
|
|
506
|
+
parsed = new URL(url);
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
throw new Error(`Invalid webhook URL: ${url}`);
|
|
510
|
+
}
|
|
511
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
512
|
+
throw new Error(`Webhook URL must use http or https: ${url}`);
|
|
513
|
+
}
|
|
514
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
515
|
+
const blocked = ["localhost", "localhost.localdomain", "metadata.google.internal"];
|
|
516
|
+
if (blocked.includes(hostname)) {
|
|
517
|
+
throw new Error(`Webhook URL targets a blocked host: ${hostname}`);
|
|
518
|
+
}
|
|
519
|
+
const privatePatterns = [
|
|
520
|
+
/^127\./, /^10\./, /^172\.(1[6-9]|2\d|3[01])\./, /^192\.168\./,
|
|
521
|
+
/^169\.254\./, /^0\./, /^::1$/, /^fc00:/, /^fe80:/,
|
|
522
|
+
];
|
|
523
|
+
for (const pattern of privatePatterns) {
|
|
524
|
+
if (pattern.test(hostname)) {
|
|
525
|
+
throw new Error(`Webhook URL targets a private/reserved IP range: ${hostname}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
exports.Stratum = Stratum;
|
|
531
|
+
//# sourceMappingURL=stratum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.js","sourceRoot":"","sources":["../src/stratum.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry instrumentation helpers for Stratum.
|
|
3
|
+
*
|
|
4
|
+
* All telemetry is optional — if @opentelemetry/api is not installed the
|
|
5
|
+
* `traced()` helper simply executes the callback without creating spans.
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT: This file must NOT import @opentelemetry/api at the type level
|
|
8
|
+
* so TypeScript can compile without the package installed. All OTel types
|
|
9
|
+
* are represented as `any` at compile time.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Returns the OpenTelemetry tracer for Stratum, or `null` when OTel is
|
|
13
|
+
* unavailable.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getTracer(): any;
|
|
16
|
+
/**
|
|
17
|
+
* Returns `true` when OpenTelemetry instrumentation is active.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isTracingEnabled(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Execute `fn` inside an OpenTelemetry span.
|
|
22
|
+
*
|
|
23
|
+
* When @opentelemetry/api is not installed the function is invoked directly
|
|
24
|
+
* without any overhead — the span parameter is a no-op stub.
|
|
25
|
+
*/
|
|
26
|
+
export declare function traced<T>(name: string, attributes: Record<string, string | number | boolean | undefined>, fn: (span: any) => Promise<T>): Promise<T>;
|
|
27
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8BH;;;GAGG;AACH,wBAAgB,SAAS,QAExB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,EAEjE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CA+BZ"}
|