@whook/gcp-functions 9.0.1 → 10.0.0

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.
Files changed (39) hide show
  1. package/README.md +8 -9
  2. package/dist/commands/testHTTPFunction.d.ts +1 -1
  3. package/dist/commands/testHTTPFunction.js +119 -150
  4. package/dist/commands/testHTTPFunction.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.js +182 -269
  7. package/dist/index.js.map +1 -1
  8. package/dist/libs/utils.js +16 -35
  9. package/dist/libs/utils.js.map +1 -1
  10. package/dist/services/_autoload.d.ts +3 -3
  11. package/dist/services/_autoload.js +83 -109
  12. package/dist/services/_autoload.js.map +1 -1
  13. package/dist/services/log.js +2 -12
  14. package/dist/services/log.js.map +1 -1
  15. package/dist/services/log.test.js +4 -9
  16. package/dist/services/log.test.js.map +1 -1
  17. package/dist/wrappers/googleHTTPFunction.js +246 -294
  18. package/dist/wrappers/googleHTTPFunction.js.map +1 -1
  19. package/package.json +47 -89
  20. package/src/commands/testHTTPFunction.ts +6 -13
  21. package/src/index.ts +36 -54
  22. package/src/libs/utils.ts +3 -4
  23. package/src/services/_autoload.ts +4 -3
  24. package/src/services/log.test.ts +1 -1
  25. package/src/wrappers/googleHTTPFunction.ts +6 -6
  26. package/dist/commands/testHTTPFunction.mjs +0 -136
  27. package/dist/commands/testHTTPFunction.mjs.map +0 -1
  28. package/dist/index.mjs +0 -265
  29. package/dist/index.mjs.map +0 -1
  30. package/dist/libs/utils.mjs +0 -27
  31. package/dist/libs/utils.mjs.map +0 -1
  32. package/dist/services/_autoload.mjs +0 -113
  33. package/dist/services/_autoload.mjs.map +0 -1
  34. package/dist/services/log.mjs +0 -4
  35. package/dist/services/log.mjs.map +0 -1
  36. package/dist/services/log.test.mjs +0 -7
  37. package/dist/services/log.test.mjs.map +0 -1
  38. package/dist/wrappers/googleHTTPFunction.mjs +0 -290
  39. package/dist/wrappers/googleHTTPFunction.mjs.map +0 -1
