@openstax/ts-utils 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/errors.d.ts +5 -0
- package/dist/cjs/errors.js +4 -1
- package/dist/cjs/middleware/apiErrorHandler.d.ts +7 -0
- package/dist/cjs/middleware/apiErrorHandler.js +29 -0
- package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +11 -0
- package/dist/cjs/middleware/apiSlowResponseMiddleware.js +43 -0
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +10 -0
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +32 -0
- package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +1 -0
- package/dist/cjs/middleware/throwNotFoundMiddleware.js +11 -0
- package/dist/cjs/profile.d.ts +2 -0
- package/dist/cjs/routing/index.d.ts +14 -4
- package/dist/cjs/routing/index.js +16 -8
- package/dist/cjs/services/apiGateway/index.js +2 -1
- package/dist/cjs/services/authProvider/browser.js +1 -1
- package/dist/cjs/services/logger/console.d.ts +1 -0
- package/dist/cjs/services/logger/console.js +9 -0
- package/dist/cjs/services/logger/index.d.ts +14 -0
- package/dist/cjs/services/logger/index.js +20 -0
- package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -1
- package/dist/esm/errors.d.ts +5 -0
- package/dist/esm/errors.js +2 -0
- package/dist/esm/middleware/apiErrorHandler.d.ts +7 -0
- package/dist/esm/middleware/apiErrorHandler.js +25 -0
- package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +11 -0
- package/dist/esm/middleware/apiSlowResponseMiddleware.js +39 -0
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +10 -0
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +28 -0
- package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +1 -0
- package/dist/esm/middleware/throwNotFoundMiddleware.js +7 -0
- package/dist/esm/profile.d.ts +2 -0
- package/dist/esm/routing/index.d.ts +14 -4
- package/dist/esm/routing/index.js +16 -8
- package/dist/esm/services/apiGateway/index.js +2 -1
- package/dist/esm/services/authProvider/browser.js +1 -1
- package/dist/esm/services/logger/console.d.ts +1 -0
- package/dist/esm/services/logger/console.js +5 -0
- package/dist/esm/services/logger/index.d.ts +14 -0
- package/dist/esm/services/logger/index.js +16 -0
- package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/cjs/errors.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export declare const isAppError: (e: any) => e is Error & {
|
|
2
|
+
constructor: {
|
|
3
|
+
TYPE: string;
|
|
4
|
+
};
|
|
5
|
+
};
|
|
1
6
|
export declare class InvalidRequestError extends Error {
|
|
2
7
|
static readonly TYPE = "InvalidRequestError";
|
|
3
8
|
static matches: (e: any) => e is typeof InvalidRequestError;
|
package/dist/cjs/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SessionExpiredError = exports.NotFoundError = exports.UnauthorizedError = exports.InvalidRequestError = void 0;
|
|
3
|
+
exports.SessionExpiredError = exports.NotFoundError = exports.UnauthorizedError = exports.InvalidRequestError = exports.isAppError = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* if code is split into multiple bundles, sometimes each bundle
|
|
6
6
|
* will get its own definition of this module and then instanceof checks
|
|
@@ -15,6 +15,9 @@ exports.SessionExpiredError = exports.NotFoundError = exports.UnauthorizedError
|
|
|
15
15
|
*/
|
|
16
16
|
const errorIsType = ({ TYPE }) => (e) => e instanceof Error
|
|
17
17
|
&& e.constructor.TYPE === TYPE;
|
|
18
|
+
const isAppError = (e) => e instanceof Error
|
|
19
|
+
&& typeof e.constructor.TYPE === 'string';
|
|
20
|
+
exports.isAppError = isAppError;
|
|
18
21
|
class InvalidRequestError extends Error {
|
|
19
22
|
}
|
|
20
23
|
exports.InvalidRequestError = InvalidRequestError;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ApiResponse } from '../routing';
|
|
2
|
+
import type { Logger } from '../services/logger';
|
|
3
|
+
declare type Handlers = {
|
|
4
|
+
[key: string]: (e: Error, logger: Logger) => ApiResponse<number, any>;
|
|
5
|
+
};
|
|
6
|
+
export declare const createErrorHandler: (inputHandlers?: Handlers | undefined) => (e: Error, logger: Logger) => Promise<ApiResponse<number, any>>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createErrorHandler = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const routing_1 = require("../routing");
|
|
6
|
+
const logger_1 = require("../services/logger");
|
|
7
|
+
const defaultHandlers = {
|
|
8
|
+
UnauthorizedError: () => (0, routing_1.apiTextResponse)(401, '401 UnauthorizedError'),
|
|
9
|
+
SessionExpiredError: () => (0, routing_1.apiTextResponse)(440, '440 SessionExpiredError'),
|
|
10
|
+
NotFoundError: (e) => (0, routing_1.apiTextResponse)(404, e.message || '404 NotFoundError'),
|
|
11
|
+
InvalidRequestError: (e) => (0, routing_1.apiTextResponse)(400, e.message || '400 InvalidRequestError'),
|
|
12
|
+
};
|
|
13
|
+
const createErrorHandler = (inputHandlers) => {
|
|
14
|
+
const handlers = { ...defaultHandlers, ...inputHandlers };
|
|
15
|
+
return async (e, logger) => {
|
|
16
|
+
const name = (0, errors_1.isAppError)(e) ? e.constructor.TYPE : e.constructor.name;
|
|
17
|
+
const handler = handlers[name];
|
|
18
|
+
if (handler) {
|
|
19
|
+
return handler(e, logger);
|
|
20
|
+
}
|
|
21
|
+
logger.logEvent(logger_1.Level.Error, {
|
|
22
|
+
name: e.name,
|
|
23
|
+
message: e.message,
|
|
24
|
+
stack: e.stack,
|
|
25
|
+
});
|
|
26
|
+
return (0, routing_1.apiTextResponse)(500, '500 Error');
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
exports.createErrorHandler = createErrorHandler;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ConfigProviderForConfig } from '../config';
|
|
2
|
+
import type { ApiResponse } from '../routing';
|
|
3
|
+
import type { Logger } from '../services/logger';
|
|
4
|
+
declare type Config = {
|
|
5
|
+
logResponseSlowerThan: string;
|
|
6
|
+
timeoutResponseAfter: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const createSlowResponseMiddleware: (config: ConfigProviderForConfig<Config>) => () => (response: Promise<ApiResponse<number, any>> | undefined, { logger }: {
|
|
9
|
+
logger: Logger;
|
|
10
|
+
}) => Promise<ApiResponse<number, string>> | undefined;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSlowResponseMiddleware = void 0;
|
|
4
|
+
const resolveConfigValue_1 = require("../config/resolveConfigValue");
|
|
5
|
+
const helpers_1 = require("../misc/helpers");
|
|
6
|
+
const routing_1 = require("../routing");
|
|
7
|
+
const logger_1 = require("../services/logger");
|
|
8
|
+
const createSlowResponseMiddleware = (config) => {
|
|
9
|
+
const getSlowThreshold = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.logResponseSlowerThan).then(result => parseInt(result, 10)));
|
|
10
|
+
const getTimeoutAfter = (0, helpers_1.once)(() => (0, resolveConfigValue_1.resolveConfigValue)(config.timeoutResponseAfter).then(result => parseInt(result, 10)));
|
|
11
|
+
return () => (response, { logger }) => {
|
|
12
|
+
const start = Date.now();
|
|
13
|
+
if (!response) {
|
|
14
|
+
return response;
|
|
15
|
+
}
|
|
16
|
+
return Promise.all([getSlowThreshold(), getTimeoutAfter()]).then(([slowThreshold, timeoutAfter]) => {
|
|
17
|
+
let timeout = undefined;
|
|
18
|
+
const timeoutPromise = isNaN(timeoutAfter)
|
|
19
|
+
? undefined
|
|
20
|
+
: new Promise(resolve => timeout = setTimeout(() => {
|
|
21
|
+
logger.logEvent(logger_1.Level.Error, {
|
|
22
|
+
message: 'request processing timed out',
|
|
23
|
+
});
|
|
24
|
+
resolve((0, routing_1.apiTextResponse)(504, '504 Gateway Timeout'));
|
|
25
|
+
}, timeoutAfter));
|
|
26
|
+
const requestPromise = response.then(response => {
|
|
27
|
+
const time = Date.now() - start;
|
|
28
|
+
if (timeout !== undefined) {
|
|
29
|
+
clearTimeout(timeout);
|
|
30
|
+
}
|
|
31
|
+
if (time > slowThreshold) {
|
|
32
|
+
logger.logEvent(logger_1.Level.Warn, {
|
|
33
|
+
message: 'slow response',
|
|
34
|
+
time,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return response;
|
|
38
|
+
});
|
|
39
|
+
return timeoutPromise ? Promise.race([timeoutPromise, requestPromise]) : requestPromise;
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
exports.createSlowResponseMiddleware = createSlowResponseMiddleware;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { APIGatewayProxyEventV2 } from 'aws-lambda';
|
|
2
|
+
import { ConfigProviderForConfig } from '../config';
|
|
3
|
+
import { ApiResponse } from '../routing';
|
|
4
|
+
declare type Config = {
|
|
5
|
+
corsAllowedHostRegex: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const createLambdaCorsResponseMiddleware: (config: ConfigProviderForConfig<Config>) => (responsePromise: Promise<ApiResponse<number, any>> | undefined, { request }: {
|
|
8
|
+
request: APIGatewayProxyEventV2;
|
|
9
|
+
}) => Promise<ApiResponse<number, any>> | undefined;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLambdaCorsResponseMiddleware = void 0;
|
|
4
|
+
const resolveConfigValue_1 = require("../config/resolveConfigValue");
|
|
5
|
+
const routing_1 = require("../routing");
|
|
6
|
+
const createLambdaCorsResponseMiddleware = (config) => (responsePromise, { request }) => {
|
|
7
|
+
const cors = async () => {
|
|
8
|
+
const allowedHost = await (0, resolveConfigValue_1.resolveConfigValue)(config.corsAllowedHostRegex);
|
|
9
|
+
if (request.headers.origin && new URL(request.headers.origin).hostname.match(new RegExp(allowedHost))) {
|
|
10
|
+
return {
|
|
11
|
+
'Access-Control-Allow-Origin': request.headers.origin,
|
|
12
|
+
'Access-Control-Allow-Credentials': 'true',
|
|
13
|
+
'Access-Control-Allow-Headers': 'content-type',
|
|
14
|
+
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
if (responsePromise) {
|
|
19
|
+
return responsePromise.then(async (response) => {
|
|
20
|
+
response.headers = {
|
|
21
|
+
...await cors(),
|
|
22
|
+
...response.headers
|
|
23
|
+
};
|
|
24
|
+
return response;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (request.requestContext.http.method === 'OPTIONS') {
|
|
28
|
+
return cors().then(headers => (0, routing_1.apiTextResponse)(200, '', headers));
|
|
29
|
+
}
|
|
30
|
+
return responsePromise;
|
|
31
|
+
};
|
|
32
|
+
exports.createLambdaCorsResponseMiddleware = createLambdaCorsResponseMiddleware;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createThrowNotFoundMiddleware: <Ro>() => () => (response: Promise<Ro> | undefined) => Promise<Ro>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createThrowNotFoundMiddleware = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const createThrowNotFoundMiddleware = () => () => (response) => {
|
|
6
|
+
if (!response) {
|
|
7
|
+
throw new errors_1.NotFoundError('not found');
|
|
8
|
+
}
|
|
9
|
+
return response;
|
|
10
|
+
};
|
|
11
|
+
exports.createThrowNotFoundMiddleware = createThrowNotFoundMiddleware;
|
package/dist/cjs/profile.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { GenericFetch } from './fetch';
|
|
2
2
|
import { ApiResponse, HttpHeaders } from './routing';
|
|
3
|
+
import { Logger } from './services/logger';
|
|
3
4
|
export interface Call {
|
|
4
5
|
start: number;
|
|
5
6
|
end?: number;
|
|
@@ -52,6 +53,7 @@ export declare const makeProfileApiResponseMiddleware: <Ri extends {
|
|
|
52
53
|
}>(showReport: (request: Ri) => string | boolean) => () => (responsePromise: Promise<ApiResponse<number, any>> | undefined, { request, profile }: {
|
|
53
54
|
request: Ri;
|
|
54
55
|
profile: Track;
|
|
56
|
+
logger: Logger;
|
|
55
57
|
}) => Promise<ApiResponse<number, any>> | undefined;
|
|
56
58
|
export declare const makeHtmlReport: (report: CallReport) => string;
|
|
57
59
|
export declare const makeHtmlProfileReport: (report: ProfileReport) => string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Track } from '../profile';
|
|
2
|
+
import { Logger } from '../services/logger';
|
|
2
3
|
export declare type QueryParams = Record<string, string | undefined | string[] | null>;
|
|
3
4
|
export declare type RouteParams = {
|
|
4
5
|
[key: string]: string;
|
|
@@ -19,6 +20,7 @@ export declare type PayloadForRoute<R> = RequestServicesForRoute<R> extends {
|
|
|
19
20
|
declare type RequestServiceProvider<Sa, Sr, Ri> = (app: Sa) => <R>(middleware: {
|
|
20
21
|
request: Ri;
|
|
21
22
|
profile: Track;
|
|
23
|
+
logger: Logger;
|
|
22
24
|
}, match: RouteMatchRecord<R>) => Sr;
|
|
23
25
|
declare type RouteHandler<P, Sr, Ro> = (params: P, request: Sr) => Ro;
|
|
24
26
|
declare type Route<N extends string, P extends RouteParams | undefined, Sa, Sr, Ri, Ro> = (Sr extends undefined ? {
|
|
@@ -50,19 +52,27 @@ export declare const makeRenderRouteUrl: <Ru extends {
|
|
|
50
52
|
}>() => <R extends Ru>(route: R, params: ParamsForRoute<R>, query?: QueryParams) => string;
|
|
51
53
|
export declare const renderAnyRouteUrl: <R extends any>(route: R, params: ParamsForRoute<R>, query?: QueryParams) => string;
|
|
52
54
|
declare type RequestPathExtractor<Ri> = (request: Ri) => string;
|
|
55
|
+
declare type RequestLogExtractor<Ri> = (request: Ri) => JsonCompatibleStruct;
|
|
53
56
|
declare type RequestRouteMatcher<Ri, R> = (request: Ri, route: R) => boolean;
|
|
57
|
+
declare type CompatibleServices<T1> = keyof T1 extends 'logger' ? T1 extends {
|
|
58
|
+
logger: Logger;
|
|
59
|
+
} ? T1 : never : T1 & {
|
|
60
|
+
logger?: Logger;
|
|
61
|
+
};
|
|
54
62
|
declare type RequestResponder<Sa, Ri, Ro> = {
|
|
55
|
-
(services: Sa): (request: Ri) => Ro | undefined;
|
|
56
|
-
<RoF>(services: Sa
|
|
63
|
+
(services: CompatibleServices<Sa>): (request: Ri) => Ro | undefined;
|
|
64
|
+
<RoF>(services: CompatibleServices<Sa>, responseMiddleware: (app: Sa) => (response: Ro | undefined, request: {
|
|
57
65
|
request: Ri;
|
|
58
66
|
profile: Track;
|
|
67
|
+
logger: Logger;
|
|
59
68
|
}) => RoF): (request: Ri) => RoF;
|
|
60
69
|
};
|
|
61
|
-
export declare const makeGetRequestResponder: <Sa, Ru, Ri, Ro>() => ({ routes, pathExtractor, routeMatcher, errorHandler }: {
|
|
70
|
+
export declare const makeGetRequestResponder: <Sa, Ru, Ri, Ro>() => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }: {
|
|
62
71
|
routes: () => AnySpecificRoute<Ru, Sa, Ri, Ro>[];
|
|
63
72
|
pathExtractor: RequestPathExtractor<Ri>;
|
|
73
|
+
logExtractor?: RequestLogExtractor<Ri> | undefined;
|
|
64
74
|
routeMatcher?: RequestRouteMatcher<Ri, AnySpecificRoute<Ru, Sa, Ri, Ro>> | undefined;
|
|
65
|
-
errorHandler?: ((e: Error) => Ro) | undefined;
|
|
75
|
+
errorHandler?: ((e: Error, logger: Logger) => Ro) | undefined;
|
|
66
76
|
}) => RequestResponder<Sa, Ri, Ro>;
|
|
67
77
|
export declare type HttpHeaders = {
|
|
68
78
|
[key: string]: string | undefined | string[];
|
|
@@ -34,6 +34,7 @@ const pathToRegexp = __importStar(require("path-to-regexp"));
|
|
|
34
34
|
const query_string_1 = __importDefault(require("query-string"));
|
|
35
35
|
const helpers_1 = require("../misc/helpers");
|
|
36
36
|
const profile_1 = require("../profile");
|
|
37
|
+
const console_1 = require("../services/logger/console");
|
|
37
38
|
/*
|
|
38
39
|
* route definition helper. the only required params of the route are the name, path, and handler. other params
|
|
39
40
|
* can be added to the type and then later used in the routeMatcher. when defining the `createRoute` method, only
|
|
@@ -93,11 +94,11 @@ exports.renderAnyRouteUrl = (0, exports.makeRenderRouteUrl)();
|
|
|
93
94
|
const bindRoute = (services, appBinder, pathExtractor, matcher) => (route) => {
|
|
94
95
|
const getParamsFromPath = pathToRegexp.match(route.path, { decode: decodeURIComponent });
|
|
95
96
|
const boundServiceProvider = route.requestServiceProvider && appBinder(services, route.requestServiceProvider);
|
|
96
|
-
return (request, profile) => {
|
|
97
|
+
return (request, profile, logger) => {
|
|
97
98
|
const path = pathExtractor(request);
|
|
98
99
|
const match = getParamsFromPath(path);
|
|
99
100
|
if ((!matcher || matcher(request, route)) && match) {
|
|
100
|
-
return profile.track(route.name, routeProfile => () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, profile: routeProfile }, { route, params: match.params }) : undefined));
|
|
101
|
+
return profile.track(route.name, routeProfile => () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, profile: routeProfile, logger }, { route, params: match.params }) : undefined));
|
|
101
102
|
}
|
|
102
103
|
};
|
|
103
104
|
};
|
|
@@ -120,11 +121,12 @@ const bindRoute = (services, appBinder, pathExtractor, matcher) => (route) => {
|
|
|
120
121
|
* lambdaMiddleware // environment specific response middleware (like cors)
|
|
121
122
|
* );
|
|
122
123
|
*/
|
|
123
|
-
const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, errorHandler }) => (services, responseMiddleware) => {
|
|
124
|
+
const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }) => (services, responseMiddleware) => {
|
|
124
125
|
const appBinderImpl = (app, middleware) => middleware(app, appBinder);
|
|
125
126
|
const appBinder = (0, helpers_1.memoize)(appBinderImpl);
|
|
126
127
|
const boundRoutes = routes().map(bindRoute(services, appBinder, pathExtractor, routeMatcher));
|
|
127
128
|
const boundResponseMiddleware = responseMiddleware ? responseMiddleware(services) : undefined;
|
|
129
|
+
const appLogger = services.logger || (0, console_1.createConsoleLogger)();
|
|
128
130
|
// *note* this opaque promise guard is less generic than i hoped so
|
|
129
131
|
// i'm leaving it here instead of the guards file.
|
|
130
132
|
//
|
|
@@ -135,14 +137,18 @@ const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, er
|
|
|
135
137
|
const isPromise = (thing) => thing instanceof Promise;
|
|
136
138
|
return (request) => {
|
|
137
139
|
const { end, ...profile } = (0, profile_1.createProfile)(new Date().toISOString()).start();
|
|
140
|
+
const logger = appLogger.createSubContext();
|
|
141
|
+
if (logExtractor) {
|
|
142
|
+
logger.setContext(logExtractor(request));
|
|
143
|
+
}
|
|
138
144
|
try {
|
|
139
|
-
const executor = (0, helpers_1.mapFind)(boundRoutes, (route) => route(request, profile));
|
|
145
|
+
const executor = (0, helpers_1.mapFind)(boundRoutes, (route) => route(request, profile, logger));
|
|
140
146
|
if (executor) {
|
|
141
147
|
const result = boundResponseMiddleware ?
|
|
142
|
-
boundResponseMiddleware(executor(), { request, profile }) : executor();
|
|
148
|
+
boundResponseMiddleware(executor(), { request, profile, logger }) : executor();
|
|
143
149
|
if (isPromise(result) && errorHandler) {
|
|
144
150
|
const errorHandlerWithMiddleware = (e) => boundResponseMiddleware ?
|
|
145
|
-
boundResponseMiddleware(errorHandler(e), { request, profile }) : errorHandler(e);
|
|
151
|
+
boundResponseMiddleware(errorHandler(e, logger), { request, profile, logger }) : errorHandler(e, logger);
|
|
146
152
|
return result.catch(errorHandlerWithMiddleware);
|
|
147
153
|
}
|
|
148
154
|
else {
|
|
@@ -150,12 +156,14 @@ const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, er
|
|
|
150
156
|
}
|
|
151
157
|
}
|
|
152
158
|
else if (boundResponseMiddleware) {
|
|
153
|
-
return boundResponseMiddleware(undefined, { request, profile });
|
|
159
|
+
return boundResponseMiddleware(undefined, { request, profile, logger });
|
|
154
160
|
}
|
|
155
161
|
}
|
|
156
162
|
catch (e) {
|
|
157
163
|
if (errorHandler && e instanceof Error) {
|
|
158
|
-
return boundResponseMiddleware
|
|
164
|
+
return boundResponseMiddleware
|
|
165
|
+
? boundResponseMiddleware(errorHandler(e, logger), { request, profile, logger })
|
|
166
|
+
: errorHandler(e, logger);
|
|
159
167
|
}
|
|
160
168
|
throw e;
|
|
161
169
|
}
|
|
@@ -75,8 +75,9 @@ const makeRouteClient = (initializer, config, route, authProvider) => {
|
|
|
75
75
|
if (!status.includes(response.status)) {
|
|
76
76
|
throw new Error('unexpected response from api');
|
|
77
77
|
}
|
|
78
|
-
return { status: response.status, load: (0, exports.loadResponse)(response) };
|
|
78
|
+
return { status: response.status, headers: response.headers, load: (0, exports.loadResponse)(response) };
|
|
79
79
|
},
|
|
80
|
+
headers: response.headers,
|
|
80
81
|
load: (0, exports.loadResponse)(response),
|
|
81
82
|
};
|
|
82
83
|
});
|
|
@@ -65,7 +65,7 @@ const browserAuthProvider = ({ window, configSpace }) => (configProvider) => {
|
|
|
65
65
|
const timeout = setTimeout(() => {
|
|
66
66
|
window.removeEventListener('message', handler);
|
|
67
67
|
reject(new Error('loading user identity timed out'));
|
|
68
|
-
},
|
|
68
|
+
}, 5000);
|
|
69
69
|
});
|
|
70
70
|
/*
|
|
71
71
|
* requests user identity from accounts api using given token or cookie
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createConsoleLogger: () => import(".").Logger;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createConsoleLogger = void 0;
|
|
4
|
+
const _1 = require(".");
|
|
5
|
+
const createConsoleLogger = () => (0, _1.createCoreLogger)((level, event) => console[level](JSON.stringify({
|
|
6
|
+
eventType: level.toUpperCase(),
|
|
7
|
+
...event,
|
|
8
|
+
})));
|
|
9
|
+
exports.createConsoleLogger = createConsoleLogger;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { JsonCompatibleStruct } from '../../routing';
|
|
2
|
+
export declare enum Level {
|
|
3
|
+
Info = "info",
|
|
4
|
+
Warn = "warn",
|
|
5
|
+
Error = "error"
|
|
6
|
+
}
|
|
7
|
+
export declare type LogEvent = (level: Level, event: JsonCompatibleStruct) => void;
|
|
8
|
+
export interface Logger {
|
|
9
|
+
setContext: (obj: JsonCompatibleStruct) => void;
|
|
10
|
+
logEvent: LogEvent;
|
|
11
|
+
log: (message: string, level?: Level) => void;
|
|
12
|
+
createSubContext: () => Logger;
|
|
13
|
+
}
|
|
14
|
+
export declare const createCoreLogger: (driver: LogEvent, getParentContext?: (() => JsonCompatibleStruct) | undefined) => Logger;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCoreLogger = exports.Level = void 0;
|
|
4
|
+
var Level;
|
|
5
|
+
(function (Level) {
|
|
6
|
+
Level["Info"] = "info";
|
|
7
|
+
Level["Warn"] = "warn";
|
|
8
|
+
Level["Error"] = "error";
|
|
9
|
+
})(Level = exports.Level || (exports.Level = {}));
|
|
10
|
+
const createCoreLogger = (driver, getParentContext) => {
|
|
11
|
+
const context = {};
|
|
12
|
+
const getContext = () => ({ ...getParentContext === null || getParentContext === void 0 ? void 0 : getParentContext(), ...context });
|
|
13
|
+
return {
|
|
14
|
+
logEvent: (level, event) => driver(level, { ...event, context: getContext() }),
|
|
15
|
+
log: (message, level = Level.Info) => driver(level, { message, context: getContext() }),
|
|
16
|
+
setContext: (obj) => { Object.assign(context, obj); },
|
|
17
|
+
createSubContext: () => (0, exports.createCoreLogger)(driver, getContext),
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.createCoreLogger = createCoreLogger;
|