@golemio/core 1.4.0-dev.754703179 → 1.4.0-dev.759670021
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/input-gateway/config/InputGatewayConfiguration.d.ts +7 -7
- package/dist/input-gateway/config/InputGatewayConfiguration.js +13 -13
- package/dist/input-gateway/config/InputGatewayConfiguration.js.map +1 -1
- package/dist/input-gateway/config/abstract.d.ts +2 -9
- package/dist/input-gateway/data-access/StorageServiceProvider.d.ts +8 -0
- package/dist/input-gateway/data-access/StorageServiceProvider.js +39 -0
- package/dist/input-gateway/data-access/StorageServiceProvider.js.map +1 -0
- package/dist/input-gateway/helpers/SaveRawDataMiddleware.d.ts +15 -11
- package/dist/input-gateway/helpers/SaveRawDataMiddleware.js +67 -85
- package/dist/input-gateway/helpers/SaveRawDataMiddleware.js.map +1 -1
- package/dist/input-gateway/ioc/ContainerToken.d.ts +2 -0
- package/dist/input-gateway/ioc/ContainerToken.js +2 -0
- package/dist/input-gateway/ioc/ContainerToken.js.map +1 -1
- package/dist/input-gateway/ioc/Di.js +5 -0
- package/dist/input-gateway/ioc/Di.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,14 +13,14 @@ export declare class InputGatewayConfiguration implements IConfiguration {
|
|
|
13
13
|
port: string | undefined;
|
|
14
14
|
rabbit_connections: string[] | undefined;
|
|
15
15
|
rabbit_exchange_name: string | undefined;
|
|
16
|
-
|
|
17
|
-
access_key_id: string | undefined;
|
|
18
|
-
bucket_name: string | undefined;
|
|
16
|
+
storage: {
|
|
19
17
|
enabled: boolean;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
provider: {
|
|
19
|
+
azure: {
|
|
20
|
+
connectionString: string;
|
|
21
|
+
containerName: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
24
|
};
|
|
25
25
|
saveRawDataWhitelist: any;
|
|
26
26
|
sentry: {
|
|
@@ -16,7 +16,7 @@ const _monitoring_1 = require("../../monitoring");
|
|
|
16
16
|
const tsyringe_1 = require("tsyringe");
|
|
17
17
|
let InputGatewayConfiguration = class InputGatewayConfiguration {
|
|
18
18
|
constructor() {
|
|
19
|
-
var _a, _b, _c, _d, _e;
|
|
19
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
20
20
|
this.app_version = process.env.npm_package_version;
|
|
21
21
|
this.app_name = process.env.APP_NAME || "input-gateway";
|
|
22
22
|
this.colorful_logs = process.env.COLORFUL_LOGS;
|
|
@@ -28,14 +28,14 @@ let InputGatewayConfiguration = class InputGatewayConfiguration {
|
|
|
28
28
|
this.port = process.env.PORT;
|
|
29
29
|
this.rabbit_connections = (_a = process.env.RABBIT_CONN) === null || _a === void 0 ? void 0 : _a.split(",");
|
|
30
30
|
this.rabbit_exchange_name = process.env.RABBIT_EXCHANGE_NAME;
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
this.storage = {
|
|
32
|
+
enabled: process.env.STORAGE_ENABLED === "true",
|
|
33
|
+
provider: {
|
|
34
|
+
azure: {
|
|
35
|
+
connectionString: (_b = process.env.AZURE_BLOB_STORAGE_CONN) !== null && _b !== void 0 ? _b : "",
|
|
36
|
+
containerName: (_c = process.env.AZURE_BLOB_STORAGE_CONTAINER_NAME) !== null && _c !== void 0 ? _c : "",
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
39
|
};
|
|
40
40
|
this.sentry = {
|
|
41
41
|
enabled: process.env.SENTRY_ENABLED === "true",
|
|
@@ -69,18 +69,18 @@ let InputGatewayConfiguration = class InputGatewayConfiguration {
|
|
|
69
69
|
enabled: process.env.FEATURE_FLAGS_ENABLED === "true",
|
|
70
70
|
provider: {
|
|
71
71
|
launchDarkly: {
|
|
72
|
-
appId: (
|
|
73
|
-
sdkKey: (
|
|
72
|
+
appId: (_d = process.env.FEATURE_FLAGS_LAUNCH_DARKLY_APP_ID) !== null && _d !== void 0 ? _d : "input-gateway",
|
|
73
|
+
sdkKey: (_e = process.env.FEATURE_FLAGS_LAUNCH_DARKLY_SDK_KEY) !== null && _e !== void 0 ? _e : "sdk-test",
|
|
74
74
|
useOfflineMode: process.env.FEATURE_FLAGS_LAUNCH_DARKLY_USE_OFFLINE_MODE === "true",
|
|
75
75
|
fileDataSource: process.env.FEATURE_FLAGS_LAUNCH_DARKLY_FILE_DATA_SOURCE,
|
|
76
76
|
useDaemonMode: process.env.FEATURE_FLAGS_LAUNCH_DARKLY_USE_DAEMON_MODE === "true",
|
|
77
77
|
options: {
|
|
78
|
-
baseUri: (
|
|
78
|
+
baseUri: (_f = process.env.FEATURE_FLAGS_LAUNCH_DARKLY_BASE_URI) !== null && _f !== void 0 ? _f : "http://localhost:8030",
|
|
79
79
|
redisConn: process.env.FEATURE_FLAGS_LAUNCH_DARKLY_REDIS_CONN,
|
|
80
80
|
redisCacheTtlInSeconds: process.env.FEATURE_FLAGS_LAUNCH_DARKLY_REDIS_CACHE_TTL_IN_SECONDS
|
|
81
81
|
? parseInt(process.env.FEATURE_FLAGS_LAUNCH_DARKLY_REDIS_CACHE_TTL_IN_SECONDS)
|
|
82
82
|
: 60,
|
|
83
|
-
redisKeyPrefix: (
|
|
83
|
+
redisKeyPrefix: (_g = process.env.FEATURE_FLAGS_LAUNCH_DARKLY_REDIS_KEY_PREFIX) !== null && _g !== void 0 ? _g : "ld-ig",
|
|
84
84
|
},
|
|
85
85
|
},
|
|
86
86
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputGatewayConfiguration.js","sourceRoot":"","sources":["../../../src/input-gateway/config/InputGatewayConfiguration.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAwC;AAExC,+CAAyC;AACzC,kDAAkD;AAClD,uCAAsC;AAItC,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;IAwElC;;QAvEO,gBAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC9C,aAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,eAAe,CAAC;QACnD,kBAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC1C,cAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,aAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;QACjD,sBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,uBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACpD,sBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,SAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,uBAAkB,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,WAAW,0CAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACzD,yBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACxD,
|
|
1
|
+
{"version":3,"file":"InputGatewayConfiguration.js","sourceRoot":"","sources":["../../../src/input-gateway/config/InputGatewayConfiguration.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAwC;AAExC,+CAAyC;AACzC,kDAAkD;AAClD,uCAAsC;AAItC,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;IAwElC;;QAvEO,gBAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC9C,aAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,eAAe,CAAC;QACnD,kBAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC1C,cAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,aAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;QACjD,sBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,uBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACpD,sBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,SAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,uBAAkB,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,WAAW,0CAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACzD,yBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACxD,YAAO,GAAG;YACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;YAC/C,QAAQ,EAAE;gBACN,KAAK,EAAE;oBACH,gBAAgB,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,mCAAI,EAAE;oBAC3D,aAAa,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,iCAAiC,mCAAI,EAAE;iBACrE;aACJ;SACJ,CAAC;QAEK,WAAM,GAAG;YACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;YAC9C,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC3B,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACrE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC3C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM;YAC1C,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;SAClG,CAAC;QACK,YAAO,GAAG;YACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;YAC/C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YACxF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;SAC3C,CAAC;QACK,cAAS,GAAG;YACf,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;YACpD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3C,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACzC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACnG,eAAe,EACX,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iCAAmB;gBAC/E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,gBAAwC;gBACvD,CAAC,CAAC,iCAAmB,CAAC,OAAO;YACrC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;SACvG,CAAC;QACK,cAAS,GAAG;YACf,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YAC/G,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK;YACtH,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;SACrH,CAAC;QACK,iBAAY,GAAG;YAClB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM;YACrD,QAAQ,EAAE;gBACN,YAAY,EAAE;oBACV,KAAK,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,kCAAkC,mCAAI,eAAe;oBACxE,MAAM,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,mCAAI,UAAU;oBACrE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,4CAA4C,KAAK,MAAM;oBACnF,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,4CAA4C;oBACxE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,2CAA2C,KAAK,MAAM;oBACjF,OAAO,EAAE;wBACL,OAAO,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,mCAAI,uBAAuB;wBACpF,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,sCAAsC;wBAC7D,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,sDAAsD;4BACtF,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC;4BAC9E,CAAC,CAAC,EAAE;wBACR,cAAc,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,4CAA4C,mCAAI,OAAO;qBACtF;iBACJ;aACJ;SACmB,CAAC;QAGrB,MAAM,oBAAoB,GAAG,IAAI,uBAAY,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC;QAC3E,IAAI,CAAC,oBAAoB,GAAG,IAAA,eAAO,EAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC1F,CAAC;CACJ,CAAA;AA5EY,yBAAyB;IADrC,IAAA,qBAAU,GAAE;;GACA,yBAAyB,CA4ErC;AA5EY,8DAAyB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { IJaegerConfig } from "../../monitoring";
|
|
2
2
|
import { ISentryConfig } from "../../monitoring/sentry/sentry-provider";
|
|
3
3
|
import { IMetricsConfig } from "../../monitoring/metrics/metrics-interface";
|
|
4
|
+
import { IStorageConfig } from "../../helpers/data-access/storage";
|
|
4
5
|
export interface ISaveRawDataWhitelist {
|
|
5
6
|
route: string;
|
|
6
7
|
withHeaders: boolean;
|
|
@@ -17,15 +18,7 @@ export interface IConfiguration {
|
|
|
17
18
|
port: string | undefined;
|
|
18
19
|
rabbit_connections: string[] | undefined;
|
|
19
20
|
rabbit_exchange_name: string | undefined;
|
|
20
|
-
|
|
21
|
-
access_key_id: string | undefined;
|
|
22
|
-
bucket_name: string | undefined;
|
|
23
|
-
enabled: boolean;
|
|
24
|
-
endpoint: string | undefined;
|
|
25
|
-
secret_access_key: string | undefined;
|
|
26
|
-
upload_part_size: number;
|
|
27
|
-
upload_queue_size: number;
|
|
28
|
-
};
|
|
21
|
+
storage: IStorageConfig;
|
|
29
22
|
sentry: ISentryConfig;
|
|
30
23
|
saveRawDataWhitelist: ISaveRawDataWhitelist[];
|
|
31
24
|
metrics: IMetricsConfig;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AbstractStorageService } from "../../helpers/data-access/storage";
|
|
2
|
+
import { ILogger } from "../../helpers";
|
|
3
|
+
import { IConfiguration } from "../config";
|
|
4
|
+
export declare class StorageServiceProvider {
|
|
5
|
+
protected _service: AbstractStorageService;
|
|
6
|
+
constructor(config: IConfiguration, log: ILogger);
|
|
7
|
+
get service(): AbstractStorageService;
|
|
8
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.StorageServiceProvider = void 0;
|
|
16
|
+
const tsyringe_1 = require("tsyringe");
|
|
17
|
+
const errors_1 = require("@golemio/errors");
|
|
18
|
+
const storage_1 = require("../../helpers/data-access/storage");
|
|
19
|
+
const ioc_1 = require("../ioc");
|
|
20
|
+
let StorageServiceProvider = class StorageServiceProvider {
|
|
21
|
+
constructor(config, log) {
|
|
22
|
+
const service = new storage_1.StorageServiceFactory(config.storage, log).getService(storage_1.StorageProvider.Azure);
|
|
23
|
+
if (!service) {
|
|
24
|
+
throw new errors_1.CustomError(`StorageServiceProvider returned undefined for provider ${storage_1.StorageProvider.Azure}`, false, this.constructor.name);
|
|
25
|
+
}
|
|
26
|
+
this._service = service;
|
|
27
|
+
}
|
|
28
|
+
get service() {
|
|
29
|
+
return this._service;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
StorageServiceProvider = __decorate([
|
|
33
|
+
(0, tsyringe_1.injectable)(),
|
|
34
|
+
__param(0, (0, tsyringe_1.inject)(ioc_1.ContainerToken.Config)),
|
|
35
|
+
__param(1, (0, tsyringe_1.inject)(ioc_1.ContainerToken.Logger)),
|
|
36
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
37
|
+
], StorageServiceProvider);
|
|
38
|
+
exports.StorageServiceProvider = StorageServiceProvider;
|
|
39
|
+
//# sourceMappingURL=StorageServiceProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageServiceProvider.js","sourceRoot":"","sources":["../../../src/input-gateway/data-access/StorageServiceProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uCAA8C;AAC9C,4CAA8C;AAC9C,+DAA8G;AAC9G,gCAAyC;AAKzC,IAAa,sBAAsB,GAAnC,MAAa,sBAAsB;IAG/B,YAA2C,MAAsB,EAAiC,GAAY;QAC1G,MAAM,OAAO,GAAG,IAAI,+BAAqB,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,yBAAe,CAAC,KAAK,CAAC,CAAC;QAEjG,IAAI,CAAC,OAAO,EAAE;YACV,MAAM,IAAI,oBAAW,CACjB,0DAA0D,yBAAe,CAAC,KAAK,EAAE,EACjF,KAAK,EACL,IAAI,CAAC,WAAW,CAAC,IAAI,CACxB,CAAC;SACL;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ,CAAA;AApBY,sBAAsB;IADlC,IAAA,qBAAU,GAAE;IAII,WAAA,IAAA,iBAAM,EAAC,oBAAc,CAAC,MAAM,CAAC,CAAA;IAA0B,WAAA,IAAA,iBAAM,EAAC,oBAAc,CAAC,MAAM,CAAC,CAAA;;GAHxF,sBAAsB,CAoBlC;AApBY,wDAAsB"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import { S3 } from "aws-sdk";
|
|
2
1
|
import { NextFunction, Request, Response } from "express";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
import { ILogger } from "../../helpers";
|
|
3
|
+
import { AbstractStorageService } from "../../helpers/data-access/storage";
|
|
4
|
+
import { IConfiguration } from "../config";
|
|
5
|
+
export declare class SaveRawDataMiddleware {
|
|
6
|
+
private readonly log;
|
|
7
|
+
private storage;
|
|
8
|
+
private readonly storageEnabled;
|
|
9
|
+
private readonly whitelist;
|
|
10
|
+
constructor(config: IConfiguration, log: ILogger, storage: AbstractStorageService);
|
|
11
|
+
getMiddleware: () => (req: Request, res: Response, next: NextFunction) => void;
|
|
12
|
+
getWhitelistRegexp: () => {
|
|
13
|
+
routesRegexp: RegExp;
|
|
14
|
+
headersRegexp: RegExp;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -1,94 +1,76 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
4
13
|
};
|
|
5
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
const
|
|
8
|
-
const aws_sdk_1 = require("aws-sdk");
|
|
9
|
-
const moment_timezone_1 = __importDefault(require("moment-timezone"));
|
|
15
|
+
exports.SaveRawDataMiddleware = void 0;
|
|
16
|
+
const tsyringe_1 = require("tsyringe");
|
|
10
17
|
const path_to_regexp_1 = require("path-to-regexp");
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
*/
|
|
42
|
-
const saveRawDataMiddleware = (req, res, next) => {
|
|
43
|
-
const requestUrlPath = req.path;
|
|
44
|
-
// save file only if S3 is enabled and the method is POST and the url match one of whitelisted route
|
|
45
|
-
if (config_1.config.s3.enabled && req.method === "POST" && exports.routesRegexp.exec(requestUrlPath)) {
|
|
46
|
-
// file name (path) in format {url}/{YYYY-MM-DD}/{HH_mm_ss.s}, e.g. mos-be/accounts/2020-04-17/12_59_42.456
|
|
47
|
-
const now = (0, moment_timezone_1.default)().tz("Europe/Prague");
|
|
48
|
-
const name = `${requestUrlPath.slice(1)}/${now.format("YYYY-MM-DD")}/${now.format("HH_mm_ss.SSS")}`;
|
|
49
|
-
// file extension by content-type
|
|
50
|
-
const contentType = (0, helpers_1.getContentType)(req);
|
|
51
|
-
const ext = helpers_1.contentTypeToExtension[contentType];
|
|
52
|
-
// content-type checking
|
|
53
|
-
if (!ext) {
|
|
54
|
-
errors_1.ErrorHandler.handle(new errors_1.CustomError(`Saving raw data failed. (${requestUrlPath})`, true, "SaveRawDataMiddleware", 406, new Error(`Extension for content-type ${contentType} was not found.`)), helpers_1.log);
|
|
55
|
-
return next();
|
|
56
|
-
}
|
|
57
|
-
// save file with body of the matched route
|
|
58
|
-
const dataPutRequest = {
|
|
59
|
-
Body: req,
|
|
60
|
-
Bucket: config_1.config.s3.bucket_name,
|
|
61
|
-
Key: `${name}.${ext}`,
|
|
62
|
-
};
|
|
63
|
-
const options = {
|
|
64
|
-
partSize: config_1.config.s3.upload_part_size * 1024 * 1024,
|
|
65
|
-
queueSize: config_1.config.s3.upload_queue_size,
|
|
18
|
+
const errors_1 = require("@golemio/errors");
|
|
19
|
+
const storage_1 = require("../../helpers/data-access/storage");
|
|
20
|
+
const CheckContentTypeMiddleware_1 = require("./CheckContentTypeMiddleware");
|
|
21
|
+
const ContentTypeHelper_1 = require("./ContentTypeHelper");
|
|
22
|
+
const ioc_1 = require("../ioc");
|
|
23
|
+
let SaveRawDataMiddleware = class SaveRawDataMiddleware {
|
|
24
|
+
constructor(config, log, storage) {
|
|
25
|
+
this.log = log;
|
|
26
|
+
this.storage = storage;
|
|
27
|
+
this.getMiddleware = () => {
|
|
28
|
+
const whitelistRegexp = this.getWhitelistRegexp();
|
|
29
|
+
return (req, res, next) => {
|
|
30
|
+
const requestUrlPath = req.path;
|
|
31
|
+
if (this.storageEnabled && req.method === "POST" && whitelistRegexp.routesRegexp.exec(requestUrlPath)) {
|
|
32
|
+
// file extension by content-type
|
|
33
|
+
const contentType = (0, CheckContentTypeMiddleware_1.getContentType)(req);
|
|
34
|
+
const ext = ContentTypeHelper_1.contentTypeToExtension[contentType];
|
|
35
|
+
// content-type checking
|
|
36
|
+
if (!ext) {
|
|
37
|
+
errors_1.ErrorHandler.handle(new errors_1.CustomError(`Saving raw data failed. (${requestUrlPath})`, true, "SaveRawDataMiddleware", 406, new Error(`Extension for content-type ${contentType} was not found.`)), this.log);
|
|
38
|
+
return next();
|
|
39
|
+
}
|
|
40
|
+
this.storage.uploadFile(req.body, `${requestUrlPath.slice(1)}`, ext);
|
|
41
|
+
// save file with headers of the matched route
|
|
42
|
+
if (whitelistRegexp.headersRegexp.exec(requestUrlPath)) {
|
|
43
|
+
this.storage.uploadFile(JSON.stringify(req.headers), `${requestUrlPath.slice(1)}`, `json`, "_headers");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
next();
|
|
47
|
+
};
|
|
66
48
|
};
|
|
67
|
-
(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
49
|
+
this.getWhitelistRegexp = () => {
|
|
50
|
+
const regexpRoutes = [];
|
|
51
|
+
const regexpHeaders = [];
|
|
52
|
+
for (const dataset of this.whitelist) {
|
|
53
|
+
const routeRegexp = `(${(0, path_to_regexp_1.pathToRegexp)(dataset.route).source})`;
|
|
54
|
+
regexpRoutes.push(routeRegexp);
|
|
55
|
+
if (dataset.withHeaders) {
|
|
56
|
+
regexpHeaders.push(routeRegexp);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
routesRegexp: regexpRoutes.length ? RegExp(regexpRoutes.join("|")) : RegExp(/.^/),
|
|
61
|
+
headersRegexp: regexpHeaders.length ? RegExp(regexpHeaders.join("|")) : RegExp(/.^/),
|
|
74
62
|
};
|
|
75
|
-
|
|
76
|
-
|
|
63
|
+
};
|
|
64
|
+
this.storageEnabled = config.storage.enabled;
|
|
65
|
+
this.whitelist = config.saveRawDataWhitelist;
|
|
77
66
|
}
|
|
78
|
-
next();
|
|
79
|
-
};
|
|
80
|
-
exports.saveRawDataMiddleware = saveRawDataMiddleware;
|
|
81
|
-
/**
|
|
82
|
-
* Helper function for saving data to S3
|
|
83
|
-
*/
|
|
84
|
-
const uploadDataToS3 = (data, options, requestUrlPath) => {
|
|
85
|
-
s3.upload(data, options, (err, _data) => {
|
|
86
|
-
if (err) {
|
|
87
|
-
errors_1.ErrorHandler.handle(new errors_1.CustomError(`Uploading data failed to S3 failed. (${requestUrlPath})`, true, "SaveRawDataMiddleware", err.statusCode, err), helpers_1.log);
|
|
88
|
-
}
|
|
89
|
-
}).on("httpUploadProgress", (httpUploadProgress) => {
|
|
90
|
-
helpers_1.log.debug(`S3 file upload progress: ${httpUploadProgress.loaded} / ${httpUploadProgress.total}`);
|
|
91
|
-
});
|
|
92
67
|
};
|
|
93
|
-
|
|
68
|
+
SaveRawDataMiddleware = __decorate([
|
|
69
|
+
(0, tsyringe_1.injectable)(),
|
|
70
|
+
__param(0, (0, tsyringe_1.inject)(ioc_1.ContainerToken.Config)),
|
|
71
|
+
__param(1, (0, tsyringe_1.inject)(ioc_1.ContainerToken.Logger)),
|
|
72
|
+
__param(2, (0, tsyringe_1.inject)(ioc_1.ContainerToken.StorageService)),
|
|
73
|
+
__metadata("design:paramtypes", [Object, Object, storage_1.AbstractStorageService])
|
|
74
|
+
], SaveRawDataMiddleware);
|
|
75
|
+
exports.SaveRawDataMiddleware = SaveRawDataMiddleware;
|
|
94
76
|
//# sourceMappingURL=SaveRawDataMiddleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SaveRawDataMiddleware.js","sourceRoot":"","sources":["../../../src/input-gateway/helpers/SaveRawDataMiddleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SaveRawDataMiddleware.js","sourceRoot":"","sources":["../../../src/input-gateway/helpers/SaveRawDataMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@ const ContainerToken = {
|
|
|
9
9
|
AmqpConnector: Symbol(),
|
|
10
10
|
FeatureFlagService: Symbol(),
|
|
11
11
|
FeatureFlagServiceWrapper: Symbol(),
|
|
12
|
+
StorageService: Symbol(),
|
|
13
|
+
StorageServiceProvider: Symbol(),
|
|
12
14
|
};
|
|
13
15
|
exports.ContainerToken = ContainerToken;
|
|
14
16
|
//# sourceMappingURL=ContainerToken.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContainerToken.js","sourceRoot":"","sources":["../../../src/input-gateway/ioc/ContainerToken.ts"],"names":[],"mappings":";;;AAAA,MAAM,cAAc,GAAG;IACnB,MAAM,EAAE,MAAM,EAAE;IAChB,MAAM,EAAE,MAAM,EAAE;IAChB,YAAY,EAAE,MAAM,EAAE;IACtB,aAAa,EAAE,MAAM,EAAE;IACvB,aAAa,EAAE,MAAM,EAAE;IACvB,kBAAkB,EAAE,MAAM,EAAE;IAC5B,yBAAyB,EAAE,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"ContainerToken.js","sourceRoot":"","sources":["../../../src/input-gateway/ioc/ContainerToken.ts"],"names":[],"mappings":";;;AAAA,MAAM,cAAc,GAAG;IACnB,MAAM,EAAE,MAAM,EAAE;IAChB,MAAM,EAAE,MAAM,EAAE;IAChB,YAAY,EAAE,MAAM,EAAE;IACtB,aAAa,EAAE,MAAM,EAAE;IACvB,aAAa,EAAE,MAAM,EAAE;IACvB,kBAAkB,EAAE,MAAM,EAAE;IAC5B,yBAAyB,EAAE,MAAM,EAAE;IACnC,cAAc,EAAE,MAAM,EAAE;IACxB,sBAAsB,EAAE,MAAM,EAAE;CACnC,CAAC;AAEO,wCAAc"}
|
|
@@ -12,6 +12,7 @@ const FeatureFlagServiceWrapper_1 = require("../data-access/FeatureFlagServiceWr
|
|
|
12
12
|
const LoggerEvents_1 = __importDefault(require("../helpers/LoggerEvents"));
|
|
13
13
|
const tsyringe_1 = require("tsyringe");
|
|
14
14
|
const ContainerToken_1 = require("./ContainerToken");
|
|
15
|
+
const StorageServiceProvider_1 = require("../data-access/StorageServiceProvider");
|
|
15
16
|
//#region Initialization
|
|
16
17
|
const singletonOptions = { lifecycle: tsyringe_1.Lifecycle.Singleton };
|
|
17
18
|
const InputGatewayContainer = Di_1.GlobalContainer.createChildContainer();
|
|
@@ -33,5 +34,9 @@ InputGatewayContainer.register(ContainerToken_1.ContainerToken.AmqpConnector, {
|
|
|
33
34
|
.register(ContainerToken_1.ContainerToken.FeatureFlagServiceWrapper, FeatureFlagServiceWrapper_1.FeatureFlagServiceWrapper, singletonOptions)
|
|
34
35
|
.register(ContainerToken_1.ContainerToken.FeatureFlagService, {
|
|
35
36
|
useFactory: (0, tsyringe_1.instanceCachingFactory)((c) => c.resolve(ContainerToken_1.ContainerToken.FeatureFlagServiceWrapper).service),
|
|
37
|
+
})
|
|
38
|
+
.register(ContainerToken_1.ContainerToken.StorageServiceProvider, StorageServiceProvider_1.StorageServiceProvider, singletonOptions)
|
|
39
|
+
.register(ContainerToken_1.ContainerToken.StorageService, {
|
|
40
|
+
useFactory: (0, tsyringe_1.instanceCachingFactory)((c) => c.resolve(ContainerToken_1.ContainerToken.StorageServiceProvider).service),
|
|
36
41
|
});
|
|
37
42
|
//# sourceMappingURL=Di.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Di.js","sourceRoot":"","sources":["../../../src/input-gateway/ioc/Di.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAsE;AAEtE,6CAAkD;AAElD,mFAAiF;AACjF,+DAA6D;AAC7D,wFAAsF;AACtF,2EAAoD;AACpD,uCAA6D;AAC7D,qDAAkD;
|
|
1
|
+
{"version":3,"file":"Di.js","sourceRoot":"","sources":["../../../src/input-gateway/ioc/Di.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAsE;AAEtE,6CAAkD;AAElD,mFAAiF;AACjF,+DAA6D;AAC7D,wFAAsF;AACtF,2EAAoD;AACpD,uCAA6D;AAC7D,qDAAkD;AAClD,kFAAgF;AAEhF,wBAAwB;AACxB,MAAM,gBAAgB,GAAG,EAAE,SAAS,EAAE,oBAAS,CAAC,SAAS,EAAE,CAAC;AAC5D,MAAM,qBAAqB,GAAG,oBAAe,CAAC,oBAAoB,EAAE,CAAC;AAsC5D,sDAAqB;AArC9B,YAAY;AAEZ,iBAAiB;AACjB,qBAAqB,CAAC,QAAQ,CAAiB,+BAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,qDAAyB,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAEjI,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAiB,+BAAc,CAAC,MAAM,CAAC,CAAC;AACpF,qBAAqB,CAAC,gBAAgB,CAClC,+BAAc,CAAC,MAAM,EACrB,IAAA,uBAAY,EAAC;IACT,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAC,SAAS;CAC7B,CAAC,CACL,CAAC;AACF,qBAAqB,CAAC,QAAQ,CAAC,+BAAc,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,sBAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC1G,qBAAqB,CAAC,gBAAgB,CAClC,+BAAc,CAAC,aAAa,EAC5B,IAAA,8BAAmB,EAAC,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC,OAAO,CAAC,+BAAc,CAAC,MAAM,CAAC,CAAC,CAC7F,CAAC;AACF,YAAY;AAEZ,qBAAqB;AACrB,qBAAqB,CAAC,QAAQ,CAAkB,+BAAc,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,6BAAa,EAAE,EAAE,gBAAgB,CAAC;KACvH,QAAQ,CAAC,+BAAc,CAAC,yBAAyB,EAAE,qDAAyB,EAAE,gBAAgB,CAAC;KAC/F,QAAQ,CAAC,+BAAc,CAAC,kBAAkB,EAAE;IACzC,UAAU,EAAE,IAAA,iCAAsB,EAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAA4B,+BAAc,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAChG;CACJ,CAAC;KACD,QAAQ,CAAC,+BAAc,CAAC,sBAAsB,EAAE,+CAAsB,EAAE,gBAAgB,CAAC;KACzF,QAAQ,CAAC,+BAAc,CAAC,cAAc,EAAE;IACrC,UAAU,EAAE,IAAA,iCAAsB,EAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAyB,+BAAc,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAC1F;CACJ,CAAC,CAAC"}
|