@spytecgps/lambda-utils 1.0.0-rc3 → 1.0.0-rc6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export * from './errors';
3
3
  export * from './validation';
4
4
  export * from './types';
5
5
  export * from './middleware';
6
+ export * from './logger/logger';
package/dist/index.js CHANGED
@@ -15,3 +15,4 @@ __exportStar(require("./errors"), exports);
15
15
  __exportStar(require("./validation"), exports);
16
16
  __exportStar(require("./types"), exports);
17
17
  __exportStar(require("./middleware"), exports);
18
+ __exportStar(require("./logger/logger"), exports);
@@ -0,0 +1,4 @@
1
+ export declare const isLocal: () => boolean;
2
+ export declare const isTest: () => boolean;
3
+ declare const logger: import("winston").Logger;
4
+ export default logger;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTest = exports.isLocal = void 0;
4
+ var winston_1 = require("winston");
5
+ var winston_console_format_1 = require("winston-console-format");
6
+ var combine = winston_1.format.combine, errors = winston_1.format.errors, json = winston_1.format.json, timestamp = winston_1.format.timestamp, colorize = winston_1.format.colorize, padLevels = winston_1.format.padLevels;
7
+ exports.isLocal = function () { return !!process.env.IS_OFFLINE; };
8
+ exports.isTest = function () { return process.env.NODE_ENV == 'test'; };
9
+ var replaceError = function (_a) {
10
+ var label = _a.label, level = _a.level, message = _a.message, stack = _a.stack;
11
+ return ({
12
+ label: label,
13
+ level: level,
14
+ message: message,
15
+ stack: stack,
16
+ });
17
+ };
18
+ var replacer = function (_key, value) {
19
+ // @ts-ignore
20
+ return value instanceof Error ? replaceError(value) : value;
21
+ };
22
+ function getDevFormat() {
23
+ return combine(timestamp(), colorize({ all: true }), padLevels(), winston_console_format_1.consoleFormat({
24
+ showMeta: true,
25
+ metaStrip: [
26
+ 'timestamp',
27
+ 'service',
28
+ 'requestId',
29
+ 'x-correlation-id',
30
+ 'function',
31
+ 'contextUserId',
32
+ 'contextUserEmail',
33
+ ],
34
+ inspectOptions: {
35
+ depth: Infinity,
36
+ colors: true,
37
+ maxArrayLength: Infinity,
38
+ breakLength: 120,
39
+ compact: Infinity,
40
+ },
41
+ }));
42
+ }
43
+ function getProductionFormat() {
44
+ return combine(errors({ stack: true }), timestamp(), json({ replacer: replacer }));
45
+ }
46
+ function getFormat() {
47
+ if (exports.isTest() || exports.isLocal()) {
48
+ return getDevFormat();
49
+ }
50
+ return getProductionFormat();
51
+ }
52
+ var logger = winston_1.createLogger({
53
+ level: exports.isTest() || exports.isLocal() ? 'info' : 'verbose',
54
+ defaultMeta: {},
55
+ format: getFormat(),
56
+ transports: [new winston_1.transports.Console()],
57
+ });
58
+ exports.default = logger;
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Adapted from https://github.com/FormidableLabs/pino-lambda/blob/master/src/request.ts
3
+ */
1
4
  export declare const contextualLogger: () => {
2
5
  before: ({ event, context }: {
3
6
  event: any;
@@ -35,15 +35,50 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
38
41
  Object.defineProperty(exports, "__esModule", { value: true });
39
42
  exports.contextualLoggerMiddleware = exports.contextualLogger = void 0;
40
- var sdk_1 = require("@spytecgps/sdk");
43
+ var logger_1 = __importDefault(require("../logger/logger"));
44
+ var AMAZON_TRACE_ID = '_X_AMZN_TRACE_ID';
45
+ var CORRELATION_HEADER = 'x-correlation-';
46
+ var CORRELATION_ID = CORRELATION_HEADER + "id";
47
+ var CORRELATION_TRACE_ID = CORRELATION_HEADER + "trace-id";
48
+ /**
49
+ * Adapted from https://github.com/FormidableLabs/pino-lambda/blob/master/src/request.ts
50
+ */
41
51
  exports.contextualLogger = function () {
52
+ var ctx = logger_1.default.defaultMeta;
42
53
  var before = function (_a) {
43
54
  var event = _a.event, context = _a.context;
44
55
  return __awaiter(void 0, void 0, void 0, function () {
45
- return __generator(this, function (_b) {
46
- sdk_1.logger.withRequest(event, context);
56
+ var apiEvent_1;
57
+ var _b, _c, _d, _e, _f, _g, _h;
58
+ return __generator(this, function (_j) {
59
+ if (context) {
60
+ ctx.requestId = context === null || context === void 0 ? void 0 : context.awsRequestId;
61
+ ctx.function = context.functionName;
62
+ }
63
+ if (!ctx.requestId) {
64
+ ctx.requestId = (_b = event === null || event === void 0 ? void 0 : event.requestContext) === null || _b === void 0 ? void 0 : _b.requestId;
65
+ }
66
+ if (Object(event).hasOwnProperty('headers')) {
67
+ apiEvent_1 = event;
68
+ Object.keys(apiEvent_1).forEach(function (header) {
69
+ if (header.toLowerCase().startsWith(CORRELATION_HEADER)) {
70
+ ctx[header] = apiEvent_1[header];
71
+ }
72
+ });
73
+ }
74
+ if (process.env[AMAZON_TRACE_ID]) {
75
+ ctx[CORRELATION_TRACE_ID] = process.env[AMAZON_TRACE_ID];
76
+ }
77
+ if (!ctx[CORRELATION_ID]) {
78
+ ctx[CORRELATION_ID] = context === null || context === void 0 ? void 0 : context.awsRequestId;
79
+ }
80
+ ctx.contextUserId = (_e = (_d = (_c = event === null || event === void 0 ? void 0 : event.requestContext) === null || _c === void 0 ? void 0 : _c.authorizer) === null || _d === void 0 ? void 0 : _d.claims) === null || _e === void 0 ? void 0 : _e.userId;
81
+ ctx.contextUserEmail = (_h = (_g = (_f = event === null || event === void 0 ? void 0 : event.requestContext) === null || _f === void 0 ? void 0 : _f.authorizer) === null || _g === void 0 ? void 0 : _g.claims) === null || _h === void 0 ? void 0 : _h.email;
47
82
  return [2 /*return*/];
48
83
  });
49
84
  });
@@ -4,7 +4,9 @@ import httpResponseSerializer from '@middy/http-response-serializer';
4
4
  import { validatorMiddleware } from './validation';
5
5
  import { Context as LambdaContext } from 'aws-lambda/handler';
6
6
  import { MiddyInputHandler } from './types';
7
- declare const apiGatewayMiddlewares: rawMiddy.MiddlewareObj<any, any, Error, LambdaContext>[];
7
+ declare const apiGatewayMiddlewares: (rawMiddy.MiddlewareObj<any, any, Error, LambdaContext> | {
8
+ after: (req: any) => void;
9
+ })[];
8
10
  declare const middy: <TEvent, TResult, TContext extends LambdaContext>(handler: MiddyInputHandler<TEvent, TResult, TContext>) => rawMiddy.MiddyfiedHandler<TEvent, TResult, Error, TContext>;
9
11
  declare const apiGatewayMiddy: <TEvent, TResult, TContext extends LambdaContext>(handler: MiddyInputHandler<TEvent, TResult, TContext>) => rawMiddy.MiddyfiedHandler<TEvent, TResult, Error, TContext>;
10
12
  export { middy, apiGatewayMiddy, httpErrorHandler, httpResponseSerializer, validatorMiddleware, apiGatewayMiddlewares };
@@ -20,7 +20,8 @@ var contextualLogger_1 = require("./contextualLogger");
20
20
  var ioLogger_1 = require("./ioLogger");
21
21
  var validation_1 = require("./validation");
22
22
  Object.defineProperty(exports, "validatorMiddleware", { enumerable: true, get: function () { return validation_1.validatorMiddleware; } });
23
- var sdk_1 = require("@spytecgps/sdk");
23
+ var responseWrapper_1 = require("./responseWrapper");
24
+ var logger_1 = __importDefault(require("../logger/logger"));
24
25
  var baseMiddlewares = [contextualLogger_1.contextualLoggerMiddleware, ioLogger_1.ioLoggerMiddleware];
25
26
  var apiGatewayMiddlewares = [
26
27
  http_response_serializer_1.default({
@@ -50,8 +51,9 @@ var apiGatewayMiddlewares = [
50
51
  default: 'application/json',
51
52
  }),
52
53
  http_error_handler_1.default({
53
- logger: function (error) { return sdk_1.logger.error(error); },
54
+ logger: function (error) { return logger_1.default.error(error); },
54
55
  }),
56
+ responseWrapper_1.responseWrapperMiddleware(),
55
57
  ];
56
58
  exports.apiGatewayMiddlewares = apiGatewayMiddlewares;
57
59
  var middy = function (handler) { return core_1.default(handler).use(__spreadArrays(baseMiddlewares)); };
@@ -5,10 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ioLoggerMiddleware = void 0;
7
7
  var input_output_logger_1 = __importDefault(require("@middy/input-output-logger"));
8
- var sdk_1 = require("@spytecgps/sdk");
8
+ var logger_1 = __importDefault(require("../logger/logger"));
9
9
  exports.ioLoggerMiddleware = input_output_logger_1.default({
10
10
  logger: function (req) {
11
11
  var message = (req === null || req === void 0 ? void 0 : req.event) ? 'event' : 'response';
12
- sdk_1.logger.info(req, message);
12
+ logger_1.default.info(message, req);
13
13
  },
14
14
  });
@@ -43,6 +43,7 @@ var index_1 = require("./index");
43
43
  var joi_1 = __importDefault(require("joi"));
44
44
  var validation_1 = require("./validation");
45
45
  var errors_1 = require("../errors");
46
+ var responseWrapper_1 = require("./responseWrapper");
46
47
  // eslint-disable-next-line @typescript-eslint/no-var-requires
47
48
  var webEvent = require('./mocks/webEvent.json');
48
49
  var context = {};
@@ -118,4 +119,49 @@ describe('Middleware', function () {
118
119
  });
119
120
  }); });
120
121
  });
122
+ describe('responseWrapperMiddleware', function () {
123
+ var handler = function (_event) { return __awaiter(void 0, void 0, void 0, function () {
124
+ return __generator(this, function (_a) {
125
+ console.log('ok done');
126
+ return [2 /*return*/, {
127
+ data: {
128
+ abc: 123,
129
+ },
130
+ }];
131
+ });
132
+ }); };
133
+ var middifiedHandler = index_1.apiGatewayMiddy(handler).use(responseWrapper_1.responseWrapperMiddleware());
134
+ it('should work', function () { return __awaiter(void 0, void 0, void 0, function () {
135
+ var result;
136
+ return __generator(this, function (_a) {
137
+ switch (_a.label) {
138
+ case 0: return [4 /*yield*/, middifiedHandler(webEvent, context, callback)];
139
+ case 1:
140
+ result = _a.sent();
141
+ console.log(result);
142
+ return [2 /*return*/];
143
+ }
144
+ });
145
+ }); });
146
+ });
147
+ describe('responseWrapperMiddleware error', function () {
148
+ var handler = function (_event) { return __awaiter(void 0, void 0, void 0, function () {
149
+ return __generator(this, function (_a) {
150
+ throw new errors_1.NotFoundError();
151
+ });
152
+ }); };
153
+ var middifiedHandler = index_1.apiGatewayMiddy(handler).use(responseWrapper_1.responseWrapperMiddleware());
154
+ it('should work', function () { return __awaiter(void 0, void 0, void 0, function () {
155
+ var result;
156
+ return __generator(this, function (_a) {
157
+ switch (_a.label) {
158
+ case 0: return [4 /*yield*/, middifiedHandler(webEvent, context, callback)];
159
+ case 1:
160
+ result = _a.sent();
161
+ console.log(result);
162
+ return [2 /*return*/];
163
+ }
164
+ });
165
+ }); });
166
+ });
121
167
  });