@@ -1,7 +0,0 @@
1
- import initLogService from './log';
2
- describe('initLogService', () => {
3
- it('should work', async () => {
4
- await initLogService({});
5
- });
6
- });
7
- //# sourceMappingURL=log.test.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log.test.mjs","names":["initLogService","describe","it"],"sources":["../../src/services/log.test.ts"],"sourcesContent":["import initLogService from './log';\n\ndescribe('initLogService', () => {\n it('should work', async () => {\n await initLogService({});\n });\n});\n"],"mappings":"AAAA,OAAOA,cAAP,MAA2B,OAA3B;AAEAC,QAAQ,CAAC,gBAAD,EAAmB,MAAM;EAC/BC,EAAE,CAAC,aAAD,EAAgB,YAAY;IAC5B,MAAMF,cAAc,CAAC,EAAD,CAApB;EACD,CAFC,CAAF;AAGD,CAJO,CAAR"}
@@ -1,290 +0,0 @@
1
- const _excluded = ["OPERATION_API", "WRAPPERS", "NODE_ENV", "DEBUG_NODE_ENVS", "DECODERS", "ENCODERS", "log", "time"];
2
-
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
-
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
-
7
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
-
9
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
10
-
11
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
12
-
13
- import { DEFAULT_DEBUG_NODE_ENVS, DEFAULT_BUFFER_LIMIT, DEFAULT_PARSERS, DEFAULT_STRINGIFYERS, DEFAULT_DECODERS, DEFAULT_ENCODERS, extractOperationSecurityParameters, castParameters } from '@whook/http-router';
14
- import { reuseSpecialProps, alsoInject } from 'knifecycle';
15
- import Ajv from 'ajv';
16
- import addAJVFormats from 'ajv-formats';
17
- import bytes from 'bytes';
18
- import HTTPError from 'yhttperror';
19
- import { prepareParametersValidators, prepareBodyValidator, applyValidators, filterHeaders, extractBodySpec, extractResponseSpec, checkResponseCharset, checkResponseMediaType, executeHandler, extractProduceableMediaTypes, extractConsumableMediaTypes, getBody, sendBody } from '@whook/http-router';
20
- import { noop, compose, identity, lowerCaseHeaders } from '@whook/whook';
21
- import stream from 'stream';
22
- const SEARCH_SEPARATOR = '?';
23
- const PATH_SEPARATOR = '/';
24
- export default function wrapHandlerForAWSHTTPFunction(initHandler) {
25
- return alsoInject(['OPERATION_API', 'WRAPPERS', '?DEBUG_NODE_ENVS', 'NODE_ENV', '?DECODERS', '?ENCODERS', '?PARSERS', '?STRINGIFYERS', '?BUFFER_LIMIT', 'QUERY_PARSER', 'obfuscator', '?log', '?time'], reuseSpecialProps(initHandler, initHandlerForAWSHTTPFunction.bind(null, initHandler)));
26
- }
27
-
28
- async function initHandlerForAWSHTTPFunction(initHandler, _ref) {
29
- let {
30
- OPERATION_API,
31
- WRAPPERS,
32
- NODE_ENV,
33
- DEBUG_NODE_ENVS = DEFAULT_DEBUG_NODE_ENVS,
34
- DECODERS = DEFAULT_DECODERS,
35
- ENCODERS = DEFAULT_ENCODERS,
36
- log = noop,
37
- time = Date.now.bind(Date)
38
- } = _ref,
39
- services = _objectWithoutProperties(_ref, _excluded);
40
-
41
- const path = Object.keys(OPERATION_API.paths)[0];
42
- const method = Object.keys(OPERATION_API.paths[path])[0];
43
-
44
- const OPERATION = _objectSpread({
45
- path,
46
- method
47
- }, OPERATION_API.paths[path][method]);
48
-
49
- const consumableCharsets = Object.keys(DECODERS);
50
- const produceableCharsets = Object.keys(ENCODERS);
51
- const consumableMediaTypes = extractConsumableMediaTypes(OPERATION);
52
- const produceableMediaTypes = extractProduceableMediaTypes(OPERATION);
53
- const ajv = new Ajv({
54
- verbose: DEBUG_NODE_ENVS.includes(NODE_ENV),
55
- strict: true,
56
- logger: {
57
- log: (...args) => log === null || log === void 0 ? void 0 : log('debug', ...args),
58
- warn: (...args) => log === null || log === void 0 ? void 0 : log('warning', ...args),
59
- error: (...args) => log === null || log === void 0 ? void 0 : log('error', ...args)
60
- },
61
- useDefaults: true,
62
- coerceTypes: true
63
- });
64
- addAJVFormats(ajv);
65
- const ammendedParameters = extractOperationSecurityParameters(OPERATION_API, OPERATION);
66
- const validators = prepareParametersValidators(ajv, OPERATION.operationId, (OPERATION.parameters || []).concat(ammendedParameters));
67
- const bodyValidator = prepareBodyValidator(ajv, OPERATION);
68
- const applyWrappers = compose(...WRAPPERS);
69
- const handler = await applyWrappers(initHandler)(_objectSpread(_objectSpread({
70
- OPERATION,
71
- DEBUG_NODE_ENVS,
72
- NODE_ENV
73
- }, services), {}, {
74
- time,
75
- log
76
- }));
77
- return handleForAWSHTTPFunction.bind(null, _objectSpread({
78
- OPERATION,
79
- NODE_ENV,
80
- DEBUG_NODE_ENVS,
81
- DECODERS,
82
- ENCODERS,
83
- log,
84
- time
85
- }, services), {
86
- consumableMediaTypes,
87
- produceableMediaTypes,
88
- consumableCharsets,
89
- produceableCharsets,
90
- validators,
91
- bodyValidator,
92
- ammendedParameters
93
- }, handler);
94
- }
95
-
96
- async function handleForAWSHTTPFunction({
97
- OPERATION,
98
- DEBUG_NODE_ENVS,
99
- NODE_ENV,
100
- ENCODERS,
101
- DECODERS,
102
- PARSERS = DEFAULT_PARSERS,
103
- STRINGIFYERS = DEFAULT_STRINGIFYERS,
104
- BUFFER_LIMIT = DEFAULT_BUFFER_LIMIT,
105
- QUERY_PARSER,
106
- CORS,
107
- log,
108
- obfuscator
109
- }, {
110
- consumableMediaTypes,
111
- produceableMediaTypes,
112
- consumableCharsets,
113
- produceableCharsets,
114
- validators,
115
- bodyValidator
116
- }, handler, req, res) {
117
- const debugging = (DEBUG_NODE_ENVS || []).includes(NODE_ENV);
118
- const bufferLimit = bytes.parse(BUFFER_LIMIT);
119
- log === null || log === void 0 ? void 0 : log('info', 'GCP_FUNCTIONS_REQUEST', JSON.stringify({
120
- url: req.originalUrl,
121
- method: req.method,
122
- body: req.body,
123
- // body: obfuscateEventBody(obfuscator, req.body),
124
- headers: obfuscator.obfuscateSensibleHeaders(req.headers)
125
- }));
126
- const request = await gcpfReqToRequest(req);
127
- let parameters;
128
- let response;
129
- let responseLog;
130
- let responseSpec;
131
- log === null || log === void 0 ? void 0 : log('debug', 'REQUEST', JSON.stringify(_objectSpread(_objectSpread({}, request), {}, {
132
- body: request.body ? 'Stream' : undefined,
133
- headers: obfuscator.obfuscateSensibleHeaders(request.headers)
134
- })));
135
-
136
- try {
137
- const operation = OPERATION;
138
- const bodySpec = extractBodySpec(request, consumableMediaTypes, consumableCharsets);
139
- responseSpec = extractResponseSpec(operation, request, produceableMediaTypes, produceableCharsets);
140
-
141
- try {
142
- const body = await getBody({
143
- DECODERS,
144
- PARSERS,
145
- bufferLimit
146
- }, operation, request.body, bodySpec);
147
- const path = request.url.split(SEARCH_SEPARATOR)[0];
148
- const parts = path.split(PATH_SEPARATOR).filter(identity);
149
- const search = request.url.substr(request.url.split(SEARCH_SEPARATOR)[0].length);
150
- const pathParameters = OPERATION.path.split(PATH_SEPARATOR).filter(identity).map((part, index) => {
151
- const matches = /^\{([\d\w]+)\}$/i.exec(part);
152
-
153
- if (matches) {
154
- return {
155
- name: matches[1],
156
- value: parts[index]
157
- };
158
- }
159
- }).filter(identity).reduce((accParameters, {
160
- name,
161
- value
162
- }) => _objectSpread(_objectSpread({}, accParameters), {}, {
163
- [name]: value
164
- }), {}); // TODO: Update strictQS to handle OpenAPI 3
165
-
166
- const retroCompatibleQueryParameters = (OPERATION.parameters || []).filter(p => p.in === 'query').map(p => _objectSpread(_objectSpread({}, p), p.schema));
167
- parameters = _objectSpread(_objectSpread(_objectSpread({}, pathParameters), QUERY_PARSER(retroCompatibleQueryParameters, search)), filterHeaders(operation.parameters, request.headers));
168
- parameters = _objectSpread({
169
- // TODO: Use the security of the operation to infer
170
- // authorization parameters, see:
171
- // https://github.com/nfroidure/whook/blob/06ccae93d1d52d97ff70fd5e19fa826bdabf3968/packages/whook-http-router/src/validation.js#L110
172
- authorization: parameters.authorization
173
- }, castParameters(operation.parameters || [], parameters));
174
- applyValidators(operation, validators, parameters);
175
- bodyValidator(operation, bodySpec.contentType, body);
176
- parameters = _objectSpread(_objectSpread({}, parameters), 'undefined' !== typeof body ? {
177
- body
178
- } : {});
179
- } catch (err) {
180
- throw HTTPError.cast(err, 400);
181
- }
182
-
183
- response = await executeHandler(operation, handler, parameters);
184
-
185
- if (response.body) {
186
- response.headers['content-type'] = response.headers['content-type'] || responseSpec.contentTypes[0];
187
- } // Check the stringifyer only when a schema is
188
- // specified and it is not a binary one
189
-
190
-
191
- const responseObject = operation.responses && operation.responses[response.status];
192
- const responseSchema = responseObject && responseObject.content && responseObject.content[response.headers['content-type']] && responseObject.content[response.headers['content-type']].schema;
193
- const responseHasSchema = responseSchema && (responseSchema.type !== 'string' || responseSchema.format !== 'binary');
194
-
195
- if (responseHasSchema && !STRINGIFYERS[response.headers['content-type']]) {
196
- throw new HTTPError(500, 'E_STRINGIFYER_LACK', response.headers['content-type']);
197
- }
198
-
199
- if (response.body) {
200
- checkResponseMediaType(request, responseSpec, produceableMediaTypes);
201
- checkResponseCharset(request, responseSpec, produceableCharsets);
202
- }
203
-
204
- responseLog = {
205
- type: 'success',
206
- status: response.status
207
- };
208
- log === null || log === void 0 ? void 0 : log('debug', JSON.stringify(responseLog));
209
- } catch (err) {
210
- var _castedError$headers;
211
-
212
- const castedError = HTTPError.cast(err);
213
- responseLog = {
214
- type: 'error',
215
- code: castedError.code,
216
- statusCode: castedError.httpCode,
217
- params: castedError.params || [],
218
- stack: castedError.stack
219
- };
220
- log === null || log === void 0 ? void 0 : log('error', JSON.stringify(responseLog));
221
- response = {
222
- status: castedError.httpCode,
223
- headers: _objectSpread(_objectSpread(_objectSpread({}, lowerCaseHeaders(CORS)), (_castedError$headers = castedError.headers) !== null && _castedError$headers !== void 0 ? _castedError$headers : {}), {}, {
224
- 'content-type': 'application/json'
225
- }),
226
- body: {
227
- error: {
228
- code: castedError.code,
229
- stack: debugging ? responseLog.stack : undefined,
230
- params: debugging ? responseLog.params : undefined
231
- }
232
- }
233
- };
234
- }
235
-
236
- log === null || log === void 0 ? void 0 : log('debug', 'RESPONSE', JSON.stringify(_objectSpread(_objectSpread({}, response), {}, {
237
- body: obfuscateEventBody(obfuscator, response.body),
238
- headers: obfuscator.obfuscateSensibleHeaders(response.headers)
239
- })));
240
- await pipeResponseInGCPFResponse(await sendBody({
241
- ENCODERS,
242
- STRINGIFYERS
243
- }, response), res);
244
- }
245
-
246
- async function gcpfReqToRequest(req) {
247
- const request = {
248
- method: req.method.toLowerCase(),
249
- headers: lowerCaseHeaders(req.headers || {}),
250
- url: req.originalUrl
251
- };
252
-
253
- if (req.rawBody) {
254
- request.headers['content-length'] = req.rawBody.length.toString();
255
- const bodyStream = new stream.PassThrough();
256
- request.body = bodyStream;
257
- bodyStream.write(req.rawBody);
258
- bodyStream.end();
259
- }
260
-
261
- return request;
262
- }
263
-
264
- async function pipeResponseInGCPFResponse(response, res) {
265
- Object.keys(response.headers || {}).forEach(headerName => {
266
- var _response$headers;
267
-
268
- res.set(headerName, (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers[headerName]);
269
- });
270
- res.status(response.status);
271
-
272
- if (response.body) {
273
- response.body.pipe(res);
274
- return;
275
- }
276
-
277
- res.end();
278
- }
279
-
280
- function obfuscateEventBody(obfuscator, rawBody) {
281
- if (typeof rawBody === 'string') {
282
- try {
283
- const jsonBody = JSON.parse(rawBody);
284
- return JSON.stringify(obfuscator.obfuscateSensibleProps(jsonBody)); // eslint-disable-next-line
285
- } catch (err) {}
286
- }
287
-
288
- return rawBody;
289
- }
290
- //# sourceMappingURL=googleHTTPFunction.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"googleHTTPFunction.mjs","names":["DEFAULT_DEBUG_NODE_ENVS","DEFAULT_BUFFER_LIMIT","DEFAULT_PARSERS","DEFAULT_STRINGIFYERS","DEFAULT_DECODERS","DEFAULT_ENCODERS","extractOperationSecurityParameters","castParameters","reuseSpecialProps","alsoInject","Ajv","addAJVFormats","bytes","HTTPError","prepareParametersValidators","prepareBodyValidator","applyValidators","filterHeaders","extractBodySpec","extractResponseSpec","checkResponseCharset","checkResponseMediaType","executeHandler","extractProduceableMediaTypes","extractConsumableMediaTypes","getBody","sendBody","noop","compose","identity","lowerCaseHeaders","stream","SEARCH_SEPARATOR","PATH_SEPARATOR","wrapHandlerForAWSHTTPFunction","initHandler","initHandlerForAWSHTTPFunction","bind","OPERATION_API","WRAPPERS","NODE_ENV","DEBUG_NODE_ENVS","DECODERS","ENCODERS","log","time","Date","now","services","path","Object","keys","paths","method","OPERATION","consumableCharsets","produceableCharsets","consumableMediaTypes","produceableMediaTypes","ajv","verbose","includes","strict","logger","args","warn","error","useDefaults","coerceTypes","ammendedParameters","validators","operationId","parameters","concat","bodyValidator","applyWrappers","handler","handleForAWSHTTPFunction","PARSERS","STRINGIFYERS","BUFFER_LIMIT","QUERY_PARSER","CORS","obfuscator","req","res","debugging","bufferLimit","parse","JSON","stringify","url","originalUrl","body","headers","obfuscateSensibleHeaders","request","gcpfReqToRequest","response","responseLog","responseSpec","undefined","operation","bodySpec","split","parts","filter","search","substr","length","pathParameters","map","part","index","matches","exec","name","value","reduce","accParameters","retroCompatibleQueryParameters","p","in","schema","authorization","contentType","err","cast","contentTypes","responseObject","responses","status","responseSchema","content","responseHasSchema","type","format","castedError","code","statusCode","httpCode","params","stack","obfuscateEventBody","pipeResponseInGCPFResponse","toLowerCase","rawBody","toString","bodyStream","PassThrough","write","end","forEach","headerName","set","pipe","jsonBody","obfuscateSensibleProps"],"sources":["../../src/wrappers/googleHTTPFunction.ts"],"sourcesContent":["import {\n DEFAULT_DEBUG_NODE_ENVS,\n DEFAULT_BUFFER_LIMIT,\n DEFAULT_PARSERS,\n DEFAULT_STRINGIFYERS,\n DEFAULT_DECODERS,\n DEFAULT_ENCODERS,\n extractOperationSecurityParameters,\n castParameters,\n} from '@whook/http-router';\nimport { reuseSpecialProps, alsoInject } from 'knifecycle';\nimport Ajv from 'ajv';\nimport addAJVFormats from 'ajv-formats';\nimport bytes from 'bytes';\nimport HTTPError from 'yhttperror';\nimport {\n prepareParametersValidators,\n prepareBodyValidator,\n applyValidators,\n filterHeaders,\n extractBodySpec,\n extractResponseSpec,\n checkResponseCharset,\n checkResponseMediaType,\n executeHandler,\n extractProduceableMediaTypes,\n extractConsumableMediaTypes,\n getBody,\n sendBody,\n} from '@whook/http-router';\nimport { noop, compose, identity, lowerCaseHeaders } from '@whook/whook';\nimport stream from 'stream';\nimport type { WhookQueryStringParser } from '@whook/http-router';\nimport type { ServiceInitializer, Dependencies, Service } from 'knifecycle';\nimport type {\n WhookRequest,\n WhookResponse,\n WhookHandler,\n ObfuscatorService,\n WhookOperation,\n WhookWrapper,\n} from '@whook/whook';\nimport type { TimeService, LogService } from 'common-services';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport type { Readable } from 'stream';\nimport type { CORSConfig } from '@whook/cors';\n\ntype HTTPWrapperDependencies = {\n NODE_ENV: string;\n DEBUG_NODE_ENVS?: string[];\n OPERATION: WhookOperation;\n DECODERS?: typeof DEFAULT_DECODERS;\n ENCODERS?: typeof DEFAULT_ENCODERS;\n PARSERS?: typeof DEFAULT_PARSERS;\n STRINGIFYERS?: typeof DEFAULT_STRINGIFYERS;\n QUERY_PARSER: WhookQueryStringParser;\n BUFFER_LIMIT?: string;\n obfuscator: ObfuscatorService;\n time?: TimeService;\n log?: LogService;\n WRAPPERS: WhookWrapper<Dependencies, Service>[];\n};\n\nconst SEARCH_SEPARATOR = '?';\nconst PATH_SEPARATOR = '/';\n\nexport default function wrapHandlerForAWSHTTPFunction<\n D,\n S extends WhookHandler,\n>(\n initHandler: ServiceInitializer<D, S>,\n): ServiceInitializer<D & HTTPWrapperDependencies, S> {\n return alsoInject<HTTPWrapperDependencies, D, S>(\n [\n 'OPERATION_API',\n 'WRAPPERS',\n '?DEBUG_NODE_ENVS',\n 'NODE_ENV',\n '?DECODERS',\n '?ENCODERS',\n '?PARSERS',\n '?STRINGIFYERS',\n '?BUFFER_LIMIT',\n 'QUERY_PARSER',\n 'obfuscator',\n '?log',\n '?time',\n ],\n reuseSpecialProps(\n initHandler,\n (initHandlerForAWSHTTPFunction as any).bind(\n null,\n initHandler,\n ) as ServiceInitializer<D, S>,\n ),\n );\n}\n\nasync function initHandlerForAWSHTTPFunction(\n initHandler: ServiceInitializer<Dependencies<any>, WhookHandler>,\n {\n OPERATION_API,\n WRAPPERS,\n NODE_ENV,\n DEBUG_NODE_ENVS = DEFAULT_DEBUG_NODE_ENVS,\n DECODERS = DEFAULT_DECODERS,\n ENCODERS = DEFAULT_ENCODERS,\n log = noop,\n time = Date.now.bind(Date),\n ...services\n },\n) {\n const path = Object.keys(OPERATION_API.paths)[0];\n const method = Object.keys(OPERATION_API.paths[path])[0];\n const OPERATION: WhookOperation = {\n path,\n method,\n ...OPERATION_API.paths[path][method],\n };\n const consumableCharsets = Object.keys(DECODERS);\n const produceableCharsets = Object.keys(ENCODERS);\n const consumableMediaTypes = extractConsumableMediaTypes(OPERATION);\n const produceableMediaTypes = extractProduceableMediaTypes(OPERATION);\n const ajv = new Ajv({\n verbose: DEBUG_NODE_ENVS.includes(NODE_ENV),\n strict: true,\n logger: {\n log: (...args) => log?.('debug', ...args),\n warn: (...args) => log?.('warning', ...args),\n error: (...args) => log?.('error', ...args),\n },\n useDefaults: true,\n coerceTypes: true,\n });\n addAJVFormats(ajv);\n const ammendedParameters = extractOperationSecurityParameters(\n OPERATION_API,\n OPERATION,\n );\n const validators = prepareParametersValidators(\n ajv,\n OPERATION.operationId,\n ((OPERATION.parameters || []) as OpenAPIV3.ParameterObject[]).concat(\n ammendedParameters,\n ),\n );\n const bodyValidator = prepareBodyValidator(ajv, OPERATION);\n const applyWrappers = compose(...WRAPPERS) as WhookWrapper<\n Dependencies,\n Service\n >;\n\n const handler = await (\n applyWrappers(initHandler) as ServiceInitializer<Dependencies, Service>\n )({\n OPERATION,\n DEBUG_NODE_ENVS,\n NODE_ENV,\n ...services,\n time,\n log,\n });\n\n return handleForAWSHTTPFunction.bind(\n null,\n {\n OPERATION,\n NODE_ENV,\n DEBUG_NODE_ENVS,\n DECODERS,\n ENCODERS,\n log,\n time,\n ...services,\n },\n {\n consumableMediaTypes,\n produceableMediaTypes,\n consumableCharsets,\n produceableCharsets,\n validators,\n bodyValidator,\n ammendedParameters,\n },\n handler,\n );\n}\n\nasync function handleForAWSHTTPFunction(\n {\n OPERATION,\n DEBUG_NODE_ENVS,\n NODE_ENV,\n ENCODERS,\n DECODERS,\n PARSERS = DEFAULT_PARSERS,\n STRINGIFYERS = DEFAULT_STRINGIFYERS,\n BUFFER_LIMIT = DEFAULT_BUFFER_LIMIT,\n QUERY_PARSER,\n CORS,\n log,\n obfuscator,\n }: HTTPWrapperDependencies & { CORS: CORSConfig },\n {\n consumableMediaTypes,\n produceableMediaTypes,\n consumableCharsets,\n produceableCharsets,\n validators,\n bodyValidator,\n },\n handler: WhookHandler,\n req,\n res,\n) {\n const debugging = (DEBUG_NODE_ENVS || []).includes(NODE_ENV);\n const bufferLimit = bytes.parse(BUFFER_LIMIT);\n\n log?.(\n 'info',\n 'GCP_FUNCTIONS_REQUEST',\n JSON.stringify({\n url: req.originalUrl,\n method: req.method,\n body: req.body,\n // body: obfuscateEventBody(obfuscator, req.body),\n headers: obfuscator.obfuscateSensibleHeaders(req.headers),\n }),\n );\n\n const request = await gcpfReqToRequest(req);\n let parameters;\n let response;\n let responseLog;\n let responseSpec;\n\n log?.(\n 'debug',\n 'REQUEST',\n JSON.stringify({\n ...request,\n body: request.body ? 'Stream' : undefined,\n headers: obfuscator.obfuscateSensibleHeaders(request.headers),\n }),\n );\n\n try {\n const operation = OPERATION;\n const bodySpec = extractBodySpec(\n request,\n consumableMediaTypes,\n consumableCharsets,\n );\n\n responseSpec = extractResponseSpec(\n operation,\n request,\n produceableMediaTypes,\n produceableCharsets,\n );\n\n try {\n const body = await getBody(\n {\n DECODERS,\n PARSERS,\n bufferLimit,\n },\n operation,\n request.body as Readable,\n bodySpec,\n );\n const path = request.url.split(SEARCH_SEPARATOR)[0];\n const parts = path.split(PATH_SEPARATOR).filter(identity);\n const search = request.url.substr(\n request.url.split(SEARCH_SEPARATOR)[0].length,\n );\n\n const pathParameters = (\n OPERATION.path\n .split(PATH_SEPARATOR)\n .filter(identity)\n .map((part, index) => {\n const matches = /^\\{([\\d\\w]+)\\}$/i.exec(part);\n\n if (matches) {\n return {\n name: matches[1],\n value: parts[index],\n };\n }\n }) as Array<{ name: string; value: string }>\n )\n .filter(identity)\n .reduce(\n (accParameters, { name, value }) => ({\n ...accParameters,\n [name]: value,\n }),\n {},\n );\n\n // TODO: Update strictQS to handle OpenAPI 3\n const retroCompatibleQueryParameters = (OPERATION.parameters || [])\n .filter((p) => p.in === 'query')\n .map((p) => ({ ...p, ...p.schema }));\n\n parameters = {\n ...pathParameters,\n ...QUERY_PARSER(retroCompatibleQueryParameters as any, search),\n ...filterHeaders(operation.parameters, request.headers),\n };\n\n parameters = {\n // TODO: Use the security of the operation to infer\n // authorization parameters, see:\n // https://github.com/nfroidure/whook/blob/06ccae93d1d52d97ff70fd5e19fa826bdabf3968/packages/whook-http-router/src/validation.js#L110\n authorization: parameters.authorization,\n ...castParameters(operation.parameters || [], parameters),\n };\n\n applyValidators(operation, validators, parameters);\n\n bodyValidator(operation, bodySpec.contentType, body);\n\n parameters = {\n ...parameters,\n ...('undefined' !== typeof body ? { body } : {}),\n };\n } catch (err) {\n throw HTTPError.cast(err as Error, 400);\n }\n\n response = await executeHandler(operation, handler, parameters);\n\n if (response.body) {\n response.headers['content-type'] =\n response.headers['content-type'] || responseSpec.contentTypes[0];\n }\n\n // Check the stringifyer only when a schema is\n // specified and it is not a binary one\n const responseObject =\n operation.responses &&\n (operation.responses[response.status] as OpenAPIV3.ResponseObject);\n const responseSchema =\n responseObject &&\n responseObject.content &&\n responseObject.content[response.headers['content-type']] &&\n (responseObject.content[response.headers['content-type']]\n .schema as OpenAPIV3.SchemaObject);\n const responseHasSchema =\n responseSchema &&\n (responseSchema.type !== 'string' || responseSchema.format !== 'binary');\n\n if (responseHasSchema && !STRINGIFYERS[response.headers['content-type']]) {\n throw new HTTPError(\n 500,\n 'E_STRINGIFYER_LACK',\n response.headers['content-type'],\n );\n }\n if (response.body) {\n checkResponseMediaType(request, responseSpec, produceableMediaTypes);\n checkResponseCharset(request, responseSpec, produceableCharsets);\n }\n responseLog = {\n type: 'success',\n status: response.status,\n };\n log?.('debug', JSON.stringify(responseLog));\n } catch (err) {\n const castedError = HTTPError.cast(err as Error);\n\n responseLog = {\n type: 'error',\n code: castedError.code,\n statusCode: castedError.httpCode,\n params: castedError.params || [],\n stack: castedError.stack,\n };\n\n log?.('error', JSON.stringify(responseLog));\n response = {\n status: castedError.httpCode,\n headers: {\n ...lowerCaseHeaders(CORS),\n ...(castedError.headers ?? {}),\n 'content-type': 'application/json',\n },\n body: {\n error: {\n code: castedError.code,\n stack: debugging ? responseLog.stack : undefined,\n params: debugging ? responseLog.params : undefined,\n },\n },\n };\n }\n\n log?.(\n 'debug',\n 'RESPONSE',\n JSON.stringify({\n ...response,\n body: obfuscateEventBody(obfuscator, response.body),\n headers: obfuscator.obfuscateSensibleHeaders(response.headers),\n }),\n );\n\n await pipeResponseInGCPFResponse(\n await sendBody(\n {\n ENCODERS,\n STRINGIFYERS,\n },\n response,\n ),\n res,\n );\n}\n\nasync function gcpfReqToRequest(req): Promise<WhookRequest> {\n const request: WhookRequest = {\n method: req.method.toLowerCase(),\n headers: lowerCaseHeaders(req.headers || {}),\n url: req.originalUrl,\n };\n\n if (req.rawBody) {\n request.headers['content-length'] = req.rawBody.length.toString();\n const bodyStream = new stream.PassThrough();\n\n request.body = bodyStream;\n bodyStream.write(req.rawBody);\n bodyStream.end();\n }\n\n return request;\n}\n\nasync function pipeResponseInGCPFResponse(\n response: WhookResponse,\n res,\n): Promise<void> {\n Object.keys(response.headers || {}).forEach((headerName) => {\n res.set(headerName, response.headers?.[headerName]);\n });\n res.status(response.status);\n\n if (response.body) {\n (response.body as Readable).pipe(res);\n return;\n }\n\n res.end();\n}\n\nfunction obfuscateEventBody(obfuscator, rawBody) {\n if (typeof rawBody === 'string') {\n try {\n const jsonBody = JSON.parse(rawBody);\n\n return JSON.stringify(obfuscator.obfuscateSensibleProps(jsonBody));\n // eslint-disable-next-line\n } catch (err) {}\n }\n return rawBody;\n}\n"],"mappings":"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"}