@stratum-hq/nestjs 0.2.2 → 0.2.3
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__/stratum.test.d.ts +2 -0
- package/dist/__tests__/stratum.test.d.ts.map +1 -0
- package/dist/__tests__/stratum.test.js +301 -0
- package/dist/__tests__/stratum.test.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/stratum.decorator.d.ts +15 -0
- package/dist/stratum.decorator.d.ts.map +1 -0
- package/dist/stratum.decorator.js +19 -0
- package/dist/stratum.decorator.js.map +1 -0
- package/dist/stratum.guard.d.ts +10 -0
- package/dist/stratum.guard.d.ts.map +1 -0
- package/dist/stratum.guard.js +102 -0
- package/dist/stratum.guard.js.map +1 -0
- package/dist/stratum.module.d.ts +37 -0
- package/dist/stratum.module.d.ts.map +1 -0
- package/dist/stratum.module.js +68 -0
- package/dist/stratum.module.js.map +1 -0
- package/package.json +14 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stratum.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { resolveFromHeader, resolveFromJwt, setTenantContext } from "@stratum-hq/sdk";
|
|
3
|
+
// ── Mock StratumClient ───────────────────────────────────────────────────────
|
|
4
|
+
function makeMockClient(resolvedContext = null, shouldThrow) {
|
|
5
|
+
return {
|
|
6
|
+
resolveTenant: vi.fn(async (_tenantId) => {
|
|
7
|
+
if (shouldThrow)
|
|
8
|
+
throw shouldThrow;
|
|
9
|
+
if (!resolvedContext)
|
|
10
|
+
throw new Error("No context configured");
|
|
11
|
+
return resolvedContext;
|
|
12
|
+
}),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// ── makeContext helper ───────────────────────────────────────────────────────
|
|
16
|
+
function makeExecutionContext(req) {
|
|
17
|
+
return {
|
|
18
|
+
switchToHttp: () => ({
|
|
19
|
+
getRequest: () => req,
|
|
20
|
+
getResponse: () => ({}),
|
|
21
|
+
getNext: () => ({}),
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// ── Stubs for NestJS exceptions ──────────────────────────────────────────────
|
|
26
|
+
import { TenantNotFoundError } from "@stratum-hq/core";
|
|
27
|
+
class UnauthorizedException extends Error {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "UnauthorizedException";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
class ForbiddenException extends Error {
|
|
34
|
+
constructor(message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = "ForbiddenException";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ── Guard logic (mirrors stratum.guard.ts) ───────────────────────────────────
|
|
40
|
+
async function canActivate(client, context, options = {}) {
|
|
41
|
+
const req = context.switchToHttp().getRequest();
|
|
42
|
+
// 1. Resolve tenant ID: header → JWT (verified) → custom resolvers
|
|
43
|
+
let tenantId = null;
|
|
44
|
+
tenantId = resolveFromHeader(req);
|
|
45
|
+
if (!tenantId) {
|
|
46
|
+
tenantId = resolveFromJwt(req, options.jwtClaimPath, {
|
|
47
|
+
secret: options.jwtSecret,
|
|
48
|
+
verify: options.jwtVerify,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!tenantId && options.resolvers) {
|
|
52
|
+
for (const resolver of options.resolvers) {
|
|
53
|
+
const result = await resolver.resolve(req);
|
|
54
|
+
if (result) {
|
|
55
|
+
tenantId = result;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!tenantId) {
|
|
61
|
+
throw new UnauthorizedException("Tenant ID could not be resolved from request");
|
|
62
|
+
}
|
|
63
|
+
// 2. Resolve caller tenant context
|
|
64
|
+
let callerContext;
|
|
65
|
+
try {
|
|
66
|
+
callerContext = await client.resolveTenant(tenantId);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (err instanceof TenantNotFoundError) {
|
|
70
|
+
throw new UnauthorizedException(`Tenant not found: ${tenantId}`);
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
req["tenant"] = callerContext;
|
|
75
|
+
req["impersonating"] = false;
|
|
76
|
+
// 3. Impersonation
|
|
77
|
+
if (options.impersonation?.enabled) {
|
|
78
|
+
const impersonateHeader = options.impersonation.headerName ?? "X-Impersonate-Tenant";
|
|
79
|
+
const headers = req.headers;
|
|
80
|
+
const rawVal = headers?.[impersonateHeader.toLowerCase()];
|
|
81
|
+
const impersonateTenantId = Array.isArray(rawVal) ? rawVal[0] : rawVal;
|
|
82
|
+
if (impersonateTenantId && impersonateTenantId !== tenantId) {
|
|
83
|
+
const authorized = await options.impersonation.authorize(req, tenantId, impersonateTenantId);
|
|
84
|
+
if (!authorized) {
|
|
85
|
+
throw new ForbiddenException("Not authorized to impersonate this tenant");
|
|
86
|
+
}
|
|
87
|
+
let impersonatedContext;
|
|
88
|
+
try {
|
|
89
|
+
impersonatedContext = await client.resolveTenant(impersonateTenantId);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err instanceof TenantNotFoundError) {
|
|
93
|
+
throw new UnauthorizedException(`Impersonated tenant not found: ${impersonateTenantId}`);
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
req["tenant"] = impersonatedContext;
|
|
98
|
+
req["impersonating"] = true;
|
|
99
|
+
req["originalTenantId"] = tenantId;
|
|
100
|
+
options.impersonation.onImpersonate?.(req, tenantId, impersonateTenantId);
|
|
101
|
+
setTenantContext(impersonatedContext);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// 4. Bind AsyncLocalStorage context
|
|
106
|
+
setTenantContext(callerContext);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
// ── @Tenant() decorator extraction logic ─────────────────────────────────────
|
|
110
|
+
function extractTenant(req) {
|
|
111
|
+
return req["tenant"];
|
|
112
|
+
}
|
|
113
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
114
|
+
const MOCK_CONTEXT = {
|
|
115
|
+
id: "tenant-123",
|
|
116
|
+
slug: "acme",
|
|
117
|
+
name: "Acme Corp",
|
|
118
|
+
};
|
|
119
|
+
const MOCK_CONTEXT_B = {
|
|
120
|
+
id: "tenant-456",
|
|
121
|
+
slug: "other",
|
|
122
|
+
name: "Other Corp",
|
|
123
|
+
};
|
|
124
|
+
describe("StratumGuard", () => {
|
|
125
|
+
let client;
|
|
126
|
+
beforeEach(() => {
|
|
127
|
+
client = makeMockClient(MOCK_CONTEXT);
|
|
128
|
+
});
|
|
129
|
+
describe("canActivate — x-tenant-id header", () => {
|
|
130
|
+
it("returns true and sets req.tenant when x-tenant-id header is present", async () => {
|
|
131
|
+
const req = {
|
|
132
|
+
headers: { "x-tenant-id": "tenant-123" },
|
|
133
|
+
};
|
|
134
|
+
const ctx = makeExecutionContext(req);
|
|
135
|
+
const result = await canActivate(client, ctx);
|
|
136
|
+
expect(result).toBe(true);
|
|
137
|
+
expect(req["tenant"]).toEqual(MOCK_CONTEXT);
|
|
138
|
+
expect(client.resolveTenant).toHaveBeenCalledWith("tenant-123");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("canActivate — JWT (unverified tokens rejected)", () => {
|
|
142
|
+
function makeJwt(payload) {
|
|
143
|
+
const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url");
|
|
144
|
+
const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
145
|
+
return `${header}.${body}.fakesig`;
|
|
146
|
+
}
|
|
147
|
+
it("does NOT trust JWT claims when no jwtSecret or jwtVerify is configured", async () => {
|
|
148
|
+
// Without a secret, the guard must not extract tenant from JWT
|
|
149
|
+
const token = makeJwt({ tenant_id: "forged-tenant" });
|
|
150
|
+
const req = {
|
|
151
|
+
headers: { authorization: `Bearer ${token}` },
|
|
152
|
+
};
|
|
153
|
+
const ctx = makeExecutionContext(req);
|
|
154
|
+
// No options — should reject because JWT is unverified
|
|
155
|
+
await expect(canActivate(client, ctx, {})).rejects.toThrow(UnauthorizedException);
|
|
156
|
+
await expect(canActivate(client, ctx, {})).rejects.toThrow("Tenant ID could not be resolved from request");
|
|
157
|
+
expect(client.resolveTenant).not.toHaveBeenCalled();
|
|
158
|
+
});
|
|
159
|
+
it("resolves tenant from JWT when jwtVerify is provided", async () => {
|
|
160
|
+
const token = makeJwt({ tenant_id: "tenant-from-jwt" });
|
|
161
|
+
const req = {
|
|
162
|
+
headers: { authorization: `Bearer ${token}` },
|
|
163
|
+
};
|
|
164
|
+
const ctx = makeExecutionContext(req);
|
|
165
|
+
// Supply a verify function that trusts this token
|
|
166
|
+
const jwtVerify = (_t) => ({ tenant_id: "tenant-from-jwt" });
|
|
167
|
+
const result = await canActivate(client, ctx, { jwtVerify });
|
|
168
|
+
expect(result).toBe(true);
|
|
169
|
+
expect(client.resolveTenant).toHaveBeenCalledWith("tenant-from-jwt");
|
|
170
|
+
});
|
|
171
|
+
it("prefers x-tenant-id header over JWT claim", async () => {
|
|
172
|
+
const token = makeJwt({ tenant_id: "jwt-tenant" });
|
|
173
|
+
const req = {
|
|
174
|
+
headers: {
|
|
175
|
+
"x-tenant-id": "header-tenant",
|
|
176
|
+
authorization: `Bearer ${token}`,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
const ctx = makeExecutionContext(req);
|
|
180
|
+
await canActivate(client, ctx, { jwtVerify: () => ({ tenant_id: "jwt-tenant" }) });
|
|
181
|
+
expect(client.resolveTenant).toHaveBeenCalledWith("header-tenant");
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe("canActivate — missing tenant", () => {
|
|
185
|
+
it("throws UnauthorizedException when no tenant identifier in request", async () => {
|
|
186
|
+
const req = { headers: {} };
|
|
187
|
+
const ctx = makeExecutionContext(req);
|
|
188
|
+
await expect(canActivate(client, ctx)).rejects.toThrow(UnauthorizedException);
|
|
189
|
+
await expect(canActivate(client, ctx)).rejects.toThrow("Tenant ID could not be resolved from request");
|
|
190
|
+
});
|
|
191
|
+
it("throws UnauthorizedException when tenant not found in control plane", async () => {
|
|
192
|
+
const notFoundClient = makeMockClient(null, new TenantNotFoundError("tenant-missing"));
|
|
193
|
+
const req = {
|
|
194
|
+
headers: { "x-tenant-id": "tenant-missing" },
|
|
195
|
+
};
|
|
196
|
+
const ctx = makeExecutionContext(req);
|
|
197
|
+
await expect(canActivate(notFoundClient, ctx)).rejects.toThrow(UnauthorizedException);
|
|
198
|
+
await expect(canActivate(notFoundClient, ctx)).rejects.toThrow("Tenant not found: tenant-missing");
|
|
199
|
+
});
|
|
200
|
+
it("re-throws unexpected errors", async () => {
|
|
201
|
+
const boom = new Error("Network failure");
|
|
202
|
+
const errorClient = makeMockClient(null, boom);
|
|
203
|
+
const req = {
|
|
204
|
+
headers: { "x-tenant-id": "tenant-123" },
|
|
205
|
+
};
|
|
206
|
+
const ctx = makeExecutionContext(req);
|
|
207
|
+
await expect(canActivate(errorClient, ctx)).rejects.toThrow("Network failure");
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe("canActivate — custom resolvers", () => {
|
|
211
|
+
it("uses custom resolver when header and JWT resolve nothing", async () => {
|
|
212
|
+
const req = { headers: {} };
|
|
213
|
+
const ctx = makeExecutionContext(req);
|
|
214
|
+
const customResolver = { resolve: vi.fn(async () => "tenant-from-resolver") };
|
|
215
|
+
const result = await canActivate(client, ctx, { resolvers: [customResolver] });
|
|
216
|
+
expect(result).toBe(true);
|
|
217
|
+
expect(customResolver.resolve).toHaveBeenCalledWith(req);
|
|
218
|
+
expect(client.resolveTenant).toHaveBeenCalledWith("tenant-from-resolver");
|
|
219
|
+
});
|
|
220
|
+
it("stops at first resolver that returns a value", async () => {
|
|
221
|
+
const req = { headers: {} };
|
|
222
|
+
const ctx = makeExecutionContext(req);
|
|
223
|
+
const r1 = { resolve: vi.fn(async () => "first-resolver-tenant") };
|
|
224
|
+
const r2 = { resolve: vi.fn(async () => "second-resolver-tenant") };
|
|
225
|
+
await canActivate(client, ctx, { resolvers: [r1, r2] });
|
|
226
|
+
expect(r1.resolve).toHaveBeenCalled();
|
|
227
|
+
expect(r2.resolve).not.toHaveBeenCalled();
|
|
228
|
+
expect(client.resolveTenant).toHaveBeenCalledWith("first-resolver-tenant");
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe("canActivate — impersonation", () => {
|
|
232
|
+
it("impersonates target tenant when authorized", async () => {
|
|
233
|
+
// client returns MOCK_CONTEXT for "tenant-123", MOCK_CONTEXT_B for "tenant-456"
|
|
234
|
+
const impClient = {
|
|
235
|
+
resolveTenant: vi.fn(async (id) => {
|
|
236
|
+
if (id === "tenant-123")
|
|
237
|
+
return MOCK_CONTEXT;
|
|
238
|
+
if (id === "tenant-456")
|
|
239
|
+
return MOCK_CONTEXT_B;
|
|
240
|
+
throw new TenantNotFoundError(id);
|
|
241
|
+
}),
|
|
242
|
+
};
|
|
243
|
+
const req = {
|
|
244
|
+
headers: {
|
|
245
|
+
"x-tenant-id": "tenant-123",
|
|
246
|
+
"x-impersonate-tenant": "tenant-456",
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
const ctx = makeExecutionContext(req);
|
|
250
|
+
const onImpersonate = vi.fn();
|
|
251
|
+
const result = await canActivate(impClient, ctx, {
|
|
252
|
+
impersonation: {
|
|
253
|
+
enabled: true,
|
|
254
|
+
authorize: async () => true,
|
|
255
|
+
onImpersonate,
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
expect(result).toBe(true);
|
|
259
|
+
expect(req["tenant"]).toEqual(MOCK_CONTEXT_B);
|
|
260
|
+
expect(req["impersonating"]).toBe(true);
|
|
261
|
+
expect(req["originalTenantId"]).toBe("tenant-123");
|
|
262
|
+
expect(onImpersonate).toHaveBeenCalledWith(req, "tenant-123", "tenant-456");
|
|
263
|
+
});
|
|
264
|
+
it("throws ForbiddenException when impersonation is denied", async () => {
|
|
265
|
+
const req = {
|
|
266
|
+
headers: {
|
|
267
|
+
"x-tenant-id": "tenant-123",
|
|
268
|
+
"x-impersonate-tenant": "tenant-456",
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
const ctx = makeExecutionContext(req);
|
|
272
|
+
await expect(canActivate(client, ctx, {
|
|
273
|
+
impersonation: {
|
|
274
|
+
enabled: true,
|
|
275
|
+
authorize: async () => false,
|
|
276
|
+
},
|
|
277
|
+
})).rejects.toThrow(ForbiddenException);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
describe("@Tenant() decorator", () => {
|
|
282
|
+
it("extracts req.tenant from execution context", () => {
|
|
283
|
+
const req = { tenant: MOCK_CONTEXT };
|
|
284
|
+
const tenant = extractTenant(req);
|
|
285
|
+
expect(tenant).toEqual(MOCK_CONTEXT);
|
|
286
|
+
});
|
|
287
|
+
it("returns undefined when tenant not yet set (guard not applied)", () => {
|
|
288
|
+
const req = {};
|
|
289
|
+
const tenant = extractTenant(req);
|
|
290
|
+
expect(tenant).toBeUndefined();
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
describe("STRATUM_CLIENT / STRATUM_OPTIONS constants", () => {
|
|
294
|
+
it("exports distinct Symbol injection tokens", async () => {
|
|
295
|
+
const { STRATUM_CLIENT, STRATUM_OPTIONS } = await import("../constants.js");
|
|
296
|
+
expect(typeof STRATUM_CLIENT).toBe("symbol");
|
|
297
|
+
expect(typeof STRATUM_OPTIONS).toBe("symbol");
|
|
298
|
+
expect(STRATUM_CLIENT).not.toBe(STRATUM_OPTIONS);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
//# sourceMappingURL=stratum.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.test.js","sourceRoot":"","sources":["../../src/__tests__/stratum.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,eAA2B,CAAC;AACvD,eAAO,MAAM,eAAe,eAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { STRATUM_CLIENT, STRATUM_OPTIONS } from "./constants.js";
|
|
2
|
+
export { StratumGuard } from "./stratum.guard.js";
|
|
3
|
+
export { Tenant } from "./stratum.decorator.js";
|
|
4
|
+
export { StratumModule } from "./stratum.module.js";
|
|
5
|
+
export type { StratumModuleOptions, StratumModuleAsyncOptions } from "./stratum.module.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter decorator that extracts the resolved tenant context from the request.
|
|
3
|
+
* Requires StratumGuard to have run before the route handler.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* @Get('me')
|
|
8
|
+
* @UseGuards(StratumGuard)
|
|
9
|
+
* getProfile(@Tenant() tenant: TenantContextLegacy) {
|
|
10
|
+
* return tenant;
|
|
11
|
+
* }
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const Tenant: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
15
|
+
//# sourceMappingURL=stratum.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.decorator.d.ts","sourceRoot":"","sources":["../src/stratum.decorator.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,mDAKlB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createParamDecorator } from "@nestjs/common";
|
|
2
|
+
/**
|
|
3
|
+
* Parameter decorator that extracts the resolved tenant context from the request.
|
|
4
|
+
* Requires StratumGuard to have run before the route handler.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* @Get('me')
|
|
9
|
+
* @UseGuards(StratumGuard)
|
|
10
|
+
* getProfile(@Tenant() tenant: TenantContextLegacy) {
|
|
11
|
+
* return tenant;
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const Tenant = createParamDecorator((_data, ctx) => {
|
|
16
|
+
const req = ctx.switchToHttp().getRequest();
|
|
17
|
+
return req["tenant"];
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=stratum.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.decorator.js","sourceRoot":"","sources":["../src/stratum.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,oBAAoB,CACxC,CAAC,KAAc,EAAE,GAAqB,EAAE,EAAE;IACxC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAA2B,CAAC;IACrE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvB,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CanActivate, ExecutionContext } from "@nestjs/common";
|
|
2
|
+
import type { StratumClient } from "@stratum-hq/sdk";
|
|
3
|
+
import type { StratumModuleOptions } from "./stratum.module.js";
|
|
4
|
+
export declare class StratumGuard implements CanActivate {
|
|
5
|
+
private readonly client;
|
|
6
|
+
private readonly options;
|
|
7
|
+
constructor(client: StratumClient, options: StratumModuleOptions);
|
|
8
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=stratum.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.guard.d.ts","sourceRoot":"","sources":["../src/stratum.guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,qBACa,YAAa,YAAW,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADR,MAAM,EAAE,aAAa,EACpB,OAAO,EAAE,oBAAoB;IAGnE,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAuF/D"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { Inject, Injectable, UnauthorizedException, ForbiddenException } from "@nestjs/common";
|
|
14
|
+
import { resolveFromHeader, resolveFromJwt, setTenantContext } from "@stratum-hq/sdk";
|
|
15
|
+
import { TenantNotFoundError } from "@stratum-hq/core";
|
|
16
|
+
import { STRATUM_CLIENT, STRATUM_OPTIONS } from "./constants.js";
|
|
17
|
+
let StratumGuard = class StratumGuard {
|
|
18
|
+
client;
|
|
19
|
+
options;
|
|
20
|
+
constructor(client, options) {
|
|
21
|
+
this.client = client;
|
|
22
|
+
this.options = options;
|
|
23
|
+
}
|
|
24
|
+
async canActivate(context) {
|
|
25
|
+
const req = context.switchToHttp().getRequest();
|
|
26
|
+
// 1. Resolve tenant ID: header → JWT (verified) → custom resolvers
|
|
27
|
+
let tenantId = null;
|
|
28
|
+
tenantId = resolveFromHeader(req);
|
|
29
|
+
if (!tenantId) {
|
|
30
|
+
tenantId = resolveFromJwt(req, this.options.jwtClaimPath, {
|
|
31
|
+
secret: this.options.jwtSecret,
|
|
32
|
+
verify: this.options.jwtVerify,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (!tenantId && this.options.resolvers) {
|
|
36
|
+
for (const resolver of this.options.resolvers) {
|
|
37
|
+
const result = await resolver.resolve(req);
|
|
38
|
+
if (result) {
|
|
39
|
+
tenantId = result;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!tenantId) {
|
|
45
|
+
throw new UnauthorizedException("Tenant ID could not be resolved from request");
|
|
46
|
+
}
|
|
47
|
+
// 2. Resolve caller tenant context
|
|
48
|
+
let callerContext;
|
|
49
|
+
try {
|
|
50
|
+
callerContext = await this.client.resolveTenant(tenantId);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof TenantNotFoundError) {
|
|
54
|
+
throw new UnauthorizedException(`Tenant not found: ${tenantId}`);
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
req["tenant"] = callerContext;
|
|
59
|
+
req["impersonating"] = false;
|
|
60
|
+
// 3. Impersonation support — mirrors express.ts lines 52-81
|
|
61
|
+
if (this.options.impersonation?.enabled) {
|
|
62
|
+
const impersonateHeader = this.options.impersonation.headerName ?? "X-Impersonate-Tenant";
|
|
63
|
+
const headers = req.headers;
|
|
64
|
+
const rawVal = headers?.[impersonateHeader.toLowerCase()];
|
|
65
|
+
const impersonateTenantId = Array.isArray(rawVal) ? rawVal[0] : rawVal;
|
|
66
|
+
if (impersonateTenantId && impersonateTenantId !== tenantId) {
|
|
67
|
+
const authorized = await this.options.impersonation.authorize(req, tenantId, impersonateTenantId);
|
|
68
|
+
if (!authorized) {
|
|
69
|
+
throw new ForbiddenException("Not authorized to impersonate this tenant");
|
|
70
|
+
}
|
|
71
|
+
let impersonatedContext;
|
|
72
|
+
try {
|
|
73
|
+
impersonatedContext = await this.client.resolveTenant(impersonateTenantId);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err instanceof TenantNotFoundError) {
|
|
77
|
+
throw new UnauthorizedException(`Impersonated tenant not found: ${impersonateTenantId}`);
|
|
78
|
+
}
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
req["tenant"] = impersonatedContext;
|
|
82
|
+
req["impersonating"] = true;
|
|
83
|
+
req["originalTenantId"] = tenantId;
|
|
84
|
+
this.options.impersonation.onImpersonate?.(req, tenantId, impersonateTenantId);
|
|
85
|
+
// 4. Bind AsyncLocalStorage context for getTenantContext()
|
|
86
|
+
setTenantContext(impersonatedContext);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// 4. Bind AsyncLocalStorage context for getTenantContext()
|
|
91
|
+
setTenantContext(callerContext);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
StratumGuard = __decorate([
|
|
96
|
+
Injectable(),
|
|
97
|
+
__param(0, Inject(STRATUM_CLIENT)),
|
|
98
|
+
__param(1, Inject(STRATUM_OPTIONS)),
|
|
99
|
+
__metadata("design:paramtypes", [Function, Object])
|
|
100
|
+
], StratumGuard);
|
|
101
|
+
export { StratumGuard };
|
|
102
|
+
//# sourceMappingURL=stratum.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.guard.js","sourceRoot":"","sources":["../src/stratum.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { DynamicModule } from "@nestjs/common";
|
|
2
|
+
import type { FactoryProvider, ModuleMetadata } from "@nestjs/common";
|
|
3
|
+
export interface StratumModuleOptions {
|
|
4
|
+
controlPlaneUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
/** JWT claim path for tenant resolution (e.g. "tenant_id" or "stratum.tenant_id"). Requires jwtSecret or jwtVerify. */
|
|
7
|
+
jwtClaimPath?: string;
|
|
8
|
+
/** HMAC secret used to verify JWT signatures before extracting tenant claims. */
|
|
9
|
+
jwtSecret?: string;
|
|
10
|
+
/** Custom JWT verify function — takes priority over jwtSecret. */
|
|
11
|
+
jwtVerify?: (token: string) => Record<string, unknown> | null;
|
|
12
|
+
/** Custom tenant resolvers evaluated after header and JWT resolution. */
|
|
13
|
+
resolvers?: import("@stratum-hq/sdk").TenantResolver[];
|
|
14
|
+
/** Enable tenant impersonation via X-Impersonate-Tenant header. */
|
|
15
|
+
impersonation?: {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
headerName?: string;
|
|
18
|
+
authorize: (req: unknown, callerTenantId: string, targetTenantId: string) => boolean | Promise<boolean>;
|
|
19
|
+
onImpersonate?: (req: unknown, callerTenantId: string, targetTenantId: string) => void;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface StratumModuleAsyncOptions extends Pick<ModuleMetadata, "imports"> {
|
|
23
|
+
useFactory: (...args: unknown[]) => StratumModuleOptions | Promise<StratumModuleOptions>;
|
|
24
|
+
inject?: FactoryProvider["inject"];
|
|
25
|
+
}
|
|
26
|
+
export declare class StratumModule {
|
|
27
|
+
/**
|
|
28
|
+
* Register StratumModule synchronously with static options.
|
|
29
|
+
*/
|
|
30
|
+
static forRoot(options: StratumModuleOptions): DynamicModule;
|
|
31
|
+
/**
|
|
32
|
+
* Register StratumModule asynchronously using a factory function.
|
|
33
|
+
* Useful when options come from ConfigService or other async providers.
|
|
34
|
+
*/
|
|
35
|
+
static forRootAsync(asyncOptions: StratumModuleAsyncOptions): DynamicModule;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=stratum.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.module.d.ts","sourceRoot":"","sources":["../src/stratum.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKtE,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,uHAAuH;IACvH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9D,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,iBAAiB,EAAE,cAAc,EAAE,CAAC;IACvD,mEAAmE;IACnE,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACxG,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;KACxF,CAAC;CACH;AAED,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IAChF,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzF,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;CACpC;AAED,qBAEa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAqB5D;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,yBAAyB,GAAG,aAAa;CA0B5E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var StratumModule_1;
|
|
8
|
+
import { Module, Global } from "@nestjs/common";
|
|
9
|
+
import { StratumClient } from "@stratum-hq/sdk";
|
|
10
|
+
import { STRATUM_CLIENT, STRATUM_OPTIONS } from "./constants.js";
|
|
11
|
+
import { StratumGuard } from "./stratum.guard.js";
|
|
12
|
+
let StratumModule = StratumModule_1 = class StratumModule {
|
|
13
|
+
/**
|
|
14
|
+
* Register StratumModule synchronously with static options.
|
|
15
|
+
*/
|
|
16
|
+
static forRoot(options) {
|
|
17
|
+
const clientProvider = {
|
|
18
|
+
provide: STRATUM_CLIENT,
|
|
19
|
+
useValue: new StratumClient({
|
|
20
|
+
controlPlaneUrl: options.controlPlaneUrl,
|
|
21
|
+
apiKey: options.apiKey,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
const optionsProvider = {
|
|
25
|
+
provide: STRATUM_OPTIONS,
|
|
26
|
+
useValue: options,
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
module: StratumModule_1,
|
|
30
|
+
providers: [clientProvider, optionsProvider, StratumGuard],
|
|
31
|
+
exports: [STRATUM_CLIENT, StratumGuard],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Register StratumModule asynchronously using a factory function.
|
|
36
|
+
* Useful when options come from ConfigService or other async providers.
|
|
37
|
+
*/
|
|
38
|
+
static forRootAsync(asyncOptions) {
|
|
39
|
+
const optionsProvider = {
|
|
40
|
+
provide: STRATUM_OPTIONS,
|
|
41
|
+
useFactory: asyncOptions.useFactory,
|
|
42
|
+
inject: asyncOptions.inject ?? [],
|
|
43
|
+
};
|
|
44
|
+
const clientProvider = {
|
|
45
|
+
provide: STRATUM_CLIENT,
|
|
46
|
+
useFactory: async (...args) => {
|
|
47
|
+
const options = await asyncOptions.useFactory(...args);
|
|
48
|
+
return new StratumClient({
|
|
49
|
+
controlPlaneUrl: options.controlPlaneUrl,
|
|
50
|
+
apiKey: options.apiKey,
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
inject: asyncOptions.inject ?? [],
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
module: StratumModule_1,
|
|
57
|
+
imports: asyncOptions.imports ?? [],
|
|
58
|
+
providers: [optionsProvider, clientProvider, StratumGuard],
|
|
59
|
+
exports: [STRATUM_CLIENT, StratumGuard],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
StratumModule = StratumModule_1 = __decorate([
|
|
64
|
+
Global(),
|
|
65
|
+
Module({})
|
|
66
|
+
], StratumModule);
|
|
67
|
+
export { StratumModule };
|
|
68
|
+
//# sourceMappingURL=stratum.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.module.js","sourceRoot":"","sources":["../src/stratum.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA6B3C,IAAM,aAAa,qBAAnB,MAAM,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAA6B;QAC1C,MAAM,cAAc,GAAG;YACrB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,IAAI,aAAa,CAAC;gBAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;SACH,CAAC;QAEF,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,OAAO;SAClB,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,eAAa;YACrB,SAAS,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,YAAY,CAAC;YAC1D,OAAO,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;SACxC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,YAAuC;QACzD,MAAM,eAAe,GAAoB;YACvC,OAAO,EAAE,eAAe;YACxB,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;SAClC,CAAC;QAEF,MAAM,cAAc,GAAoB;YACtC,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;gBACvC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;gBACvD,OAAO,IAAI,aAAa,CAAC;oBACvB,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;SAClC,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,eAAa;YACrB,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,EAAE;YACnC,SAAS,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,YAAY,CAAC;YAC1D,OAAO,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;SACxC,CAAC;IACJ,CAAC;CACF,CAAA;AAvDY,aAAa;IAFzB,MAAM,EAAE;IACR,MAAM,CAAC,EAAE,CAAC;GACE,aAAa,CAuDzB"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stratum-hq/nestjs",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Stratum NestJS integration — StratumGuard, @Tenant() decorator, and StratumModule",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"multi-tenancy",
|
|
7
|
+
"multi-tenant",
|
|
8
|
+
"saas",
|
|
9
|
+
"tenant",
|
|
10
|
+
"nestjs",
|
|
11
|
+
"nest",
|
|
12
|
+
"guard",
|
|
13
|
+
"decorator",
|
|
14
|
+
"middleware",
|
|
15
|
+
"typescript",
|
|
16
|
+
"stratum"
|
|
17
|
+
],
|
|
5
18
|
"type": "module",
|
|
6
19
|
"main": "./dist/index.js",
|
|
7
20
|
"types": "./dist/index.d.ts",
|