@mastra/auth 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/index.js ADDED
@@ -0,0 +1,369 @@
1
+ import { trace, context, propagation, SpanStatusCode, SpanKind } from './chunk-JLXWUSDO.js';
2
+ import jwt from 'jsonwebtoken';
3
+ import jwksClient from 'jwks-rsa';
4
+
5
+ async function decodeToken(accessToken) {
6
+ const decoded = jwt.decode(accessToken, { complete: true });
7
+ return decoded;
8
+ }
9
+ function getTokenIssuer(decoded) {
10
+ if (!decoded) throw new Error("Invalid token");
11
+ if (!decoded.payload || typeof decoded.payload !== "object") throw new Error("Invalid token payload");
12
+ if (!decoded.payload.iss) throw new Error("Invalid token header");
13
+ return decoded.payload.iss;
14
+ }
15
+ async function verifyHmac(accessToken, secret) {
16
+ const decoded = jwt.decode(accessToken, { complete: true });
17
+ if (!decoded) throw new Error("Invalid token");
18
+ return jwt.verify(accessToken, secret);
19
+ }
20
+ async function verifyJwks(accessToken, jwksUri) {
21
+ const decoded = jwt.decode(accessToken, { complete: true });
22
+ if (!decoded) throw new Error("Invalid token");
23
+ const client = jwksClient({ jwksUri });
24
+ const key = await client.getSigningKey(decoded.header.kid);
25
+ const signingKey = key.getPublicKey();
26
+ return jwt.verify(accessToken, signingKey);
27
+ }
28
+
29
+ // ../core/dist/chunk-EWDGXKOQ.js
30
+ function hasActiveTelemetry(tracerName = "default-tracer") {
31
+ try {
32
+ return !!trace.getTracer(tracerName);
33
+ } catch {
34
+ return false;
35
+ }
36
+ }
37
+ function getBaggageValues(ctx) {
38
+ const currentBaggage = propagation.getBaggage(ctx);
39
+ const requestId = currentBaggage?.getEntry("http.request_id")?.value;
40
+ const componentName = currentBaggage?.getEntry("componentName")?.value;
41
+ const runId = currentBaggage?.getEntry("runId")?.value;
42
+ return {
43
+ requestId,
44
+ componentName,
45
+ runId
46
+ };
47
+ }
48
+ function withSpan(options) {
49
+ return function(_target, propertyKey, descriptor) {
50
+ if (!descriptor || typeof descriptor === "number") return;
51
+ const originalMethod = descriptor.value;
52
+ const methodName = String(propertyKey);
53
+ descriptor.value = function(...args) {
54
+ if (options?.skipIfNoTelemetry && !hasActiveTelemetry(options?.tracerName)) {
55
+ return originalMethod.apply(this, args);
56
+ }
57
+ const tracer = trace.getTracer(options?.tracerName ?? "default-tracer");
58
+ let spanName;
59
+ let spanKind;
60
+ if (typeof options === "string") {
61
+ spanName = options;
62
+ } else if (options) {
63
+ spanName = options.spanName || methodName;
64
+ spanKind = options.spanKind;
65
+ } else {
66
+ spanName = methodName;
67
+ }
68
+ const span = tracer.startSpan(spanName, { kind: spanKind });
69
+ let ctx = trace.setSpan(context.active(), span);
70
+ args.forEach((arg, index) => {
71
+ try {
72
+ span.setAttribute(`${spanName}.argument.${index}`, JSON.stringify(arg));
73
+ } catch {
74
+ span.setAttribute(`${spanName}.argument.${index}`, "[Not Serializable]");
75
+ }
76
+ });
77
+ const { requestId, componentName, runId } = getBaggageValues(ctx);
78
+ if (requestId) {
79
+ span.setAttribute("http.request_id", requestId);
80
+ }
81
+ if (componentName) {
82
+ span.setAttribute("componentName", componentName);
83
+ span.setAttribute("runId", runId);
84
+ } else if (this && this.name) {
85
+ span.setAttribute("componentName", this.name);
86
+ span.setAttribute("runId", this.runId);
87
+ ctx = propagation.setBaggage(
88
+ ctx,
89
+ propagation.createBaggage({
90
+ // @ts-ignore
91
+ componentName: { value: this.name },
92
+ // @ts-ignore
93
+ runId: { value: this.runId },
94
+ // @ts-ignore
95
+ "http.request_id": { value: requestId }
96
+ })
97
+ );
98
+ }
99
+ let result;
100
+ try {
101
+ result = context.with(ctx, () => originalMethod.apply(this, args));
102
+ if (result instanceof Promise) {
103
+ return result.then((resolvedValue) => {
104
+ try {
105
+ span.setAttribute(`${spanName}.result`, JSON.stringify(resolvedValue));
106
+ } catch {
107
+ span.setAttribute(`${spanName}.result`, "[Not Serializable]");
108
+ }
109
+ return resolvedValue;
110
+ }).finally(() => span.end());
111
+ }
112
+ try {
113
+ span.setAttribute(`${spanName}.result`, JSON.stringify(result));
114
+ } catch {
115
+ span.setAttribute(`${spanName}.result`, "[Not Serializable]");
116
+ }
117
+ return result;
118
+ } catch (error) {
119
+ span.setStatus({
120
+ code: SpanStatusCode.ERROR,
121
+ message: error instanceof Error ? error.message : "Unknown error"
122
+ });
123
+ if (error instanceof Error) {
124
+ span.recordException(error);
125
+ }
126
+ throw error;
127
+ } finally {
128
+ if (!(result instanceof Promise)) {
129
+ span.end();
130
+ }
131
+ }
132
+ };
133
+ return descriptor;
134
+ };
135
+ }
136
+ function InstrumentClass(options) {
137
+ return function(target) {
138
+ const methods = Object.getOwnPropertyNames(target.prototype);
139
+ methods.forEach((method) => {
140
+ if (options?.excludeMethods?.includes(method) || method === "constructor") return;
141
+ if (options?.methodFilter && !options.methodFilter(method)) return;
142
+ const descriptor = Object.getOwnPropertyDescriptor(target.prototype, method);
143
+ if (descriptor && typeof descriptor.value === "function") {
144
+ Object.defineProperty(
145
+ target.prototype,
146
+ method,
147
+ withSpan({
148
+ spanName: options?.prefix ? `${options.prefix}.${method}` : method,
149
+ skipIfNoTelemetry: true,
150
+ spanKind: options?.spanKind || SpanKind.INTERNAL,
151
+ tracerName: options?.tracerName
152
+ })(target, method, descriptor)
153
+ );
154
+ }
155
+ });
156
+ return target;
157
+ };
158
+ }
159
+
160
+ // ../core/dist/chunk-XXVGT7SJ.js
161
+ var RegisteredLogger = {
162
+ LLM: "LLM"};
163
+ var LogLevel = {
164
+ DEBUG: "debug",
165
+ INFO: "info",
166
+ WARN: "warn",
167
+ ERROR: "error"};
168
+ var MastraLogger = class {
169
+ name;
170
+ level;
171
+ transports;
172
+ constructor(options = {}) {
173
+ this.name = options.name || "Mastra";
174
+ this.level = options.level || LogLevel.ERROR;
175
+ this.transports = new Map(Object.entries(options.transports || {}));
176
+ }
177
+ getTransports() {
178
+ return this.transports;
179
+ }
180
+ async getLogs(transportId) {
181
+ if (!transportId || !this.transports.has(transportId)) {
182
+ return [];
183
+ }
184
+ return this.transports.get(transportId).getLogs() ?? [];
185
+ }
186
+ async getLogsByRunId({ transportId, runId }) {
187
+ if (!transportId || !this.transports.has(transportId) || !runId) {
188
+ return [];
189
+ }
190
+ return this.transports.get(transportId).getLogsByRunId({ runId }) ?? [];
191
+ }
192
+ };
193
+ var ConsoleLogger = class extends MastraLogger {
194
+ constructor(options = {}) {
195
+ super(options);
196
+ }
197
+ debug(message, ...args) {
198
+ if (this.level === LogLevel.DEBUG) {
199
+ console.debug(message, ...args);
200
+ }
201
+ }
202
+ info(message, ...args) {
203
+ if (this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) {
204
+ console.info(message, ...args);
205
+ }
206
+ }
207
+ warn(message, ...args) {
208
+ if (this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) {
209
+ console.warn(message, ...args);
210
+ }
211
+ }
212
+ error(message, ...args) {
213
+ if (this.level === LogLevel.ERROR || this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) {
214
+ console.error(message, ...args);
215
+ }
216
+ }
217
+ async getLogs(_transportId) {
218
+ return [];
219
+ }
220
+ async getLogsByRunId(_args) {
221
+ return [];
222
+ }
223
+ };
224
+
225
+ // ../core/dist/chunk-JOCKZ2US.js
226
+ var MastraBase = class {
227
+ component = RegisteredLogger.LLM;
228
+ logger;
229
+ name;
230
+ telemetry;
231
+ constructor({ component, name }) {
232
+ this.component = component || RegisteredLogger.LLM;
233
+ this.name = name;
234
+ this.logger = new ConsoleLogger({ name: `${this.component} - ${this.name}` });
235
+ }
236
+ /**
237
+ * Set the logger for the agent
238
+ * @param logger
239
+ */
240
+ __setLogger(logger) {
241
+ this.logger = logger;
242
+ if (this.component !== RegisteredLogger.LLM) {
243
+ this.logger.debug(`Logger updated [component=${this.component}] [name=${this.name}]`);
244
+ }
245
+ }
246
+ /**
247
+ * Set the telemetry for the
248
+ * @param telemetry
249
+ */
250
+ __setTelemetry(telemetry) {
251
+ this.telemetry = telemetry;
252
+ if (this.component !== RegisteredLogger.LLM) {
253
+ this.logger.debug(`Telemetry updated [component=${this.component}] [name=${this.telemetry.name}]`);
254
+ }
255
+ }
256
+ /**
257
+ * Get the telemetry on the vector
258
+ * @returns telemetry
259
+ */
260
+ __getTelemetry() {
261
+ return this.telemetry;
262
+ }
263
+ /*
264
+ get experimental_telemetry config
265
+ */
266
+ get experimental_telemetry() {
267
+ return this.telemetry ? {
268
+ // tracer: this.telemetry.tracer,
269
+ tracer: this.telemetry.getBaggageTracer(),
270
+ isEnabled: !!this.telemetry.tracer
271
+ } : void 0;
272
+ }
273
+ };
274
+
275
+ // ../core/dist/chunk-C6A6W6XS.js
276
+ var __create = Object.create;
277
+ var __defProp = Object.defineProperty;
278
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
279
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
280
+ var __typeError = (msg) => {
281
+ throw TypeError(msg);
282
+ };
283
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
284
+ enumerable: true,
285
+ configurable: true,
286
+ writable: true,
287
+ value
288
+ }) : obj[key] = value;
289
+ var __name = (target, value) => __defProp(target, "name", {
290
+ value,
291
+ configurable: true
292
+ });
293
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
294
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
295
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
296
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({
297
+ kind: __decoratorStrings[kind],
298
+ name,
299
+ metadata,
300
+ addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null))
301
+ });
302
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
303
+ var __runInitializers = (array, flags, self, value) => {
304
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self) ;
305
+ return value;
306
+ };
307
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
308
+ var it, done, ctx, k = flags & 7, p = false;
309
+ var j = 0;
310
+ var extraInitializers = array[j] || (array[j] = []);
311
+ var desc = k && ((target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(target , name));
312
+ __name(target, name);
313
+ for (var i = decorators.length - 1; i >= 0; i--) {
314
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
315
+ it = (0, decorators[i])(target, ctx), done._ = 1;
316
+ __expectFn(it) && (target = it);
317
+ }
318
+ return __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
319
+ };
320
+
321
+ // ../core/dist/server/index.js
322
+ var _MastraAuthProvider_decorators;
323
+ var _init;
324
+ var _a;
325
+ _MastraAuthProvider_decorators = [InstrumentClass({
326
+ prefix: "auth",
327
+ excludeMethods: ["__setTools", "__setLogger", "__setTelemetry", "#log"]
328
+ })];
329
+ var MastraAuthProvider = class extends (_a = MastraBase) {
330
+ constructor(options) {
331
+ super({
332
+ component: "AUTH",
333
+ name: options?.name
334
+ });
335
+ if (options?.authorizeUser) {
336
+ this.authorizeUser = options.authorizeUser.bind(this);
337
+ }
338
+ }
339
+ registerOptions(opts) {
340
+ if (opts?.authorizeUser) {
341
+ this.authorizeUser = opts.authorizeUser.bind(this);
342
+ }
343
+ }
344
+ };
345
+ MastraAuthProvider = /* @__PURE__ */ ((_) => {
346
+ _init = __decoratorStart(_a);
347
+ MastraAuthProvider = __decorateElement(_init, 0, "MastraAuthProvider", _MastraAuthProvider_decorators, MastraAuthProvider);
348
+ __runInitializers(_init, 1, MastraAuthProvider);
349
+ return MastraAuthProvider;
350
+ })();
351
+ var MastraJwtAuth = class extends MastraAuthProvider {
352
+ secret;
353
+ constructor(options) {
354
+ super({ name: options?.name ?? "jwt" });
355
+ this.secret = options?.secret ?? process.env.JWT_AUTH_SECRET ?? "";
356
+ if (!this.secret) {
357
+ throw new Error("JWT auth secret is required");
358
+ }
359
+ this.registerOptions(options);
360
+ }
361
+ async authenticateToken(token) {
362
+ return jwt.verify(token, this.secret);
363
+ }
364
+ async authorizeUser(user) {
365
+ return !!user;
366
+ }
367
+ };
368
+
369
+ export { MastraJwtAuth, decodeToken, getTokenIssuer, verifyHmac, verifyJwks };
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@mastra/auth",
3
+ "version": "0.1.0",
4
+ "description": "",
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ },
17
+ "require": {
18
+ "types": "./dist/index.d.cts",
19
+ "default": "./dist/index.cjs"
20
+ }
21
+ }
22
+ },
23
+ "keywords": [],
24
+ "author": "",
25
+ "license": "Elastic-2.0",
26
+ "dependencies": {
27
+ "jsonwebtoken": "^9.0.2",
28
+ "jwks-rsa": "^3.2.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/jsonwebtoken": "^9.0.9",
32
+ "@types/node": "^20.17.27",
33
+ "typescript": "^5.8.2",
34
+ "vitest": "^2.1.9",
35
+ "eslint": "^9.23.0",
36
+ "tsup": "^8.4.0",
37
+ "@internal/lint": "0.0.7",
38
+ "@mastra/core": "0.10.2-alpha.5"
39
+ },
40
+ "scripts": {
41
+ "build": "tsup src/index.ts --format esm,cjs --clean --experimental-dts --treeshake=smallest --splitting --publicDir",
42
+ "build:watch": "pnpm build --watch",
43
+ "test": "vitest run",
44
+ "lint": "eslint ."
45
+ }
46
+ }