@konker.dev/middleware-fp 0.0.5 → 0.0.7
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/contrib/headerSignatureAuthorizer/index.d.ts +10 -0
- package/dist/contrib/headerSignatureAuthorizer/index.js +40 -0
- package/dist/contrib/headerSignatureAuthorizer/index.js.map +1 -0
- package/dist/contrib/headerSignatureAuthorizer/index.test.d.ts +8 -0
- package/dist/contrib/headerSignatureAuthorizer/index.test.js +87 -0
- package/dist/contrib/headerSignatureAuthorizer/index.test.js.map +1 -0
- package/dist/contrib/headerSignatureAuthorizer/lib.d.ts +3 -0
- package/dist/contrib/headerSignatureAuthorizer/lib.js +33 -0
- package/dist/contrib/headerSignatureAuthorizer/lib.js.map +1 -0
- package/dist/contrib/headerSignatureAuthorizer/lib.test.d.ts +4 -0
- package/dist/contrib/headerSignatureAuthorizer/lib.test.js +51 -0
- package/dist/contrib/headerSignatureAuthorizer/lib.test.js.map +1 -0
- package/dist/contrib/index.d.ts +1 -0
- package/dist/contrib/index.js +2 -1
- package/dist/contrib/index.js.map +1 -1
- package/dist/test/unit/index.test.js +1 -1
- package/dist/test/unit/index.test.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as P from '@konker.dev/effect-ts-prelude';
|
|
2
|
+
import type { APIGatewayProxyEventV2 } from 'aws-lambda';
|
|
3
|
+
import type { Handler } from '../../index';
|
|
4
|
+
import { HttpApiError } from '../../lib/HttpApiError';
|
|
5
|
+
export type HeaderSignatureAuthorizerDeps = {
|
|
6
|
+
readonly secret: string;
|
|
7
|
+
readonly signatureHeaderName: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const HeaderSignatureAuthorizerDeps: P.Context.Tag<HeaderSignatureAuthorizerDeps, HeaderSignatureAuthorizerDeps>;
|
|
10
|
+
export declare const middleware: () => <I extends APIGatewayProxyEventV2, O, E, R>(wrapped: Handler<I, O, E, R>) => Handler<I, O, E | HttpApiError, R | HeaderSignatureAuthorizerDeps>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.middleware = exports.HeaderSignatureAuthorizerDeps = void 0;
|
|
27
|
+
const P = __importStar(require("@konker.dev/effect-ts-prelude"));
|
|
28
|
+
const HttpApiError_1 = require("../../lib/HttpApiError");
|
|
29
|
+
const lib_1 = require("./lib");
|
|
30
|
+
const TAG = 'headerSignatureAuthorizer';
|
|
31
|
+
exports.HeaderSignatureAuthorizerDeps = P.Context.GenericTag('HeaderSignatureAuthorizerDeps');
|
|
32
|
+
// --------------------------------------------------------------------------
|
|
33
|
+
const middleware = () => (wrapped) => (i) => {
|
|
34
|
+
return P.pipe(exports.HeaderSignatureAuthorizerDeps, P.Effect.tap(P.Effect.logDebug(`[${TAG}] IN`)), P.Effect.flatMap(({ secret, signatureHeaderName }) => P.Effect.if((0, lib_1.validateHeaderSignature)(i.headers[signatureHeaderName], i.body, secret), {
|
|
35
|
+
onTrue: () => P.Effect.succeed(i),
|
|
36
|
+
onFalse: () => P.Effect.fail((0, HttpApiError_1.HttpApiError)('UnauthorizedError', 'Invalid signature', 401)),
|
|
37
|
+
})), P.Effect.tapError((_) => P.Effect.logError(`UnauthorizedError: Invalid signature: ${i.body}`)), P.Effect.flatMap(wrapped), P.Effect.tap(P.Effect.logDebug(`[${TAG}] OUT`)));
|
|
38
|
+
};
|
|
39
|
+
exports.middleware = middleware;
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contrib/headerSignatureAuthorizer/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAmD;AAKnD,yDAAsD;AACtD,+BAAgD;AAEhD,MAAM,GAAG,GAAG,2BAA2B,CAAC;AAO3B,QAAA,6BAA6B,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAC/D,+BAA+B,CAChC,CAAC;AAEF,6EAA6E;AACtE,MAAM,UAAU,GACrB,GAAG,EAAE,CACL,CACE,OAA4B,EACwC,EAAE,CACxE,CAAC,CAAI,EAAE,EAAE;IACP,OAAO,CAAC,CAAC,IAAI,CACX,qCAA6B,EAC7B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,EAC9C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,CACnD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAA,6BAAuB,EAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;QACpF,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAA,2BAAY,EAAC,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;KAC1F,CAAC,CACH,EACD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAC9F,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACzB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC,CAAC;AAnBS,QAAA,UAAU,cAmBnB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as P from '@konker.dev/effect-ts-prelude';
|
|
2
|
+
import * as unit from './index';
|
|
3
|
+
export declare const CORRECT_TEST_HMAC_VALUE = "test-hmac-value";
|
|
4
|
+
export declare const INCORRECT_TEST_HMAC_VALUE = "wrong-hmac-value";
|
|
5
|
+
export declare const TEST_SIGNATURE_HEADER_NAME = "x-test-signature";
|
|
6
|
+
export declare const TEST_SECRET = "test-secret";
|
|
7
|
+
export declare const HEADER_SIGNATURE_AUTHORIZER_TEST_DEPS: unit.HeaderSignatureAuthorizerDeps;
|
|
8
|
+
export declare const mockHeaderSignatureAuthorizerDeps: <A, E, R>(self: P.Effect.Effect<A, E, R>) => P.Effect.Effect<A, E, Exclude<R, unit.HeaderSignatureAuthorizerDeps>>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.mockHeaderSignatureAuthorizerDeps = exports.HEADER_SIGNATURE_AUTHORIZER_TEST_DEPS = exports.TEST_SECRET = exports.TEST_SIGNATURE_HEADER_NAME = exports.INCORRECT_TEST_HMAC_VALUE = exports.CORRECT_TEST_HMAC_VALUE = void 0;
|
|
27
|
+
const P = __importStar(require("@konker.dev/effect-ts-prelude"));
|
|
28
|
+
const utils = __importStar(require("@konker.dev/tiny-utils-fp"));
|
|
29
|
+
const test_common_1 = require("../../test/test-common");
|
|
30
|
+
const unit = __importStar(require("./index"));
|
|
31
|
+
const index_1 = require("./index");
|
|
32
|
+
exports.CORRECT_TEST_HMAC_VALUE = 'test-hmac-value';
|
|
33
|
+
exports.INCORRECT_TEST_HMAC_VALUE = 'wrong-hmac-value';
|
|
34
|
+
exports.TEST_SIGNATURE_HEADER_NAME = 'x-test-signature';
|
|
35
|
+
exports.TEST_SECRET = 'test-secret';
|
|
36
|
+
exports.HEADER_SIGNATURE_AUTHORIZER_TEST_DEPS = unit.HeaderSignatureAuthorizerDeps.of({
|
|
37
|
+
secret: exports.TEST_SECRET,
|
|
38
|
+
signatureHeaderName: exports.TEST_SIGNATURE_HEADER_NAME,
|
|
39
|
+
});
|
|
40
|
+
exports.mockHeaderSignatureAuthorizerDeps = P.Effect.provideService(index_1.HeaderSignatureAuthorizerDeps, exports.HEADER_SIGNATURE_AUTHORIZER_TEST_DEPS);
|
|
41
|
+
const TEST_IN_1 = {
|
|
42
|
+
isBase64Encoded: false,
|
|
43
|
+
requestContext: {},
|
|
44
|
+
body: 'TEST_BODY',
|
|
45
|
+
headers: {
|
|
46
|
+
[exports.TEST_SIGNATURE_HEADER_NAME]: exports.CORRECT_TEST_HMAC_VALUE,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
const TEST_IN_2 = {
|
|
50
|
+
isBase64Encoded: false,
|
|
51
|
+
requestContext: {},
|
|
52
|
+
body: 'TEST_BODY',
|
|
53
|
+
headers: {
|
|
54
|
+
[exports.TEST_SIGNATURE_HEADER_NAME]: exports.INCORRECT_TEST_HMAC_VALUE,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
describe('middleware/header-signature-authorizer', () => {
|
|
58
|
+
let errorSpy;
|
|
59
|
+
beforeEach(() => {
|
|
60
|
+
jest.spyOn(utils, 'sha256HmacHex').mockReturnValue(P.Effect.succeed(exports.CORRECT_TEST_HMAC_VALUE));
|
|
61
|
+
jest.spyOn(P.Effect, 'logDebug').mockReturnValue(P.Effect.succeed(undefined));
|
|
62
|
+
errorSpy = jest.spyOn(P.Effect, 'logError').mockReturnValue(P.Effect.succeed(undefined));
|
|
63
|
+
});
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
jest.restoreAllMocks();
|
|
66
|
+
});
|
|
67
|
+
test('it should work as expected in an success case', async () => {
|
|
68
|
+
const egHandler = P.pipe(test_common_1.http200CoreIn, unit.middleware());
|
|
69
|
+
const result = await P.pipe(egHandler(TEST_IN_1), exports.mockHeaderSignatureAuthorizerDeps, P.Effect.runPromise);
|
|
70
|
+
expect(result).toStrictEqual({
|
|
71
|
+
statusCode: 200,
|
|
72
|
+
headers: {
|
|
73
|
+
QUX: 'qux_value',
|
|
74
|
+
},
|
|
75
|
+
body: JSON.stringify({ result: 'OK' }),
|
|
76
|
+
isBase64Encoded: false,
|
|
77
|
+
});
|
|
78
|
+
expect(errorSpy).toHaveBeenCalledTimes(0);
|
|
79
|
+
});
|
|
80
|
+
test('it should work as expected in an error case', async () => {
|
|
81
|
+
const egHandler = P.pipe(test_common_1.http200CoreIn, unit.middleware());
|
|
82
|
+
const result = P.pipe(egHandler(TEST_IN_2), exports.mockHeaderSignatureAuthorizerDeps, P.Effect.runPromise);
|
|
83
|
+
await expect(() => result).rejects.toThrow('Invalid signature');
|
|
84
|
+
expect(errorSpy).toHaveBeenCalledTimes(1);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/contrib/headerSignatureAuthorizer/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.validateHeaderSignature = validateHeaderSignature;
|
|
27
|
+
const P = __importStar(require("@konker.dev/effect-ts-prelude"));
|
|
28
|
+
const tiny_utils_fp_1 = require("@konker.dev/tiny-utils-fp");
|
|
29
|
+
const HttpApiError_1 = require("../../lib/HttpApiError");
|
|
30
|
+
function validateHeaderSignature(signature, requestRawBody, secret) {
|
|
31
|
+
return P.pipe((0, tiny_utils_fp_1.sha256HmacHex)(String(requestRawBody), secret), P.Effect.flatMap((calculatedHmac) => P.Effect.succeed(calculatedHmac === signature)), P.Effect.mapError(HttpApiError_1.toHttpApiError));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/contrib/headerSignatureAuthorizer/lib.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAOA,0DAUC;AAjBD,iEAAmD;AAEnD,6DAA0D;AAG1D,yDAAwD;AAExD,SAAgB,uBAAuB,CACrC,SAAiB,EACjB,cAAuB,EACvB,MAAc;IAEd,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,6BAAa,EAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,EAC7C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,EACpF,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAAc,CAAC,CAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.TEST_SECRET = exports.TEST_BODY = exports.INCORRECT_TEST_HMAC_VALUE = exports.CORRECT_TEST_HMAC_VALUE = void 0;
|
|
27
|
+
const P = __importStar(require("@konker.dev/effect-ts-prelude"));
|
|
28
|
+
const utils = __importStar(require("@konker.dev/tiny-utils-fp"));
|
|
29
|
+
const unit = __importStar(require("./lib"));
|
|
30
|
+
exports.CORRECT_TEST_HMAC_VALUE = 'test-hmac-value';
|
|
31
|
+
exports.INCORRECT_TEST_HMAC_VALUE = 'wrong-hmac-value';
|
|
32
|
+
exports.TEST_BODY = 'test-body';
|
|
33
|
+
exports.TEST_SECRET = 'test-secret';
|
|
34
|
+
describe('middleware/header-signature-authorizer/lib', () => {
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
jest.spyOn(utils, 'sha256HmacHex').mockReturnValue(P.Effect.succeed(exports.CORRECT_TEST_HMAC_VALUE));
|
|
37
|
+
jest.spyOn(P.Effect, 'logDebug').mockReturnValue(P.Effect.succeed(undefined));
|
|
38
|
+
});
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
jest.restoreAllMocks();
|
|
41
|
+
});
|
|
42
|
+
test('it should work as expected in an success case', async () => {
|
|
43
|
+
const result = await P.pipe(unit.validateHeaderSignature(exports.CORRECT_TEST_HMAC_VALUE, exports.TEST_BODY, exports.TEST_SECRET), P.Effect.runPromise);
|
|
44
|
+
expect(result).toStrictEqual(true);
|
|
45
|
+
});
|
|
46
|
+
test('it should work as expected in an error case', async () => {
|
|
47
|
+
const result = await P.pipe(unit.validateHeaderSignature(exports.INCORRECT_TEST_HMAC_VALUE, exports.TEST_BODY, exports.TEST_SECRET), P.Effect.runPromise);
|
|
48
|
+
expect(result).toStrictEqual(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=lib.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.test.js","sourceRoot":"","sources":["../../../src/contrib/headerSignatureAuthorizer/lib.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAmD;AAEnD,iEAAmD;AAEnD,4CAA8B;AAEjB,QAAA,uBAAuB,GAAG,iBAAiB,CAAC;AAC5C,QAAA,yBAAyB,GAAG,kBAAkB,CAAC;AAC/C,QAAA,SAAS,GAAG,WAAW,CAAC;AACxB,QAAA,WAAW,GAAG,aAAa,CAAC;AAEzC,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,+BAAuB,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CACzB,IAAI,CAAC,uBAAuB,CAAC,+BAAuB,EAAE,iBAAS,EAAE,mBAAW,CAAC,EAC7E,CAAC,CAAC,MAAM,CAAC,UAAU,CACpB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CACzB,IAAI,CAAC,uBAAuB,CAAC,iCAAyB,EAAE,iBAAS,EAAE,mBAAW,CAAC,EAC/E,CAAC,CAAC,MAAM,CAAC,UAAU,CACpB,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/contrib/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * as cacheInMemory from './cacheInMemory';
|
|
|
6
6
|
export * as cacheMomento from './cacheMomento';
|
|
7
7
|
export * as dynamodbDocClientInit from './dynamodbDocClientInit';
|
|
8
8
|
export * as envValidator from './envValidator';
|
|
9
|
+
export * as headerSignatureAuthorizer from './headerSignatureAuthorizer';
|
|
9
10
|
export * as headersNormalizer from './headersNormalizer';
|
|
10
11
|
export * as headersValidator from './headersValidator';
|
|
11
12
|
export * as helmetJsHeaders from './helmetJsHeaders';
|
package/dist/contrib/index.js
CHANGED
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.trivial = exports.requestResponseLogger = exports.queryStringValidator = exports.pathTokenAuthorizer = exports.pathParametersValidator = exports.momentoClientInit = exports.jsonBodyParser = exports.identity = exports.helmetJsHeaders = exports.headersValidator = exports.headersNormalizer = exports.envValidator = exports.dynamodbDocClientInit = exports.cacheMomento = exports.cacheInMemory = exports.bodyValidator = exports.base64BodyDecoder = exports.awsAuthorizerProcessor = exports.awsApiGatewayProcessor = void 0;
|
|
26
|
+
exports.trivial = exports.requestResponseLogger = exports.queryStringValidator = exports.pathTokenAuthorizer = exports.pathParametersValidator = exports.momentoClientInit = exports.jsonBodyParser = exports.identity = exports.helmetJsHeaders = exports.headersValidator = exports.headersNormalizer = exports.headerSignatureAuthorizer = exports.envValidator = exports.dynamodbDocClientInit = exports.cacheMomento = exports.cacheInMemory = exports.bodyValidator = exports.base64BodyDecoder = exports.awsAuthorizerProcessor = exports.awsApiGatewayProcessor = void 0;
|
|
27
27
|
exports.awsApiGatewayProcessor = __importStar(require("./awsApiGatewayProcessor"));
|
|
28
28
|
exports.awsAuthorizerProcessor = __importStar(require("./awsAuthorizerProcessor"));
|
|
29
29
|
exports.base64BodyDecoder = __importStar(require("./base64BodyDecoder"));
|
|
@@ -32,6 +32,7 @@ exports.cacheInMemory = __importStar(require("./cacheInMemory"));
|
|
|
32
32
|
exports.cacheMomento = __importStar(require("./cacheMomento"));
|
|
33
33
|
exports.dynamodbDocClientInit = __importStar(require("./dynamodbDocClientInit"));
|
|
34
34
|
exports.envValidator = __importStar(require("./envValidator"));
|
|
35
|
+
exports.headerSignatureAuthorizer = __importStar(require("./headerSignatureAuthorizer"));
|
|
35
36
|
exports.headersNormalizer = __importStar(require("./headersNormalizer"));
|
|
36
37
|
exports.headersValidator = __importStar(require("./headersValidator"));
|
|
37
38
|
exports.helmetJsHeaders = __importStar(require("./helmetJsHeaders"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contrib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mFAAmE;AACnE,mFAAmE;AACnE,yEAAyD;AACzD,iEAAiD;AACjD,iEAAiD;AACjD,+DAA+C;AAC/C,iFAAiE;AACjE,+DAA+C;AAC/C,yEAAyD;AACzD,uEAAuD;AACvD,qEAAqD;AACrD,uDAAuC;AACvC,mEAAmD;AACnD,yEAAyD;AACzD,qFAAqE;AACrE,6EAA6D;AAC7D,+EAA+D;AAC/D,iFAAiE;AACjE,qDAAqC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contrib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mFAAmE;AACnE,mFAAmE;AACnE,yEAAyD;AACzD,iEAAiD;AACjD,iEAAiD;AACjD,+DAA+C;AAC/C,iFAAiE;AACjE,+DAA+C;AAC/C,yFAAyE;AACzE,yEAAyD;AACzD,uEAAuD;AACvD,qEAAqD;AACrD,uDAAuC;AACvC,mEAAmD;AACnD,yEAAyD;AACzD,qFAAqE;AACrE,6EAA6D;AAC7D,+EAA+D;AAC/D,iFAAiE;AACjE,qDAAqC"}
|
|
@@ -100,7 +100,7 @@ describe('unit tests', () => {
|
|
|
100
100
|
isBase64Encoded: false,
|
|
101
101
|
// stageVariables?: {},
|
|
102
102
|
});
|
|
103
|
-
await expect(P.Effect.runPromise(P.pipe(actual1, aws_client_effect_dynamodb_1.
|
|
103
|
+
await expect(P.Effect.runPromise(P.pipe(actual1, aws_client_effect_dynamodb_1.defaultDynamoDBDocumentClientFactoryDeps, (0, test_1.mockMomentoClientFactoryDeps)(__cache), index_test_1.mockPathTokenAuthorizerDeps))).resolves.toStrictEqual({
|
|
104
104
|
statusCode: 200,
|
|
105
105
|
headers: {
|
|
106
106
|
'Content-Type': 'application/json; charset=UTF-8',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/test/unit/index.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAAyD;AACzD,iEAAmD;AAGnD,
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/test/unit/index.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@konker.dev/middleware-fp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"author": "Konrad Markus <mail@konker.dev>",
|
|
5
5
|
"description": "Type safe middleware system based on Effect-ts",
|
|
6
6
|
"license": "ISC",
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"effect-ts"
|
|
21
21
|
],
|
|
22
22
|
"peerDependencies": {
|
|
23
|
-
"@gomomento/sdk": "^1.95.0",
|
|
24
23
|
"@aws-sdk/client-dynamodb": "^3.635.0",
|
|
25
|
-
"@
|
|
24
|
+
"@gomomento/sdk": "^1.95.0",
|
|
25
|
+
"@konker.dev/aws-client-effect-dynamodb": "^0.0.5",
|
|
26
26
|
"@konker.dev/momento-cache-client-effect": "^0.0.7",
|
|
27
27
|
"@konker.dev/tiny-auth-utils-fp": "^0.0.2",
|
|
28
28
|
"aws-lambda": "^1.0.7"
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"@konker.dev/effect-ts-prelude": "^0.0.16",
|
|
33
33
|
"@konker.dev/tiny-cache-fp": "^0.0.5",
|
|
34
34
|
"@konker.dev/tiny-error-fp": "^0.0.7",
|
|
35
|
+
"@konker.dev/tiny-utils-fp": "^0.0.1",
|
|
35
36
|
"effect": "^3.5.6",
|
|
36
37
|
"lesslog": "^0.2.7"
|
|
37
38
|
},
|