@@ -0,0 +1,3 @@
1
+ export declare const responseWrapperMiddleware: () => {
2
+ after: (req: any) => void;
3
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.responseWrapperMiddleware = void 0;
4
+ var wrappers_1 = require("../wrappers");
5
+ exports.responseWrapperMiddleware = function () {
6
+ var responseWrapperMiddlewareAfter = function (req) {
7
+ req.response = wrappers_1.buildProxyResult(req.response);
8
+ };
9
+ return {
10
+ after: responseWrapperMiddlewareAfter,
11
+ };
12
+ };
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.validatorMiddleware = void 0;
4
- var sdk_1 = require("@spytecgps/sdk");
5
7
  var errors_1 = require("../errors");
8
+ var logger_1 = __importDefault(require("../logger/logger"));
6
9
  exports.validatorMiddleware = function (_a) {
7
10
  var schema = _a.schema, _b = _a.allowUnknown, allowUnknown = _b === void 0 ? true : _b;
8
11
  var validatorMiddlewareBefore = function (request) {
@@ -16,7 +19,7 @@ exports.validatorMiddleware = function (_a) {
16
19
  },
17
20
  }), error = _a.error, value = _a.value;
18
21
  if (error) {
19
- sdk_1.logger.error({ error: error }, 'Validation error');
22
+ logger_1.default.error('Validation error', { error: error });
20
23
  throw error.isJoi ? new errors_1.BadRequestError(error.message) : error;
21
24
  }
22
25
  request.event = value;
package/dist/types.d.ts CHANGED
@@ -7,10 +7,12 @@ export interface SpytecAuthorizedResources {
7
7
  devices: string[];
8
8
  }
9
9
  export declare type AuthClass = 'user' | 'client' | 'system';
10
+ export declare type DevicesAccess = 'full' | 'limited';
10
11
  export interface SpytecAuthContext {
11
12
  type: AuthClass;
12
13
  userId?: string;
13
14
  clientId: number;
15
+ devicesAccess: DevicesAccess;
14
16
  resources: SpytecAuthorizedResources;
15
17
  principalId: string;
16
18
  scope?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spytecgps/lambda-utils",
3
- "version": "1.0.0-rc3",
3
+ "version": "1.0.0-rc6",
4
4
  "description": "Lambda Utils",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -32,9 +32,12 @@
32
32
  "@middy/input-output-logger": "^2.5.7",
33
33
  "@spytecgps/sdk": "0.5.34",
34
34
  "joi": "^17.4.0",
35
+ "logform": "^2.4.0",
35
36
  "moment": "2.29.1",
36
37
  "moment-timezone": "0.5.33",
37
- "qs": "^6.10.1"
38
+ "qs": "^6.10.1",
39
+ "winston": "^3.7.2",
40
+ "winston-console-format": "^1.0.8"
38
41
  },
39
42
  "devDependencies": {
40
43
  "@types/aws-lambda": "^8.10.76",