@diia-inhouse/features 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/index.js +3 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/services/feature.js +91 -0
- package/dist/services/feature.js.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/interfaces/index.d.ts +22 -0
- package/dist/types/services/feature.d.ts +20 -0
- package/dist/types/services/index.d.ts +1 -0
- package/package.json +86 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./interfaces"), exports);
|
|
18
|
+
__exportStar(require("./services"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAE5B,6CAA0B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FeatureService = void 0;
|
|
7
|
+
const semver_1 = __importDefault(require("semver"));
|
|
8
|
+
const unleash_client_1 = require("unleash-client");
|
|
9
|
+
class FeatureService {
|
|
10
|
+
serviceName;
|
|
11
|
+
featureConfig;
|
|
12
|
+
logger;
|
|
13
|
+
envService;
|
|
14
|
+
asyncLocalStorage;
|
|
15
|
+
unleash = null;
|
|
16
|
+
constructor(serviceName, featureConfig, logger, envService, asyncLocalStorage) {
|
|
17
|
+
this.serviceName = serviceName;
|
|
18
|
+
this.featureConfig = featureConfig;
|
|
19
|
+
this.logger = logger;
|
|
20
|
+
this.envService = envService;
|
|
21
|
+
this.asyncLocalStorage = asyncLocalStorage;
|
|
22
|
+
}
|
|
23
|
+
async onInit() {
|
|
24
|
+
const { isEnabled, url, apiToken } = this.featureConfig;
|
|
25
|
+
if (!isEnabled) {
|
|
26
|
+
this.logger.info('Unleash is disabled. All feature flags are set to false');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.unleash = await (0, unleash_client_1.startUnleash)({
|
|
30
|
+
url,
|
|
31
|
+
appName: this.serviceName,
|
|
32
|
+
customHeaders: { Authorization: apiToken },
|
|
33
|
+
environment: this.envService.isProd() ? 'production' : 'development',
|
|
34
|
+
tags: [{ name: 'microservice', value: this.serviceName }],
|
|
35
|
+
});
|
|
36
|
+
this.unleash.on('warn', (err) => {
|
|
37
|
+
this.logger.warn('Unleash warn event', { err });
|
|
38
|
+
});
|
|
39
|
+
this.unleash.on('error', (err) => {
|
|
40
|
+
this.logger.error('Unleash error event', { err });
|
|
41
|
+
});
|
|
42
|
+
this.logger.info('Unleash has started');
|
|
43
|
+
}
|
|
44
|
+
isEnabled(name, context = {}) {
|
|
45
|
+
if (!this.unleash) {
|
|
46
|
+
this.logger.warn('Unleash is disabled');
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const alsStore = this.asyncLocalStorage.getStore() ?? {};
|
|
50
|
+
context.userId ??= alsStore.logData?.userIdentifier;
|
|
51
|
+
context.userIdBase64 ??= context.userId && Buffer.from(context.userId, 'hex').toString('base64');
|
|
52
|
+
context.sessionType ??= alsStore.logData?.sessionType;
|
|
53
|
+
context.platformType ??= alsStore.headers?.platformType;
|
|
54
|
+
context.platformVersion ??= alsStore.headers?.platformVersion;
|
|
55
|
+
context.platformVersion = semver_1.default.coerce(context.platformVersion)?.version;
|
|
56
|
+
context.appVersion ??= alsStore.headers?.appVersion;
|
|
57
|
+
context.appVersion = this.parseAppVersion(context.appVersion);
|
|
58
|
+
context.currentTime ??= new Date();
|
|
59
|
+
this.logger.debug('Feature flag check', { name, context });
|
|
60
|
+
const result = this.unleash.isEnabled(name, context);
|
|
61
|
+
if (result) {
|
|
62
|
+
alsStore.logData ??= {};
|
|
63
|
+
alsStore.logData.flags ??= [];
|
|
64
|
+
alsStore.logData.flags.push(name);
|
|
65
|
+
this.asyncLocalStorage.enterWith(alsStore);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
isSomeEnabled(name, contexts) {
|
|
70
|
+
return contexts.some((context) => this.isEnabled(name, context));
|
|
71
|
+
}
|
|
72
|
+
getDefinition(name) {
|
|
73
|
+
return this.unleash?.getFeatureToggleDefinition(name);
|
|
74
|
+
}
|
|
75
|
+
parseAppVersion(appVersion) {
|
|
76
|
+
if (!appVersion) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const parts = appVersion.split('.');
|
|
80
|
+
if (parts.length === 3) {
|
|
81
|
+
return appVersion;
|
|
82
|
+
}
|
|
83
|
+
if (parts.length === 4) {
|
|
84
|
+
return parts.slice(0, 3).join('.') + `-${parts[3]}`;
|
|
85
|
+
}
|
|
86
|
+
this.logger.warn('Invalid app version format for feature flag', { appVersion });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.FeatureService = FeatureService;
|
|
91
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/services/feature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./feature"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Context } from 'unleash-client';
|
|
2
|
+
import { PlatformType, ProfileFeature, SessionType } from '@diia-inhouse/types';
|
|
3
|
+
export { FeatureInterface } from 'unleash-client/lib/feature';
|
|
4
|
+
export interface FeatureConfig {
|
|
5
|
+
isEnabled: boolean;
|
|
6
|
+
url: string;
|
|
7
|
+
apiToken: string;
|
|
8
|
+
}
|
|
9
|
+
export interface FeatureContext extends Context {
|
|
10
|
+
/**
|
|
11
|
+
* Base64 encoded userIdentifier. Due to Unleash limitation max 100 chars per value we can't use userIdentifier (sha512 hex representation) for unleash values as his length is 128.
|
|
12
|
+
* But at the same time base64 representation of it is 88 chars long which is fine.
|
|
13
|
+
*/
|
|
14
|
+
userIdBase64?: string;
|
|
15
|
+
platformType?: PlatformType;
|
|
16
|
+
/** semver major(.minor)(.patch) */
|
|
17
|
+
platformVersion?: string;
|
|
18
|
+
/** semver major.minor.patch(.build) */
|
|
19
|
+
appVersion?: string;
|
|
20
|
+
sessionType?: SessionType;
|
|
21
|
+
profileFeature?: ProfileFeature;
|
|
22
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
import { FeatureInterface } from 'unleash-client/lib/feature';
|
|
4
|
+
import type { EnvService } from '@diia-inhouse/env';
|
|
5
|
+
import { AlsData, Logger, OnInit } from '@diia-inhouse/types';
|
|
6
|
+
import { FeatureConfig, FeatureContext } from '../interfaces';
|
|
7
|
+
export declare class FeatureService implements OnInit {
|
|
8
|
+
private readonly serviceName;
|
|
9
|
+
private readonly featureConfig;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly envService;
|
|
12
|
+
private readonly asyncLocalStorage;
|
|
13
|
+
private unleash;
|
|
14
|
+
constructor(serviceName: string, featureConfig: FeatureConfig, logger: Logger, envService: EnvService, asyncLocalStorage: AsyncLocalStorage<AlsData>);
|
|
15
|
+
onInit(): Promise<void>;
|
|
16
|
+
isEnabled(name: string, context?: FeatureContext): boolean;
|
|
17
|
+
isSomeEnabled(name: string, contexts: FeatureContext[]): boolean;
|
|
18
|
+
getDefinition(name: string): FeatureInterface | undefined;
|
|
19
|
+
private parseAppVersion;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './feature';
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@diia-inhouse/features",
|
|
3
|
+
"version": "2.3.1",
|
|
4
|
+
"description": "Features toggles",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/types/index.d.ts",
|
|
7
|
+
"repository": "https://gitlab.diia.org.ua/diia-inhouse/pkg-features.git",
|
|
8
|
+
"author": "Diia",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=18"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"prebuild": "rimraf dist",
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"semantic-release": "semantic-release",
|
|
20
|
+
"start": "npm run build && node dist/index.js",
|
|
21
|
+
"lint": "eslint --ext .ts . && prettier --check .",
|
|
22
|
+
"lint-fix": "eslint '*/**/*.{js,ts}' --fix && prettier --write .",
|
|
23
|
+
"lint:lockfile": "lockfile-lint --path package-lock.json --allowed-hosts registry.npmjs.org gitlab.diia.org.ua --validate-https",
|
|
24
|
+
"prepare": "npm run build",
|
|
25
|
+
"test": "jest",
|
|
26
|
+
"test:unit": "npm run test --selectProjects unit",
|
|
27
|
+
"test:integration": "npm run test --selectProjects integration --",
|
|
28
|
+
"test:coverage": "npm run test --selectProjects unit --coverage",
|
|
29
|
+
"find-circulars": "madge --circular --extensions ts ./"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"semver": "7.6.2",
|
|
33
|
+
"unleash-client": "5.5.5"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@diia-inhouse/env": ">=1.14.0",
|
|
37
|
+
"@diia-inhouse/types": ">=6.34.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@commitlint/cli": "19.3.0",
|
|
41
|
+
"@diia-inhouse/configs": "1.32.0",
|
|
42
|
+
"@diia-inhouse/diia-logger": "3.3.0",
|
|
43
|
+
"@diia-inhouse/env": "1.16.0",
|
|
44
|
+
"@diia-inhouse/errors": "1.10.0",
|
|
45
|
+
"@diia-inhouse/eslint-config": "5.1.0",
|
|
46
|
+
"@diia-inhouse/test": "6.4.0",
|
|
47
|
+
"@diia-inhouse/types": "6.34.1",
|
|
48
|
+
"@types/node": "20.14.9",
|
|
49
|
+
"lockfile-lint": "4.14.0",
|
|
50
|
+
"madge": "7.0.0",
|
|
51
|
+
"rimraf": "5.0.7",
|
|
52
|
+
"semantic-release": "21.1.2"
|
|
53
|
+
},
|
|
54
|
+
"release": {
|
|
55
|
+
"extends": "@diia-inhouse/configs/dist/semantic-release/package",
|
|
56
|
+
"branches": [
|
|
57
|
+
"main"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
"commitlint": {
|
|
61
|
+
"extends": "@diia-inhouse/configs/dist/commitlint"
|
|
62
|
+
},
|
|
63
|
+
"eslintConfig": {
|
|
64
|
+
"extends": "@diia-inhouse/eslint-config",
|
|
65
|
+
"overrides": [
|
|
66
|
+
{
|
|
67
|
+
"files": [
|
|
68
|
+
"*.ts"
|
|
69
|
+
],
|
|
70
|
+
"parserOptions": {
|
|
71
|
+
"project": [
|
|
72
|
+
"./tsconfig.json",
|
|
73
|
+
"./tests/tsconfig.json"
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"prettier": "@diia-inhouse/eslint-config/prettier",
|
|
80
|
+
"madge": {
|
|
81
|
+
"tsConfig": "./tsconfig.json"
|
|
82
|
+
},
|
|
83
|
+
"jest": {
|
|
84
|
+
"preset": "@diia-inhouse/configs/dist/jest"
|
|
85
|
+
}
|
|
86
|
+
}
|