@mocko/core 2.0.0-alpha.12
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/README.md +3 -0
- package/default.env +26 -0
- package/dist/api/deploy/deploy.controller.js +37 -0
- package/dist/api/deploy/deploy.controller.js.map +1 -0
- package/dist/api/deploy/deploy.router.js +40 -0
- package/dist/api/deploy/deploy.router.js.map +1 -0
- package/dist/api/deploy/deploy.service.js +55 -0
- package/dist/api/deploy/deploy.service.js.map +1 -0
- package/dist/api/flag/data/flag.dto.js +36 -0
- package/dist/api/flag/data/flag.dto.js.map +1 -0
- package/dist/api/flag/flag.controller.js +90 -0
- package/dist/api/flag/flag.controller.js.map +1 -0
- package/dist/api/flag/flag.memory-repository.js +37 -0
- package/dist/api/flag/flag.memory-repository.js.map +1 -0
- package/dist/api/flag/flag.redis-repository.js +44 -0
- package/dist/api/flag/flag.redis-repository.js.map +1 -0
- package/dist/api/flag/flag.repository.js +3 -0
- package/dist/api/flag/flag.repository.js.map +1 -0
- package/dist/api/flag/flag.router.js +61 -0
- package/dist/api/flag/flag.router.js.map +1 -0
- package/dist/api/flag/flag.service.js +88 -0
- package/dist/api/flag/flag.service.js.map +1 -0
- package/dist/api/health/health.controller.js +30 -0
- package/dist/api/health/health.controller.js.map +1 -0
- package/dist/api/health/health.router.js +35 -0
- package/dist/api/health/health.router.js.map +1 -0
- package/dist/api/health/health.service.js +35 -0
- package/dist/api/health/health.service.js.map +1 -0
- package/dist/api/host/data/core-host.dto.js +16 -0
- package/dist/api/host/data/core-host.dto.js.map +1 -0
- package/dist/api/host/host.controller.js +32 -0
- package/dist/api/host/host.controller.js.map +1 -0
- package/dist/api/host/host.router.js +35 -0
- package/dist/api/host/host.router.js.map +1 -0
- package/dist/api/host/host.service.js +30 -0
- package/dist/api/host/host.service.js.map +1 -0
- package/dist/api/mock/data/core-mock.dto.js +52 -0
- package/dist/api/mock/data/core-mock.dto.js.map +1 -0
- package/dist/api/mock/data/mock-failure.js +11 -0
- package/dist/api/mock/data/mock-failure.js.map +1 -0
- package/dist/api/mock/mock.controller.js +43 -0
- package/dist/api/mock/mock.controller.js.map +1 -0
- package/dist/api/mock/mock.handler.js +141 -0
- package/dist/api/mock/mock.handler.js.map +1 -0
- package/dist/api/mock/mock.repository.js +38 -0
- package/dist/api/mock/mock.repository.js.map +1 -0
- package/dist/api/mock/mock.router.js +50 -0
- package/dist/api/mock/mock.router.js.map +1 -0
- package/dist/api/mock/mock.service.js +111 -0
- package/dist/api/mock/mock.service.js.map +1 -0
- package/dist/api/proxy/proxy.controller.js +45 -0
- package/dist/api/proxy/proxy.controller.js.map +1 -0
- package/dist/api/proxy/proxy.router.js +62 -0
- package/dist/api/proxy/proxy.router.js.map +1 -0
- package/dist/api/proxy/proxy.service.js +48 -0
- package/dist/api/proxy/proxy.service.js.map +1 -0
- package/dist/config/config.constants.js +7 -0
- package/dist/config/config.constants.js.map +1 -0
- package/dist/config/config.service.js +89 -0
- package/dist/config/config.service.js.map +1 -0
- package/dist/definitions/data/data.js +3 -0
- package/dist/definitions/data/data.js.map +1 -0
- package/dist/definitions/data/host.js +35 -0
- package/dist/definitions/data/host.js.map +1 -0
- package/dist/definitions/data/mock.js +74 -0
- package/dist/definitions/data/mock.js.map +1 -0
- package/dist/definitions/data/mocko-definition.js +48 -0
- package/dist/definitions/data/mocko-definition.js.map +1 -0
- package/dist/definitions/definition.constants.js +6 -0
- package/dist/definitions/definition.constants.js.map +1 -0
- package/dist/definitions/definition.provider.js +185 -0
- package/dist/definitions/definition.provider.js.map +1 -0
- package/dist/helpers/flag.js +49 -0
- package/dist/helpers/flag.js.map +1 -0
- package/dist/helpers/log.js +30 -0
- package/dist/helpers/log.js.map +1 -0
- package/dist/helpers/response.js +54 -0
- package/dist/helpers/response.js.map +1 -0
- package/dist/listeners/deploy-listener.js +29 -0
- package/dist/listeners/deploy-listener.js.map +1 -0
- package/dist/listeners/index.js +26 -0
- package/dist/listeners/index.js.map +1 -0
- package/dist/main.js +26 -0
- package/dist/main.js.map +1 -0
- package/dist/main.router.js +51 -0
- package/dist/main.router.js.map +1 -0
- package/dist/plugins/h2o2.js +22 -0
- package/dist/plugins/h2o2.js.map +1 -0
- package/dist/plugins/index.js +29 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/logger.js +24 -0
- package/dist/plugins/logger.js.map +1 -0
- package/dist/redis/redis.provider.js +94 -0
- package/dist/redis/redis.provider.js.map +1 -0
- package/dist/server.js +153 -0
- package/dist/server.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/decorators/provider.js +6 -0
- package/dist/utils/decorators/provider.js.map +1 -0
- package/dist/utils/decorators/service.js +6 -0
- package/dist/utils/decorators/service.js.map +1 -0
- package/dist/utils/listener.js +3 -0
- package/dist/utils/listener.js.map +1 -0
- package/dist/utils/logger.js +7 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/plugin.js +3 -0
- package/dist/utils/plugin.js.map +1 -0
- package/dist/utils/remap-event-bus.js +26 -0
- package/dist/utils/remap-event-bus.js.map +1 -0
- package/dist/utils/router.js +3 -0
- package/dist/utils/router.js.map +1 -0
- package/dist/utils/stream.js +9 -0
- package/dist/utils/stream.js.map +1 -0
- package/dist/utils/utils.js +54 -0
- package/dist/utils/utils.js.map +1 -0
- package/nodemon.json +6 -0
- package/package.json +58 -0
package/README.md
ADDED
package/default.env
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
SERVER_HOST=0.0.0.0
|
|
2
|
+
SERVER_PORT=8080
|
|
3
|
+
SERVER_ALLOW-CORS=true
|
|
4
|
+
|
|
5
|
+
# URL of your actual API which will be proxied by mocko, leave it blank for non-proxied mode
|
|
6
|
+
PROXY_BASE-URI=
|
|
7
|
+
PROXY_TIMEOUT-MILLIS=60000
|
|
8
|
+
|
|
9
|
+
# Enables the internal deploy endpoint used by the UI flow. Disabled by default.
|
|
10
|
+
DEPLOY_ENDPOINT_ENABLED=false
|
|
11
|
+
# Controls whether the deploy endpoint requires Authorization: Bearer <token>. Enabled by default.
|
|
12
|
+
DEPLOY_AUTH_ENABLED=true
|
|
13
|
+
# Shared secret used to authenticate deploy requests when DEPLOY_AUTH_ENABLED=true.
|
|
14
|
+
# DEPLOY_SECRET=
|
|
15
|
+
|
|
16
|
+
# Set REDIS_ENABLED to false to use mocks from the mock dir. Set it to true to fetch them from redis and
|
|
17
|
+
# auto update (requires mocko-api and mocko-ui).
|
|
18
|
+
REDIS_ENABLED=false
|
|
19
|
+
# Maximum number of entries returned by /__mocko__/flags listing before truncation.
|
|
20
|
+
FLAGS_LIST-LIMIT=200
|
|
21
|
+
# REDIS_URL=redis://:password@127.0.0.1:6379/0
|
|
22
|
+
# REDIS_PORT=6379
|
|
23
|
+
# REDIS_HOST=127.0.0.1
|
|
24
|
+
# REDIS_PASSWORD=
|
|
25
|
+
# REDIS_DATABASE=0
|
|
26
|
+
# REDIS_PREFIX=mocko:
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DeployController = void 0;
|
|
13
|
+
const Boom = require("@hapi/boom");
|
|
14
|
+
const provider_1 = require("../../utils/decorators/provider");
|
|
15
|
+
const mocko_definition_1 = require("../../definitions/data/mocko-definition");
|
|
16
|
+
const utils_1 = require("../../utils/utils");
|
|
17
|
+
const deploy_service_1 = require("./deploy.service");
|
|
18
|
+
let DeployController = class DeployController {
|
|
19
|
+
constructor(service) {
|
|
20
|
+
this.service = service;
|
|
21
|
+
}
|
|
22
|
+
async deploy(request, h) {
|
|
23
|
+
this.service.authorize(request.headers.authorization);
|
|
24
|
+
const [definition, error] = (0, utils_1.tryCatchSync)(() => (0, mocko_definition_1.validateDefinition)(request.payload));
|
|
25
|
+
if (error) {
|
|
26
|
+
throw Boom.badRequest(error.message);
|
|
27
|
+
}
|
|
28
|
+
await this.service.deploy(definition);
|
|
29
|
+
return h.response().code(204);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.DeployController = DeployController;
|
|
33
|
+
exports.DeployController = DeployController = __decorate([
|
|
34
|
+
(0, provider_1.Provider)(),
|
|
35
|
+
__metadata("design:paramtypes", [deploy_service_1.DeployService])
|
|
36
|
+
], DeployController);
|
|
37
|
+
//# sourceMappingURL=deploy.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.controller.js","sourceRoot":"","sources":["../../../src/api/deploy/deploy.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAmC;AAEnC,8DAA2D;AAC3D,8EAA6E;AAC7E,6CAAiD;AACjD,qDAAiD;AAG1C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACzB,YACqB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IACvC,CAAC;IAEL,KAAK,CAAC,MAAM,CAAC,OAAqB,EAAE,CAAuB;QACvD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEtD,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,IAAA,oBAAY,EAAC,GAAG,EAAE,CAAC,IAAA,qCAAkB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACpF,IAAG,KAAK,EAAE,CAAC;YACP,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEtC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;CACJ,CAAA;AAjBY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAQ,GAAE;qCAGuB,8BAAa;GAFlC,gBAAgB,CAiB5B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DeployRouter = void 0;
|
|
13
|
+
const config_service_1 = require("../../config/config.service");
|
|
14
|
+
const provider_1 = require("../../utils/decorators/provider");
|
|
15
|
+
const deploy_controller_1 = require("./deploy.controller");
|
|
16
|
+
const DEPLOY_ENDPOINT_ENABLED = config_service_1.configProvider.getOptionalBoolean('DEPLOY_ENDPOINT_ENABLED');
|
|
17
|
+
let DeployRouter = class DeployRouter {
|
|
18
|
+
constructor(controller) {
|
|
19
|
+
this.controller = controller;
|
|
20
|
+
}
|
|
21
|
+
async getRoutes() {
|
|
22
|
+
if (!DEPLOY_ENDPOINT_ENABLED) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
return [{
|
|
26
|
+
method: 'POST',
|
|
27
|
+
path: '/__mocko__/deploy',
|
|
28
|
+
handler: this.controller.deploy.bind(this.controller),
|
|
29
|
+
rules: {
|
|
30
|
+
mapSilently: true,
|
|
31
|
+
},
|
|
32
|
+
}];
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
exports.DeployRouter = DeployRouter;
|
|
36
|
+
exports.DeployRouter = DeployRouter = __decorate([
|
|
37
|
+
(0, provider_1.Provider)(),
|
|
38
|
+
__metadata("design:paramtypes", [deploy_controller_1.DeployController])
|
|
39
|
+
], DeployRouter);
|
|
40
|
+
//# sourceMappingURL=deploy.router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.router.js","sourceRoot":"","sources":["../../../src/api/deploy/deploy.router.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,gEAA6D;AAC7D,8DAA2D;AAE3D,2DAAuD;AAEvD,MAAM,uBAAuB,GAAG,+BAAc,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;AAGtF,IAAM,YAAY,GAAlB,MAAM,YAAY;IACrB,YACqB,UAA4B;QAA5B,eAAU,GAAV,UAAU,CAAkB;IAC7C,CAAC;IAEL,KAAK,CAAC,SAAS;QACX,IAAG,CAAC,uBAAuB,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO,CAAC;gBACJ,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACrD,KAAK,EAAE;oBACH,WAAW,EAAE,IAAI;iBACpB;aACJ,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAnBY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAQ,GAAE;qCAG0B,oCAAgB;GAFxC,YAAY,CAmBxB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DeployService = void 0;
|
|
13
|
+
const Boom = require("@hapi/boom");
|
|
14
|
+
const service_1 = require("../../utils/decorators/service");
|
|
15
|
+
const config_service_1 = require("../../config/config.service");
|
|
16
|
+
const definition_provider_1 = require("../../definitions/definition.provider");
|
|
17
|
+
const remap_event_bus_1 = require("../../utils/remap-event-bus");
|
|
18
|
+
const utils_1 = require("../../utils/utils");
|
|
19
|
+
const DEPLOY_ENDPOINT_ENABLED = config_service_1.configProvider.getOptionalBoolean('DEPLOY_ENDPOINT_ENABLED');
|
|
20
|
+
const DEPLOY_AUTH_ENABLED = config_service_1.configProvider.getOptionalBoolean('DEPLOY_AUTH_ENABLED') !== false;
|
|
21
|
+
const DEPLOY_SECRET = config_service_1.configProvider.getOptional('DEPLOY_SECRET');
|
|
22
|
+
let DeployService = class DeployService {
|
|
23
|
+
constructor(definitionProvider, remapEventBus) {
|
|
24
|
+
this.definitionProvider = definitionProvider;
|
|
25
|
+
this.remapEventBus = remapEventBus;
|
|
26
|
+
if (DEPLOY_ENDPOINT_ENABLED &&
|
|
27
|
+
DEPLOY_AUTH_ENABLED &&
|
|
28
|
+
!DEPLOY_SECRET) {
|
|
29
|
+
throw new Error('Missing DEPLOY_SECRET config');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
isEnabled() {
|
|
33
|
+
return DEPLOY_ENDPOINT_ENABLED === true;
|
|
34
|
+
}
|
|
35
|
+
authorize(authorization) {
|
|
36
|
+
if (!DEPLOY_AUTH_ENABLED) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const token = (0, utils_1.firstString)(authorization).trim();
|
|
40
|
+
if (!token || token !== `Bearer ${DEPLOY_SECRET}`) {
|
|
41
|
+
throw Boom.unauthorized('Invalid deploy token');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async deploy(definition) {
|
|
45
|
+
this.definitionProvider.setDeployDefinition(definition);
|
|
46
|
+
await this.remapEventBus.emit();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.DeployService = DeployService;
|
|
50
|
+
exports.DeployService = DeployService = __decorate([
|
|
51
|
+
(0, service_1.Service)(),
|
|
52
|
+
__metadata("design:paramtypes", [definition_provider_1.DefinitionProvider,
|
|
53
|
+
remap_event_bus_1.RemapEventBus])
|
|
54
|
+
], DeployService);
|
|
55
|
+
//# sourceMappingURL=deploy.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.service.js","sourceRoot":"","sources":["../../../src/api/deploy/deploy.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAmC;AACnC,4DAAyD;AACzD,gEAA6D;AAC7D,+EAA2E;AAE3E,iEAA4D;AAC5D,6CAAgD;AAEhD,MAAM,uBAAuB,GAAG,+BAAc,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;AAC7F,MAAM,mBAAmB,GAAG,+BAAc,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,KAAK,KAAK,CAAC;AAC/F,MAAM,aAAa,GAAG,+BAAc,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;AAG3D,IAAM,aAAa,GAAnB,MAAM,aAAa;IACtB,YACqB,kBAAsC,EACtC,aAA4B;QAD5B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,kBAAa,GAAb,aAAa,CAAe;QAE7C,IACI,uBAAuB;YACvB,mBAAmB;YACnB,CAAC,aAAa,EAChB,CAAC;YACC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,SAAS;QACL,OAAO,uBAAuB,KAAK,IAAI,CAAC;IAC5C,CAAC;IAED,SAAS,CAAC,aAAiC;QACvC,IAAG,CAAC,mBAAmB,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhD,IAAG,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU,aAAa,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAA2B;QACpC,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;CACJ,CAAA;AAlCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,iBAAO,GAAE;qCAGmC,wCAAkB;QACvB,+BAAa;GAHxC,aAAa,CAkCzB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlagDto = exports.FlagListDto = exports.FlagKeyDto = void 0;
|
|
4
|
+
class FlagKeyDto {
|
|
5
|
+
constructor(type, name) {
|
|
6
|
+
this.type = type;
|
|
7
|
+
this.name = name;
|
|
8
|
+
}
|
|
9
|
+
static of(type, name) {
|
|
10
|
+
return new FlagKeyDto(type, name);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.FlagKeyDto = FlagKeyDto;
|
|
14
|
+
class FlagListDto {
|
|
15
|
+
constructor(flagKeys, isTruncated) {
|
|
16
|
+
this.flagKeys = flagKeys;
|
|
17
|
+
this.isTruncated = isTruncated;
|
|
18
|
+
}
|
|
19
|
+
static of(flagKeys, isTruncated) {
|
|
20
|
+
return new FlagListDto(flagKeys, isTruncated);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.FlagListDto = FlagListDto;
|
|
24
|
+
class FlagDto {
|
|
25
|
+
constructor(value) {
|
|
26
|
+
this.value = value;
|
|
27
|
+
}
|
|
28
|
+
static of(value) {
|
|
29
|
+
return new FlagDto(value);
|
|
30
|
+
}
|
|
31
|
+
static ofJson(value) {
|
|
32
|
+
return new FlagDto(JSON.stringify(value));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.FlagDto = FlagDto;
|
|
36
|
+
//# sourceMappingURL=flag.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.dto.js","sourceRoot":"","sources":["../../../../src/api/flag/data/flag.dto.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IACnB,YACoB,IAAc,EACd,IAAY;QADZ,SAAI,GAAJ,IAAI,CAAU;QACd,SAAI,GAAJ,IAAI,CAAQ;IAC5B,CAAC;IAEL,MAAM,CAAC,EAAE,CAAC,IAAc,EAAE,IAAY;QAClC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ;AATD,gCASC;AAED,MAAa,WAAW;IACpB,YACoB,QAAsB,EACtB,WAAoB;QADpB,aAAQ,GAAR,QAAQ,CAAc;QACtB,gBAAW,GAAX,WAAW,CAAS;IACpC,CAAC;IAEL,MAAM,CAAC,EAAE,CAAC,QAAsB,EAAE,WAAoB;QAClD,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC;CACJ;AATD,kCASC;AAED,MAAa,OAAO;IAChB,YACoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAC7B,CAAC;IAEL,MAAM,CAAC,EAAE,CAAC,KAAa;QACnB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAU;QACpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC;CACJ;AAZD,0BAYC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.FlagController = void 0;
|
|
13
|
+
const Boom = require("@hapi/boom");
|
|
14
|
+
const Joi = require("joi");
|
|
15
|
+
const provider_1 = require("../../utils/decorators/provider");
|
|
16
|
+
const utils_1 = require("../../utils/utils");
|
|
17
|
+
const deploy_service_1 = require("../deploy/deploy.service");
|
|
18
|
+
const flag_service_1 = require("./flag.service");
|
|
19
|
+
const flag_dto_1 = require("./data/flag.dto");
|
|
20
|
+
const setFlagSchema = Joi.object({
|
|
21
|
+
value: Joi.string().required(),
|
|
22
|
+
}).required();
|
|
23
|
+
let FlagController = class FlagController {
|
|
24
|
+
constructor(flagService, deployService) {
|
|
25
|
+
this.flagService = flagService;
|
|
26
|
+
this.deployService = deployService;
|
|
27
|
+
}
|
|
28
|
+
async listFlags(request) {
|
|
29
|
+
this.deployService.authorize(request.headers.authorization);
|
|
30
|
+
const prefix = (0, utils_1.firstString)(request.query['prefix']);
|
|
31
|
+
return await this.flagService.listFlags(prefix);
|
|
32
|
+
}
|
|
33
|
+
async putFlag(request) {
|
|
34
|
+
this.deployService.authorize(request.headers.authorization);
|
|
35
|
+
const key = decodeURIComponent((0, utils_1.firstString)(request.params['key']));
|
|
36
|
+
this.assertValidKey(key);
|
|
37
|
+
const { value } = this.parseSetPayload(request.payload);
|
|
38
|
+
await this.flagService.setFlag(key, this.parseApiValue(value));
|
|
39
|
+
return flag_dto_1.FlagDto.of(value);
|
|
40
|
+
}
|
|
41
|
+
async getFlag(request) {
|
|
42
|
+
this.deployService.authorize(request.headers.authorization);
|
|
43
|
+
const key = decodeURIComponent((0, utils_1.firstString)(request.params['key']));
|
|
44
|
+
const exists = await this.flagService.hasFlag(key);
|
|
45
|
+
if (!exists) {
|
|
46
|
+
throw Boom.notFound(`Flag "${key}" was not found`);
|
|
47
|
+
}
|
|
48
|
+
const flag = await this.flagService.getFlag(key);
|
|
49
|
+
return flag_dto_1.FlagDto.ofJson(flag);
|
|
50
|
+
}
|
|
51
|
+
async deleteFlag(request, h) {
|
|
52
|
+
this.deployService.authorize(request.headers.authorization);
|
|
53
|
+
const key = decodeURIComponent((0, utils_1.firstString)(request.params['key']));
|
|
54
|
+
await this.flagService.delFlag(key);
|
|
55
|
+
return h.response().code(204);
|
|
56
|
+
}
|
|
57
|
+
parseSetPayload(payload) {
|
|
58
|
+
const validation = setFlagSchema.validate(payload, {
|
|
59
|
+
abortEarly: false,
|
|
60
|
+
stripUnknown: true,
|
|
61
|
+
});
|
|
62
|
+
if (validation.error) {
|
|
63
|
+
throw Boom.badRequest(validation.error.message);
|
|
64
|
+
}
|
|
65
|
+
return validation.value;
|
|
66
|
+
}
|
|
67
|
+
parseApiValue(value) {
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(value);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw Boom.badRequest('Flag value must be valid JSON. If you want to save a string, wrap it in double quotes.');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
assertValidKey(key) {
|
|
76
|
+
if (!key.trim()) {
|
|
77
|
+
throw Boom.badRequest('Flag key is required');
|
|
78
|
+
}
|
|
79
|
+
if (key.startsWith(':') || key.endsWith(':') || key.includes('::')) {
|
|
80
|
+
throw Boom.badRequest("Flag key cannot start or end with ':' or contain empty sections like '::'");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
exports.FlagController = FlagController;
|
|
85
|
+
exports.FlagController = FlagController = __decorate([
|
|
86
|
+
(0, provider_1.Provider)(),
|
|
87
|
+
__metadata("design:paramtypes", [flag_service_1.FlagService,
|
|
88
|
+
deploy_service_1.DeployService])
|
|
89
|
+
], FlagController);
|
|
90
|
+
//# sourceMappingURL=flag.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.controller.js","sourceRoot":"","sources":["../../../src/api/flag/flag.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.FlagMemoryRepository = void 0;
|
|
10
|
+
const service_1 = require("../../utils/decorators/service");
|
|
11
|
+
let FlagMemoryRepository = class FlagMemoryRepository {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.flags = new Map();
|
|
14
|
+
}
|
|
15
|
+
async set(key, value, _ttlMillis) {
|
|
16
|
+
this.flags.set(key, value);
|
|
17
|
+
}
|
|
18
|
+
async get(key) {
|
|
19
|
+
return this.flags.get(key);
|
|
20
|
+
}
|
|
21
|
+
async del(key) {
|
|
22
|
+
this.flags.delete(key);
|
|
23
|
+
}
|
|
24
|
+
async has(key) {
|
|
25
|
+
return this.flags.has(key);
|
|
26
|
+
}
|
|
27
|
+
async listFlags(prefix) {
|
|
28
|
+
return Array.from(this.flags.keys())
|
|
29
|
+
.filter((key) => key.startsWith(prefix))
|
|
30
|
+
.sort((a, b) => a.localeCompare(b));
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.FlagMemoryRepository = FlagMemoryRepository;
|
|
34
|
+
exports.FlagMemoryRepository = FlagMemoryRepository = __decorate([
|
|
35
|
+
(0, service_1.Service)()
|
|
36
|
+
], FlagMemoryRepository);
|
|
37
|
+
//# sourceMappingURL=flag.memory-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.memory-repository.js","sourceRoot":"","sources":["../../../src/api/flag/flag.memory-repository.ts"],"names":[],"mappings":";;;;;;;;;AAAA,4DAAuD;AAIhD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QACc,UAAK,GAAqB,IAAI,GAAG,EAAE,CAAC;IAuBzD,CAAC;IArBG,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,UAAmB;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC/B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;CACJ,CAAA;AAxBY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,iBAAO,GAAE;GACG,oBAAoB,CAwBhC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.FlagRedisRepository = void 0;
|
|
13
|
+
const redis_provider_1 = require("../../redis/redis.provider");
|
|
14
|
+
const service_1 = require("../../utils/decorators/service");
|
|
15
|
+
const Boom = require("@hapi/boom");
|
|
16
|
+
let FlagRedisRepository = class FlagRedisRepository {
|
|
17
|
+
constructor(redis) {
|
|
18
|
+
this.redis = redis;
|
|
19
|
+
this.FLAG_PREFIX = 'flags:';
|
|
20
|
+
this.MANAGED_API_UNSUPPORTED_MESSAGE = 'Redis flags cannot be accessed via api here';
|
|
21
|
+
}
|
|
22
|
+
async set(key, value, ttlMillis) {
|
|
23
|
+
await this.redis.set(this.FLAG_PREFIX + key, value, ttlMillis);
|
|
24
|
+
}
|
|
25
|
+
async get(key) {
|
|
26
|
+
return await this.redis.get(this.FLAG_PREFIX + key);
|
|
27
|
+
}
|
|
28
|
+
async del(key) {
|
|
29
|
+
await this.redis.del(this.FLAG_PREFIX + key);
|
|
30
|
+
}
|
|
31
|
+
async has(key) {
|
|
32
|
+
const value = await this.get(key);
|
|
33
|
+
return value !== null;
|
|
34
|
+
}
|
|
35
|
+
async listFlags(_prefix) {
|
|
36
|
+
throw Boom.badData(this.MANAGED_API_UNSUPPORTED_MESSAGE);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.FlagRedisRepository = FlagRedisRepository;
|
|
40
|
+
exports.FlagRedisRepository = FlagRedisRepository = __decorate([
|
|
41
|
+
(0, service_1.Service)(),
|
|
42
|
+
__metadata("design:paramtypes", [redis_provider_1.RedisProvider])
|
|
43
|
+
], FlagRedisRepository);
|
|
44
|
+
//# sourceMappingURL=flag.redis-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.redis-repository.js","sourceRoot":"","sources":["../../../src/api/flag/flag.redis-repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+DAA2D;AAC3D,4DAAuD;AAEvD,mCAAmC;AAG5B,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAK5B,YACqB,KAAoB;QAApB,UAAK,GAAL,KAAK,CAAe;QALxB,gBAAW,GAAG,QAAQ,CAAC;QACvB,oCAA+B,GAC5C,6CAA6C,CAAC;IAI9C,CAAC;IAEL,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,SAAkB;QACjD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,KAAK,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7D,CAAC;CACJ,CAAA;AA7BY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,iBAAO,GAAE;qCAOsB,8BAAa;GANhC,mBAAmB,CA6B/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.repository.js","sourceRoot":"","sources":["../../../src/api/flag/flag.repository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.FlagRouter = void 0;
|
|
13
|
+
const provider_1 = require("../../utils/decorators/provider");
|
|
14
|
+
const flag_controller_1 = require("./flag.controller");
|
|
15
|
+
let FlagRouter = class FlagRouter {
|
|
16
|
+
constructor(controller) {
|
|
17
|
+
this.controller = controller;
|
|
18
|
+
}
|
|
19
|
+
async getRoutes() {
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
method: 'GET',
|
|
23
|
+
path: '/__mocko__/flags',
|
|
24
|
+
handler: this.controller.listFlags.bind(this.controller),
|
|
25
|
+
rules: {
|
|
26
|
+
mapSilently: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
method: 'GET',
|
|
31
|
+
path: '/__mocko__/flags/{key}',
|
|
32
|
+
handler: this.controller.getFlag.bind(this.controller),
|
|
33
|
+
rules: {
|
|
34
|
+
mapSilently: true,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
method: 'PUT',
|
|
39
|
+
path: '/__mocko__/flags/{key}',
|
|
40
|
+
handler: this.controller.putFlag.bind(this.controller),
|
|
41
|
+
rules: {
|
|
42
|
+
mapSilently: true,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
method: 'DELETE',
|
|
47
|
+
path: '/__mocko__/flags/{key}',
|
|
48
|
+
handler: this.controller.deleteFlag.bind(this.controller),
|
|
49
|
+
rules: {
|
|
50
|
+
mapSilently: true,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
exports.FlagRouter = FlagRouter;
|
|
57
|
+
exports.FlagRouter = FlagRouter = __decorate([
|
|
58
|
+
(0, provider_1.Provider)(),
|
|
59
|
+
__metadata("design:paramtypes", [flag_controller_1.FlagController])
|
|
60
|
+
], FlagRouter);
|
|
61
|
+
//# sourceMappingURL=flag.router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.router.js","sourceRoot":"","sources":["../../../src/api/flag/flag.router.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,8DAA2D;AAE3D,uDAAmD;AAG5C,IAAM,UAAU,GAAhB,MAAM,UAAU;IACnB,YACqB,UAA0B;QAA1B,eAAU,GAAV,UAAU,CAAgB;IAC3C,CAAC;IAEL,KAAK,CAAC,SAAS;QACX,OAAO;YACH;gBACI,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACxD,KAAK,EAAE;oBACH,WAAW,EAAE,IAAI;iBACpB;aACJ;YACD;gBACI,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtD,KAAK,EAAE;oBACH,WAAW,EAAE,IAAI;iBACpB;aACJ;YACD;gBACI,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtD,KAAK,EAAE;oBACH,WAAW,EAAE,IAAI;iBACpB;aACJ;YACD;gBACI,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBACzD,KAAK,EAAE;oBACH,WAAW,EAAE,IAAI;iBACpB;aACJ;SACJ,CAAC;IACN,CAAC;CACJ,CAAA;AAzCY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAQ,GAAE;qCAG0B,gCAAc;GAFtC,UAAU,CAyCtB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.FlagService = void 0;
|
|
13
|
+
const redis_provider_1 = require("../../redis/redis.provider");
|
|
14
|
+
const service_1 = require("../../utils/decorators/service");
|
|
15
|
+
const flag_memory_repository_1 = require("./flag.memory-repository");
|
|
16
|
+
const flag_redis_repository_1 = require("./flag.redis-repository");
|
|
17
|
+
const config_service_1 = require("../../config/config.service");
|
|
18
|
+
const flag_dto_1 = require("./data/flag.dto");
|
|
19
|
+
const FLAG_LIST_LIMIT = config_service_1.configProvider.getNumber('FLAGS_LIST-LIMIT');
|
|
20
|
+
let FlagService = class FlagService {
|
|
21
|
+
constructor(redis, memoryRepository, redisRepository) {
|
|
22
|
+
this.redis = redis;
|
|
23
|
+
this.memoryRepository = memoryRepository;
|
|
24
|
+
this.redisRepository = redisRepository;
|
|
25
|
+
if (this.redis.isEnabled) {
|
|
26
|
+
this.repository = this.redisRepository;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.repository = this.memoryRepository;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async setFlag(key, value, ttlMillis) {
|
|
33
|
+
await this.repository.set(key, value, ttlMillis);
|
|
34
|
+
}
|
|
35
|
+
async getFlag(key) {
|
|
36
|
+
return await this.repository.get(key);
|
|
37
|
+
}
|
|
38
|
+
async delFlag(key) {
|
|
39
|
+
await this.repository.del(key);
|
|
40
|
+
}
|
|
41
|
+
async hasFlag(key) {
|
|
42
|
+
return await this.repository.has(key);
|
|
43
|
+
}
|
|
44
|
+
async listFlags(prefix) {
|
|
45
|
+
const normalizedPrefix = this.normalizePrefix(prefix);
|
|
46
|
+
const keys = await this.repository.listFlags(normalizedPrefix);
|
|
47
|
+
const groups = new Set();
|
|
48
|
+
const flags = [];
|
|
49
|
+
let isTruncated = false;
|
|
50
|
+
for (const key of keys) {
|
|
51
|
+
if (groups.size + flags.length >= FLAG_LIST_LIMIT) {
|
|
52
|
+
isTruncated = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
const relativeKey = normalizedPrefix.length > 0
|
|
56
|
+
? key.substring(normalizedPrefix.length)
|
|
57
|
+
: key;
|
|
58
|
+
if (!relativeKey) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (relativeKey.includes(':')) {
|
|
62
|
+
groups.add(relativeKey.split(':')[0]);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
flags.push(relativeKey);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const flagKeys = [
|
|
69
|
+
...Array.from(groups).map((name) => flag_dto_1.FlagKeyDto.of('PREFIX', name)),
|
|
70
|
+
...flags.map((name) => flag_dto_1.FlagKeyDto.of('FLAG', name)),
|
|
71
|
+
];
|
|
72
|
+
return flag_dto_1.FlagListDto.of(flagKeys, isTruncated);
|
|
73
|
+
}
|
|
74
|
+
normalizePrefix(prefix) {
|
|
75
|
+
if (!prefix) {
|
|
76
|
+
return '';
|
|
77
|
+
}
|
|
78
|
+
return prefix.endsWith(':') ? prefix : `${prefix}:`;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
exports.FlagService = FlagService;
|
|
82
|
+
exports.FlagService = FlagService = __decorate([
|
|
83
|
+
(0, service_1.Service)(),
|
|
84
|
+
__metadata("design:paramtypes", [redis_provider_1.RedisProvider,
|
|
85
|
+
flag_memory_repository_1.FlagMemoryRepository,
|
|
86
|
+
flag_redis_repository_1.FlagRedisRepository])
|
|
87
|
+
], FlagService);
|
|
88
|
+
//# sourceMappingURL=flag.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag.service.js","sourceRoot":"","sources":["../../../src/api/flag/flag.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.HealthController = void 0;
|
|
13
|
+
const provider_1 = require("../../utils/decorators/provider");
|
|
14
|
+
const health_service_1 = require("./health.service");
|
|
15
|
+
let HealthController = class HealthController {
|
|
16
|
+
constructor(service) {
|
|
17
|
+
this.service = service;
|
|
18
|
+
}
|
|
19
|
+
async healthCheck(request, h) {
|
|
20
|
+
const revision = await this.service.healthCheck();
|
|
21
|
+
return h.response({ revision })
|
|
22
|
+
.code(200);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.HealthController = HealthController;
|
|
26
|
+
exports.HealthController = HealthController = __decorate([
|
|
27
|
+
(0, provider_1.Provider)(),
|
|
28
|
+
__metadata("design:paramtypes", [health_service_1.HealthService])
|
|
29
|
+
], HealthController);
|
|
30
|
+
//# sourceMappingURL=health.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../../src/api/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8DAAyD;AAEzD,qDAA+C;AAGxC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACzB,YACqB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IACvC,CAAC;IAEL,KAAK,CAAC,WAAW,CAAC,OAAqB,EAAE,CAAuB;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;aAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ,CAAA;AAVY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAQ,GAAE;qCAGuB,8BAAa;GAFlC,gBAAgB,CAU5B"}
|