@lyxa.ai/core 1.4.145 → 1.4.147
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.
|
@@ -28,18 +28,41 @@ exports.t = server_1.initTRPC.context().create({
|
|
|
28
28
|
},
|
|
29
29
|
});
|
|
30
30
|
const SLOW_API_THRESHOLD_MS = 10000;
|
|
31
|
+
const LOG_SLOW_API_INPUT = true;
|
|
31
32
|
exports.slowApiMiddleware = exports.t.middleware(async ({ path, ctx, next }) => {
|
|
32
33
|
const logger = (0, index_1.getLibraries)().getLoggerKit();
|
|
33
34
|
const startTime = Date.now();
|
|
34
35
|
const result = await next();
|
|
35
36
|
const duration = Date.now() - startTime;
|
|
36
37
|
if (duration > SLOW_API_THRESHOLD_MS) {
|
|
38
|
+
const url = ctx.req?.url ?? '';
|
|
39
|
+
const searchParams = new URL(url, 'http://localhost').searchParams;
|
|
40
|
+
let parsedInput;
|
|
41
|
+
const rawInputParam = searchParams.get('input');
|
|
42
|
+
if (rawInputParam) {
|
|
43
|
+
try {
|
|
44
|
+
parsedInput = JSON.parse(rawInputParam);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
parsedInput = rawInputParam;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const allParams = Object.fromEntries(searchParams.entries());
|
|
52
|
+
if (Object.keys(allParams).length > 0)
|
|
53
|
+
parsedInput = allParams;
|
|
54
|
+
}
|
|
55
|
+
const authHeader = ctx.req?.headers?.authorization ?? '';
|
|
56
|
+
const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : authHeader || undefined;
|
|
37
57
|
const logEntry = {
|
|
38
58
|
timestamp: new Date().toISOString(),
|
|
39
59
|
path,
|
|
40
60
|
duration,
|
|
41
61
|
userId: ctx.entity?.id,
|
|
42
62
|
userType: ctx.entity?.type,
|
|
63
|
+
input: LOG_SLOW_API_INPUT ? parsedInput : undefined,
|
|
64
|
+
headers: ctx.req?.headers ?? {},
|
|
65
|
+
token,
|
|
43
66
|
message: `Slow API call detected: ${path} took ${duration}ms`,
|
|
44
67
|
};
|
|
45
68
|
logger.warn(logEntry.message, { tag: enum_1.LogTag.SLOW_API, data: logEntry });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/trpc/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AACxC,6BAA+B;AAE/B,uCAA2C;AAC3C,+CAA8C;AAEjC,QAAA,CAAC,GAAG,iBAAQ,CAAC,OAAO,EAAe,CAAC,MAAM,CAAC;IACvD,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,YAAY,cAAQ,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAE5D,OAAO;YACN,GAAG,KAAK;YACR,OAAO,EACN,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBACzC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO;gBACnD,CAAC,CAAC,KAAK,CAAC,OAAO;YACjB,IAAI,EAAE;gBACL,GAAG,KAAK,CAAC,IAAI;gBAEb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,SAAS;aACf;YAED,KAAK,EAAE,SAAS;SAChB,CAAC;IACH,CAAC;CACD,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/trpc/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AACxC,6BAA+B;AAE/B,uCAA2C;AAC3C,+CAA8C;AAEjC,QAAA,CAAC,GAAG,iBAAQ,CAAC,OAAO,EAAe,CAAC,MAAM,CAAC;IACvD,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,YAAY,cAAQ,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAE5D,OAAO;YACN,GAAG,KAAK;YACR,OAAO,EACN,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBACzC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO;gBACnD,CAAC,CAAC,KAAK,CAAC,OAAO;YACjB,IAAI,EAAE;gBACL,GAAG,KAAK,CAAC,IAAI;gBAEb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,SAAS;aACf;YAED,KAAK,EAAE,SAAS;SAChB,CAAC;IACH,CAAC;CACD,CAAC,CAAC;AAaH,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEnB,QAAA,iBAAiB,GAAG,SAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,IAAA,oBAAY,GAAE,CAAC,YAAY,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,IAAI,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAAC;QAEnE,IAAI,WAAoB,CAAC;QACzB,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC;gBACJ,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACR,WAAW,GAAG,aAAa,CAAC;YAC7B,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,WAAW,GAAG,SAAS,CAAC;QAChE,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC;QAE/F,MAAM,QAAQ,GAA0C;YACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI;YACJ,QAAQ;YACR,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE;YACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI;YAC1B,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YACnD,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE;YAC/B,KAAK;YACL,OAAO,EAAE,2BAA2B,IAAI,SAAS,QAAQ,IAAI;SAC7D,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,aAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,SAAC,CAAC,SAAS,CAAC,GAAG,CAAC,yBAAiB,CAAC,CAAC;AACrD,QAAA,gBAAgB,GAAG,SAAC,CAAC,MAAM,CAAC;AAC5B,QAAA,mBAAmB,GAAG,SAAC,CAAC,mBAAmB,CAAC;AAIzD,+DAAqE;AAA5D,+GAAA,iBAAiB,OAAA;AAC1B,sDAAqD;AAA5C,wGAAA,UAAU,OAAA;AACnB,uCAAyC;AAAhC,mGAAA,SAAS,OAAA","sourcesContent":["import { initTRPC } from '@trpc/server';\nimport { ZodError } from 'zod';\nimport { LyxaContext } from './context';\nimport { getLibraries } from '../../index';\nimport { LogTag } from '../../utilities/enum';\n\nexport const t = initTRPC.context<LyxaContext>().create({\n\terrorFormatter({ shape, error }) {\n\t\tlet zodErrors = null;\n\n\t\tif (error.code === 'BAD_REQUEST' && error.cause instanceof ZodError) {\n\t\t\tconst flattened = error.cause.flatten();\n\t\t\tzodErrors = flattened.fieldErrors;\n\t\t}\n\n\t\tconsole.log('Error:', error, shape, 'error log', zodErrors);\n\n\t\treturn {\n\t\t\t...shape,\n\t\t\tmessage:\n\t\t\t\tzodErrors && typeof zodErrors === 'object'\n\t\t\t\t\t? Object.values(zodErrors)[0]?.[0] || shape.message\n\t\t\t\t\t: shape.message,\n\t\t\tdata: {\n\t\t\t\t...shape.data,\n\n\t\t\t\tstack: undefined,\n\t\t\t\tpath: undefined,\n\t\t\t},\n\t\t\t// Prevent stack trace from being returned in the response\n\t\t\tstack: undefined,\n\t\t};\n\t},\n});\n\ninterface SlowApiLogEntry {\n\ttimestamp: string;\n\tpath: string;\n\tduration: number;\n\tinput?: any;\n\theaders?: Record<string, string | string[] | undefined>;\n\ttoken?: string;\n\tuserId?: string;\n\tuserType?: string;\n}\n\nconst SLOW_API_THRESHOLD_MS = 10000; // 10 second\n\nconst LOG_SLOW_API_INPUT = true;\n\nexport const slowApiMiddleware = t.middleware(async ({ path, ctx, next }) => {\n\tconst logger = getLibraries().getLoggerKit();\n\tconst startTime = Date.now();\n\n\tconst result = await next();\n\n\tconst duration = Date.now() - startTime;\n\n\tif (duration > SLOW_API_THRESHOLD_MS) {\n\t\tconst url = ctx.req?.url ?? '';\n\t\tconst searchParams = new URL(url, 'http://localhost').searchParams;\n\n\t\tlet parsedInput: unknown;\n\t\tconst rawInputParam = searchParams.get('input');\n\t\tif (rawInputParam) {\n\t\t\ttry {\n\t\t\t\tparsedInput = JSON.parse(rawInputParam);\n\t\t\t} catch {\n\t\t\t\tparsedInput = rawInputParam;\n\t\t\t}\n\t\t} else {\n\t\t\tconst allParams = Object.fromEntries(searchParams.entries());\n\t\t\tif (Object.keys(allParams).length > 0) parsedInput = allParams;\n\t\t}\n\n\t\tconst authHeader = ctx.req?.headers?.authorization ?? '';\n\t\tconst token = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : authHeader || undefined;\n\n\t\tconst logEntry: SlowApiLogEntry & { message: string } = {\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tpath,\n\t\t\tduration,\n\t\t\tuserId: ctx.entity?.id,\n\t\t\tuserType: ctx.entity?.type,\n\t\t\tinput: LOG_SLOW_API_INPUT ? parsedInput : undefined,\n\t\t\theaders: ctx.req?.headers ?? {},\n\t\t\ttoken,\n\t\t\tmessage: `Slow API call detected: ${path} took ${duration}ms`,\n\t\t};\n\n\t\tlogger.warn(logEntry.message, { tag: LogTag.SLOW_API, data: logEntry });\n\t}\n\n\treturn result;\n});\n\nexport const publicProcedure = t.procedure.use(slowApiMiddleware);\nexport const createTRPCRouter = t.router;\nexport const createCallerFactory = t.createCallerFactory;\n\nexport type { inferRouterInputs, inferRouterOutputs } from '@trpc/server';\nexport type { AnyTRPCRouter } from '@trpc/server';\nexport { createHTTPHandler } from '@trpc/server/adapters/standalone';\nexport { observable } from '@trpc/server/observable';\nexport { TRPCError } from '@trpc/server';\n\nexport type LyxaRouter = ReturnType<typeof createTRPCRouter>;"]}
|
package/dist/types/README.md
CHANGED
package/dist/types/package.json
CHANGED