@jaypie/express 1.2.0-rc.2 → 1.2.0-rc.4
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/cjs/expressStreamHandler.d.ts +42 -0
- package/dist/cjs/index.cjs +236 -13
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/esm/expressStreamHandler.d.ts +42 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +232 -10
- package/dist/esm/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Request, Response } from "express";
|
|
2
|
+
export type JaypieStreamHandlerSetup = (req: Request, res: Response) => Promise<void> | void;
|
|
3
|
+
export type JaypieStreamHandlerTeardown = (req: Request, res: Response) => Promise<void> | void;
|
|
4
|
+
export type JaypieStreamHandlerValidate = (req: Request, res: Response) => Promise<boolean> | boolean;
|
|
5
|
+
export type ExpressStreamHandlerLocals = (req: Request, res: Response) => Promise<unknown> | unknown;
|
|
6
|
+
export interface ExpressStreamHandlerOptions {
|
|
7
|
+
chaos?: string;
|
|
8
|
+
contentType?: string;
|
|
9
|
+
locals?: Record<string, unknown | ExpressStreamHandlerLocals>;
|
|
10
|
+
name?: string;
|
|
11
|
+
setup?: JaypieStreamHandlerSetup[] | JaypieStreamHandlerSetup;
|
|
12
|
+
teardown?: JaypieStreamHandlerTeardown[] | JaypieStreamHandlerTeardown;
|
|
13
|
+
unavailable?: boolean;
|
|
14
|
+
validate?: JaypieStreamHandlerValidate[] | JaypieStreamHandlerValidate;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Streaming Express handler function signature.
|
|
18
|
+
* Handler should write to the response stream and not return a value.
|
|
19
|
+
*/
|
|
20
|
+
export type ExpressStreamHandler = (req: Request, res: Response, ...params: unknown[]) => Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a streaming Express handler that sets up SSE headers and allows
|
|
23
|
+
* streaming responses. The handler receives the standard req/res and should
|
|
24
|
+
* write to res.write() directly.
|
|
25
|
+
*
|
|
26
|
+
* Usage:
|
|
27
|
+
* ```ts
|
|
28
|
+
* app.get('/stream', expressStreamHandler(async (req, res) => {
|
|
29
|
+
* const llmStream = llm.stream("Hello");
|
|
30
|
+
* await createExpressStream(llmStream, res);
|
|
31
|
+
* }));
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* The handler sets appropriate SSE headers automatically:
|
|
35
|
+
* - Content-Type: text/event-stream
|
|
36
|
+
* - Cache-Control: no-cache
|
|
37
|
+
* - Connection: keep-alive
|
|
38
|
+
* - X-Accel-Buffering: no (disables nginx buffering)
|
|
39
|
+
*/
|
|
40
|
+
declare function expressStreamHandler(handler: ExpressStreamHandler, options?: ExpressStreamHandlerOptions): ExpressStreamHandler;
|
|
41
|
+
declare function expressStreamHandler(options: ExpressStreamHandlerOptions, handler: ExpressStreamHandler): ExpressStreamHandler;
|
|
42
|
+
export default expressStreamHandler;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var errors = require('@jaypie/errors');
|
|
4
4
|
var kit = require('@jaypie/kit');
|
|
5
5
|
var expressCors = require('cors');
|
|
6
|
-
var logger$
|
|
6
|
+
var logger$2 = require('@jaypie/logger');
|
|
7
7
|
var datadog = require('@jaypie/datadog');
|
|
8
8
|
var serverlessExpress = require('@codegenie/serverless-express');
|
|
9
9
|
|
|
@@ -133,7 +133,7 @@ const getCurrentInvokeUuid = () => getServerlessExpressUuid();
|
|
|
133
133
|
// Main
|
|
134
134
|
//
|
|
135
135
|
const decorateResponse = (res, { handler = "", version = process.env.PROJECT_VERSION, } = {}) => {
|
|
136
|
-
const log = logger$
|
|
136
|
+
const log = logger$2.log.lib({
|
|
137
137
|
lib: kit.JAYPIE.LIB.EXPRESS,
|
|
138
138
|
});
|
|
139
139
|
//
|
|
@@ -232,7 +232,7 @@ function summarizeResponse(res, extras) {
|
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
// Cast logger to extended interface for runtime features not in type definitions
|
|
235
|
-
const logger = logger$
|
|
235
|
+
const logger$1 = logger$2.log;
|
|
236
236
|
function expressHandler(handlerOrOptions, optionsOrHandler) {
|
|
237
237
|
/* eslint-enable no-redeclare */
|
|
238
238
|
let handler;
|
|
@@ -277,21 +277,21 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
|
|
|
277
277
|
kit.getHeaderFrom("X-Project-Chaos", req);
|
|
278
278
|
}
|
|
279
279
|
// Re-init the logger
|
|
280
|
-
logger.init();
|
|
280
|
+
logger$1.init();
|
|
281
281
|
// Very low-level, internal sub-trace details
|
|
282
|
-
const libLogger = logger.lib({
|
|
282
|
+
const libLogger = logger$1.lib({
|
|
283
283
|
lib: kit.JAYPIE.LIB.EXPRESS,
|
|
284
284
|
});
|
|
285
285
|
// Top-level, important details that run at the same level as the main logger
|
|
286
|
-
const log = logger.lib({
|
|
287
|
-
level: logger.level,
|
|
286
|
+
const log = logger$1.lib({
|
|
287
|
+
level: logger$1.level,
|
|
288
288
|
lib: kit.JAYPIE.LIB.EXPRESS,
|
|
289
289
|
});
|
|
290
290
|
// Update the public logger with the request ID
|
|
291
291
|
const invokeUuid = getCurrentInvokeUuid();
|
|
292
292
|
if (invokeUuid) {
|
|
293
|
-
logger.tag({ invoke: invokeUuid });
|
|
294
|
-
logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });
|
|
293
|
+
logger$1.tag({ invoke: invokeUuid });
|
|
294
|
+
logger$1.tag({ shortInvoke: invokeUuid.slice(0, 8) });
|
|
295
295
|
// TODO: in theory this is redundant
|
|
296
296
|
libLogger.tag({ invoke: invokeUuid });
|
|
297
297
|
libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });
|
|
@@ -307,7 +307,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
|
|
|
307
307
|
name = kit.JAYPIE.UNKNOWN;
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
|
-
logger.tag({ handler: name });
|
|
310
|
+
logger$1.tag({ handler: name });
|
|
311
311
|
// TODO: in theory this is redundant
|
|
312
312
|
libLogger.tag({ handler: name });
|
|
313
313
|
log.tag({ handler: name });
|
|
@@ -525,7 +525,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
|
|
|
525
525
|
});
|
|
526
526
|
}
|
|
527
527
|
// Clean up the public logger
|
|
528
|
-
logger.untag("handler");
|
|
528
|
+
logger$1.untag("handler");
|
|
529
529
|
//
|
|
530
530
|
//
|
|
531
531
|
// Return
|
|
@@ -534,6 +534,228 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
|
|
|
534
534
|
};
|
|
535
535
|
}
|
|
536
536
|
|
|
537
|
+
// Cast logger to extended interface for runtime features not in type definitions
|
|
538
|
+
const logger = logger$2.log;
|
|
539
|
+
//
|
|
540
|
+
//
|
|
541
|
+
// Helper
|
|
542
|
+
//
|
|
543
|
+
/**
|
|
544
|
+
* Format an error as an SSE error event
|
|
545
|
+
*/
|
|
546
|
+
function formatErrorSSE(error) {
|
|
547
|
+
const isJaypieError = error.isProjectError;
|
|
548
|
+
const body = isJaypieError
|
|
549
|
+
? error.body?.() ?? { error: error.message }
|
|
550
|
+
: new errors.UnhandledError().body();
|
|
551
|
+
return `event: error\ndata: ${JSON.stringify(body)}\n\n`;
|
|
552
|
+
}
|
|
553
|
+
function expressStreamHandler(handlerOrOptions, optionsOrHandler) {
|
|
554
|
+
/* eslint-enable no-redeclare */
|
|
555
|
+
let handler;
|
|
556
|
+
let options;
|
|
557
|
+
// If handler is an object and options is a function, swap them
|
|
558
|
+
if (typeof handlerOrOptions === "object" &&
|
|
559
|
+
typeof optionsOrHandler === "function") {
|
|
560
|
+
handler = optionsOrHandler;
|
|
561
|
+
options = handlerOrOptions;
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
handler = handlerOrOptions;
|
|
565
|
+
options = (optionsOrHandler || {});
|
|
566
|
+
}
|
|
567
|
+
//
|
|
568
|
+
//
|
|
569
|
+
// Validate
|
|
570
|
+
//
|
|
571
|
+
let { chaos, contentType = "text/event-stream", locals, name, setup = [], teardown = [], unavailable, validate, } = options;
|
|
572
|
+
if (typeof handler !== "function") {
|
|
573
|
+
throw new errors.BadRequestError(`Argument "${handler}" doesn't match type "function"`);
|
|
574
|
+
}
|
|
575
|
+
if (locals !== undefined &&
|
|
576
|
+
(typeof locals !== "object" || locals === null || Array.isArray(locals))) {
|
|
577
|
+
throw new errors.BadRequestError(`Argument "${locals}" doesn't match type "object"`);
|
|
578
|
+
}
|
|
579
|
+
setup = kit.force.array(setup);
|
|
580
|
+
teardown = kit.force.array(teardown);
|
|
581
|
+
//
|
|
582
|
+
//
|
|
583
|
+
// Setup
|
|
584
|
+
//
|
|
585
|
+
let jaypieFunction;
|
|
586
|
+
return async (req, res, ...params) => {
|
|
587
|
+
const extReq = req;
|
|
588
|
+
const extRes = res;
|
|
589
|
+
// Set default chaos value
|
|
590
|
+
if (chaos === undefined) {
|
|
591
|
+
chaos =
|
|
592
|
+
process.env.PROJECT_CHAOS ||
|
|
593
|
+
kit.getHeaderFrom("X-Project-Chaos", req);
|
|
594
|
+
}
|
|
595
|
+
// Re-init the logger
|
|
596
|
+
logger.init();
|
|
597
|
+
const libLogger = logger.lib({
|
|
598
|
+
lib: kit.JAYPIE.LIB.EXPRESS,
|
|
599
|
+
});
|
|
600
|
+
const log = logger.lib({
|
|
601
|
+
level: logger.level,
|
|
602
|
+
lib: kit.JAYPIE.LIB.EXPRESS,
|
|
603
|
+
});
|
|
604
|
+
// Update the public logger with the request ID
|
|
605
|
+
const invokeUuid = getCurrentInvokeUuid();
|
|
606
|
+
if (invokeUuid) {
|
|
607
|
+
logger.tag({ invoke: invokeUuid });
|
|
608
|
+
logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });
|
|
609
|
+
libLogger.tag({ invoke: invokeUuid });
|
|
610
|
+
libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });
|
|
611
|
+
log.tag({ invoke: invokeUuid });
|
|
612
|
+
log.tag({ shortInvoke: invokeUuid.slice(0, 8) });
|
|
613
|
+
}
|
|
614
|
+
if (!name) {
|
|
615
|
+
if (handler.name) {
|
|
616
|
+
name = handler.name;
|
|
617
|
+
}
|
|
618
|
+
else {
|
|
619
|
+
name = kit.JAYPIE.UNKNOWN;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
logger.tag({ handler: name });
|
|
623
|
+
libLogger.tag({ handler: name });
|
|
624
|
+
log.tag({ handler: name });
|
|
625
|
+
libLogger.trace("[jaypie] Express stream init");
|
|
626
|
+
// Set req.locals if it doesn't exist
|
|
627
|
+
if (!extReq.locals)
|
|
628
|
+
extReq.locals = {};
|
|
629
|
+
if (!extReq.locals._jaypie)
|
|
630
|
+
extReq.locals._jaypie = {};
|
|
631
|
+
// Set res.locals if it doesn't exist
|
|
632
|
+
if (!extRes.locals)
|
|
633
|
+
extRes.locals = {};
|
|
634
|
+
if (!extRes.locals._jaypie)
|
|
635
|
+
extRes.locals._jaypie = {};
|
|
636
|
+
//
|
|
637
|
+
//
|
|
638
|
+
// SSE Headers
|
|
639
|
+
//
|
|
640
|
+
res.setHeader("Content-Type", contentType);
|
|
641
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
642
|
+
res.setHeader("Connection", "keep-alive");
|
|
643
|
+
res.setHeader("X-Accel-Buffering", "no"); // Disable nginx buffering
|
|
644
|
+
res.flushHeaders();
|
|
645
|
+
//
|
|
646
|
+
//
|
|
647
|
+
// Preprocess
|
|
648
|
+
//
|
|
649
|
+
if (locals) {
|
|
650
|
+
const keys = Object.keys(locals);
|
|
651
|
+
if (keys.length > 0) {
|
|
652
|
+
const localsSetup = async (localsReq, localsRes) => {
|
|
653
|
+
const extLocalsReq = localsReq;
|
|
654
|
+
for (let i = 0; i < keys.length; i += 1) {
|
|
655
|
+
const key = keys[i];
|
|
656
|
+
libLogger.trace(`[jaypie] Locals: ${key}`);
|
|
657
|
+
const localValue = locals[key];
|
|
658
|
+
if (typeof localValue === "function") {
|
|
659
|
+
extLocalsReq.locals[key] = await localValue(localsReq, localsRes);
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
extLocalsReq.locals[key] = localValue;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
setup.push(localsSetup);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
try {
|
|
670
|
+
log.info.var({ req: summarizeRequest(req) });
|
|
671
|
+
jaypieFunction = kit.jaypieHandler(handler, {
|
|
672
|
+
chaos,
|
|
673
|
+
name,
|
|
674
|
+
setup,
|
|
675
|
+
teardown,
|
|
676
|
+
unavailable,
|
|
677
|
+
validate,
|
|
678
|
+
});
|
|
679
|
+
libLogger.trace("[jaypie] Express stream execution");
|
|
680
|
+
//
|
|
681
|
+
//
|
|
682
|
+
// Process
|
|
683
|
+
//
|
|
684
|
+
await jaypieFunction(req, res, ...params);
|
|
685
|
+
//
|
|
686
|
+
//
|
|
687
|
+
// Error Handling
|
|
688
|
+
//
|
|
689
|
+
}
|
|
690
|
+
catch (error) {
|
|
691
|
+
const jaypieError = error;
|
|
692
|
+
// Log the error
|
|
693
|
+
if (jaypieError.isProjectError) {
|
|
694
|
+
log.debug("Caught jaypie error in stream handler");
|
|
695
|
+
log.info.var({ jaypieError: error });
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
log.fatal("Caught unhandled error in stream handler");
|
|
699
|
+
log.info.var({ unhandledError: error.message });
|
|
700
|
+
}
|
|
701
|
+
// Write error as SSE event
|
|
702
|
+
try {
|
|
703
|
+
res.write(formatErrorSSE(error));
|
|
704
|
+
}
|
|
705
|
+
catch {
|
|
706
|
+
// Response may already be closed
|
|
707
|
+
log.warn("Failed to write error to stream - response may be closed");
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
finally {
|
|
711
|
+
// End the response
|
|
712
|
+
try {
|
|
713
|
+
res.end();
|
|
714
|
+
}
|
|
715
|
+
catch {
|
|
716
|
+
// Response may already be ended
|
|
717
|
+
}
|
|
718
|
+
//
|
|
719
|
+
//
|
|
720
|
+
// Postprocess
|
|
721
|
+
//
|
|
722
|
+
// Log completion
|
|
723
|
+
log.info.var({
|
|
724
|
+
res: { statusCode: res.statusCode, streaming: true },
|
|
725
|
+
});
|
|
726
|
+
// Submit metric if Datadog is configured
|
|
727
|
+
if (datadog.hasDatadogEnv()) {
|
|
728
|
+
let path = (req.baseUrl || "") + (req.url || "");
|
|
729
|
+
if (!path.startsWith("/")) {
|
|
730
|
+
path = "/" + path;
|
|
731
|
+
}
|
|
732
|
+
if (path.length > 1 && path.endsWith("/")) {
|
|
733
|
+
path = path.slice(0, -1);
|
|
734
|
+
}
|
|
735
|
+
path = path.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, ":id");
|
|
736
|
+
let metricPrefix = "project";
|
|
737
|
+
if (process.env.PROJECT_SPONSOR) {
|
|
738
|
+
metricPrefix = process.env.PROJECT_SPONSOR;
|
|
739
|
+
}
|
|
740
|
+
else if (process.env.PROJECT_KEY) {
|
|
741
|
+
metricPrefix = `project.${process.env.PROJECT_KEY}`;
|
|
742
|
+
}
|
|
743
|
+
await datadog.submitMetric({
|
|
744
|
+
name: `${metricPrefix}.api.stream`,
|
|
745
|
+
type: datadog.DATADOG.METRIC.TYPE.COUNT,
|
|
746
|
+
value: 1,
|
|
747
|
+
tags: {
|
|
748
|
+
status: String(res.statusCode),
|
|
749
|
+
path,
|
|
750
|
+
},
|
|
751
|
+
});
|
|
752
|
+
}
|
|
753
|
+
// Clean up the public logger
|
|
754
|
+
logger.untag("handler");
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
|
|
537
759
|
//
|
|
538
760
|
//
|
|
539
761
|
// Main
|
|
@@ -561,12 +783,12 @@ const httpHandler = (statusCode = kit.HTTP.CODE.OK, context = {}) => {
|
|
|
561
783
|
};
|
|
562
784
|
// If this maps to an error, throw it
|
|
563
785
|
if (error[statusCode]) {
|
|
564
|
-
logger$
|
|
786
|
+
logger$2.log.trace(`@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`);
|
|
565
787
|
throw new error[statusCode]();
|
|
566
788
|
}
|
|
567
789
|
// If this is an error and we didn't get thrown, log a warning
|
|
568
790
|
if (statusCode >= 400) {
|
|
569
|
-
logger$
|
|
791
|
+
logger$2.log.warn(`@knowdev/express: status code ${statusCode} not mapped as throwable`);
|
|
570
792
|
}
|
|
571
793
|
// Send the response
|
|
572
794
|
res.status(statusCode);
|
|
@@ -633,6 +855,7 @@ exports.cors = cors_helper;
|
|
|
633
855
|
exports.echoRoute = echoRoute;
|
|
634
856
|
exports.expressHandler = expressHandler;
|
|
635
857
|
exports.expressHttpCodeHandler = httpHandler;
|
|
858
|
+
exports.expressStreamHandler = expressStreamHandler;
|
|
636
859
|
exports.forbiddenRoute = forbiddenRoute;
|
|
637
860
|
exports.goneRoute = goneRoute;
|
|
638
861
|
exports.methodNotAllowedRoute = methodNotAllowedRoute;
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/kit\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return requestOrigin.includes(allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n return (req: Request, res: Response, next: NextFunction) => {\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\n\n//\n//\n// Helper Functions\n//\n\n// Adapter for the \"@codegenie/serverless-express\" uuid\nfunction getServerlessExpressUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (\n currentInvoke &&\n currentInvoke.context &&\n currentInvoke.context.awsRequestId\n ) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\nconst getCurrentInvokeUuid = (): string | undefined =>\n getServerlessExpressUuid();\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n if (\n !res.get(HTTP.HEADER.POWERED_BY) ||\n res.get(HTTP.HEADER.POWERED_BY) === \"Express\"\n ) {\n res.set(HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n res.set(HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);\n }\n\n // X-Project-Handler\n if (handler) {\n res.set(HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n res.set(HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n res.set(HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n res.set(HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.body === \"function\") {\n response = jaypieError.body();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.body() as unknown as Record<string, unknown>;\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n res.json((response as unknown as ResponseWithJson).json());\n } else {\n res.status(status).json(response);\n }\n } else if (typeof response === \"string\") {\n try {\n res.status(status).json(JSON.parse(response));\n } catch {\n res.status(status).send(response);\n }\n } else if (response === true) {\n res.status(HTTP.CODE.CREATED).send();\n } else {\n res.status(status).send(response as unknown as string);\n }\n } else {\n // No response\n res.status(HTTP.CODE.NO_CONTENT).send();\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n log.fatal(\"Express encountered an error while sending the response\");\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n InternalError,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\nimport { log } from \"@jaypie/logger\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n if (\n typeof context !== \"object\" ||\n context === null ||\n Array.isArray(context)\n ) {\n throw new BadRequestError(\n `Argument \"${context}\" doesn't match type \"object\"`,\n );\n }\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { NotImplementedError } from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["force","envBoolean","CorsError","getCurrentInvoke","publicLogger","JAYPIE","HTTP","BadRequestError","getHeaderFrom","jaypieHandler","UnhandledError","hasDatadogEnv","submitMetric","DATADOG","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","GoneError","TeapotError","InternalError","BadGatewayError","UnavailableError","GatewayTimeoutError","log","NotImplementedError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/expressStreamHandler.ts","../../../src/http.handler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/kit\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return requestOrigin.includes(allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n return (req: Request, res: Response, next: NextFunction) => {\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\n\n//\n//\n// Helper Functions\n//\n\n// Adapter for the \"@codegenie/serverless-express\" uuid\nfunction getServerlessExpressUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (\n currentInvoke &&\n currentInvoke.context &&\n currentInvoke.context.awsRequestId\n ) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\nconst getCurrentInvokeUuid = (): string | undefined =>\n getServerlessExpressUuid();\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n if (\n !res.get(HTTP.HEADER.POWERED_BY) ||\n res.get(HTTP.HEADER.POWERED_BY) === \"Express\"\n ) {\n res.set(HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n res.set(HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);\n }\n\n // X-Project-Handler\n if (handler) {\n res.set(HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n res.set(HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n res.set(HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n res.set(HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.body === \"function\") {\n response = jaypieError.body();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.body() as unknown as Record<string, unknown>;\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n res.json((response as unknown as ResponseWithJson).json());\n } else {\n res.status(status).json(response);\n }\n } else if (typeof response === \"string\") {\n try {\n res.status(status).json(JSON.parse(response));\n } catch {\n res.status(status).send(response);\n }\n } else if (response === true) {\n res.status(HTTP.CODE.CREATED).send();\n } else {\n res.status(status).send(response as unknown as string);\n }\n } else {\n // No response\n res.status(HTTP.CODE.NO_CONTENT).send();\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n log.fatal(\"Express encountered an error while sending the response\");\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieStreamHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieStreamHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieStreamHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressStreamHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressStreamHandlerOptions {\n chaos?: string;\n contentType?: string;\n locals?: Record<string, unknown | ExpressStreamHandlerLocals>;\n name?: string;\n setup?: JaypieStreamHandlerSetup[] | JaypieStreamHandlerSetup;\n teardown?: JaypieStreamHandlerTeardown[] | JaypieStreamHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieStreamHandlerValidate[] | JaypieStreamHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\n/**\n * Streaming Express handler function signature.\n * Handler should write to the response stream and not return a value.\n */\nexport type ExpressStreamHandler = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<void>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n isProjectError?: boolean;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Helper\n//\n\n/**\n * Format an error as an SSE error event\n */\nfunction formatErrorSSE(error: JaypieError | Error): string {\n const isJaypieError = (error as JaypieError).isProjectError;\n const body = isJaypieError\n ? (error as JaypieError).body?.() ?? { error: error.message }\n : new UnhandledError().body();\n\n return `event: error\\ndata: ${JSON.stringify(body)}\\n\\n`;\n}\n\n//\n//\n// Main\n//\n\n/**\n * Creates a streaming Express handler that sets up SSE headers and allows\n * streaming responses. The handler receives the standard req/res and should\n * write to res.write() directly.\n *\n * Usage:\n * ```ts\n * app.get('/stream', expressStreamHandler(async (req, res) => {\n * const llmStream = llm.stream(\"Hello\");\n * await createExpressStream(llmStream, res);\n * }));\n * ```\n *\n * The handler sets appropriate SSE headers automatically:\n * - Content-Type: text/event-stream\n * - Cache-Control: no-cache\n * - Connection: keep-alive\n * - X-Accel-Buffering: no (disables nginx buffering)\n */\n/* eslint-disable no-redeclare */\nfunction expressStreamHandler(\n handler: ExpressStreamHandler,\n options?: ExpressStreamHandlerOptions,\n): ExpressStreamHandler;\nfunction expressStreamHandler(\n options: ExpressStreamHandlerOptions,\n handler: ExpressStreamHandler,\n): ExpressStreamHandler;\nfunction expressStreamHandler(\n handlerOrOptions: ExpressStreamHandler | ExpressStreamHandlerOptions,\n optionsOrHandler?: ExpressStreamHandlerOptions | ExpressStreamHandler,\n): ExpressStreamHandler {\n /* eslint-enable no-redeclare */\n let handler: ExpressStreamHandler;\n let options: ExpressStreamHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressStreamHandler;\n options = handlerOrOptions as ExpressStreamHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressStreamHandler;\n options = (optionsOrHandler || {}) as ExpressStreamHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n contentType = \"text/event-stream\",\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[];\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[];\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<void> => {\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express stream init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n //\n //\n // SSE Headers\n //\n\n res.setHeader(\"Content-Type\", contentType);\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\"); // Disable nginx buffering\n res.flushHeaders();\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express stream execution\");\n\n //\n //\n // Process\n //\n\n await jaypieFunction(req, res, ...params);\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n const jaypieError = error as JaypieError;\n\n // Log the error\n if (jaypieError.isProjectError) {\n log.debug(\"Caught jaypie error in stream handler\");\n log.info.var({ jaypieError: error });\n } else {\n log.fatal(\"Caught unhandled error in stream handler\");\n log.info.var({ unhandledError: (error as Error).message });\n }\n\n // Write error as SSE event\n try {\n res.write(formatErrorSSE(error as Error));\n } catch {\n // Response may already be closed\n log.warn(\"Failed to write error to stream - response may be closed\");\n }\n } finally {\n // End the response\n try {\n res.end();\n } catch {\n // Response may already be ended\n }\n\n //\n //\n // Postprocess\n //\n\n // Log completion\n log.info.var({\n res: { statusCode: res.statusCode, streaming: true },\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.stream`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n }\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressStreamHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n InternalError,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\nimport { log } from \"@jaypie/logger\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n if (\n typeof context !== \"object\" ||\n context === null ||\n Array.isArray(context)\n ) {\n throw new BadRequestError(\n `Argument \"${context}\" doesn't match type \"object\"`,\n );\n }\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { NotImplementedError } from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["force","envBoolean","CorsError","getCurrentInvoke","publicLogger","JAYPIE","HTTP","logger","BadRequestError","getHeaderFrom","jaypieHandler","UnhandledError","hasDatadogEnv","submitMetric","DATADOG","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","GoneError","TeapotError","InternalError","BadGatewayError","UnavailableError","GatewayTimeoutError","log","NotImplementedError"],"mappings":"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"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ export { EXPRESS } from "./constants.js";
|
|
|
2
2
|
export { default as cors } from "./cors.helper.js";
|
|
3
3
|
export { default as expressHandler } from "./expressHandler.js";
|
|
4
4
|
export type { ExpressHandlerLocals, ExpressHandlerOptions, JaypieHandlerSetup, JaypieHandlerTeardown, JaypieHandlerValidate, } from "./expressHandler.js";
|
|
5
|
+
export { default as expressStreamHandler } from "./expressStreamHandler.js";
|
|
6
|
+
export type { ExpressStreamHandler, ExpressStreamHandlerLocals, ExpressStreamHandlerOptions, JaypieStreamHandlerSetup, JaypieStreamHandlerTeardown, JaypieStreamHandlerValidate, } from "./expressStreamHandler.js";
|
|
5
7
|
export type { CorsConfig } from "./cors.helper.js";
|
|
6
8
|
export { default as expressHttpCodeHandler } from "./http.handler.js";
|
|
7
9
|
export * from "./routes.js";
|