pmb0 / nestjs-unleash Goto Github PK
View Code? Open in Web Editor NEWUnleash feature toggle support for NestJS
License: MIT License
Unleash feature toggle support for NestJS
License: MIT License
Hey team! ๐
It looks like we're not using options.imports
and passing them further down into forRoot
and forRootAsync
(potentially other places?)
https://github.com/pmb0/nestjs-unleash/blob/master/src/unleash/unleash.module.ts#L100
I believe we need something as simple as [ ...options.imports ]
.
Just wanted to create an issue to get the conversation started!
Hi, I'm trying to register the UnleashModule in my root app.module with the forRootAsync
function and i get the following error:
[Nest] 6291 - 09/12/2021, 12:42:22 PM LOG [NestFactory] Starting Nest application...
[Nest] 6291 - 09/12/2021, 12:42:22 PM ERROR [ExceptionHandler] Nest cannot export a provider/module that is not a part of the currently processed module (UnleashModule). Please verify whether the exported UnleashStrategiesModule is available in this particular context.
Possible Solutions:
import { UnleashModule } from 'nestjs-unleash';
@Module({
imports: [
ConfigModule.forRoot(),
UnleashModule.forRootAsync({
useFactory: (config: ConfigService) => {
return {
url: config.get('UNLEASH_URL'),
appName: config.get('UNLEASH_APP_NAME'),
instanceId: config.get('UNLEASH_INSTANCE_ID'),
};
},
inject: [ConfigService],
}),
],
controllers: [
AppController,
],
providers: [
AppService,
],
})
export class AppModule {
}
package.json:
{
"dependencies": {
"@nestjs/axios": "0.0.1",
"@nestjs/common": "^8.0.1",
"@nestjs/config": "^1.0.0",
"@nestjs/core": "^8.0.1",
"@nestjs/event-emitter": "^1.0.0",
"@nestjs/jwt": "^8.0.0",
"@nestjs/passport": "^8.0.0",
"@nestjs/platform-express": "^8.0.1",
"@nestjs/schedule": "^1.0.1",
"@prisma/client": "^2.26.0",
"axios": "^0.21.1",
"bcrypt": "^5.0.1",
"cloudevents": "^4.0.3",
"hash-wasm": "^4.8.0",
"mssql": "^7.1.3",
"nestjs-unleash": "^2.0.0",
"passport": "^0.4.1",
"passport-jwt": "^4.0.0",
"passport-local": "^1.0.0",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^6.6.6"
}
}
As part of the official packages, you can always pass in the context object, but in this library, you cannot. The context is only part of the request and is piggybacking on it. Why is it so?
Let's assume I have some context which is calculated as part of the service/controller and doesn't arrive from the client in the Request, using this library it seems I can't use that data as part of the context.
Can this somehow be altered?
Thanks!
P.S
I was sure at the beginning it's just a wrapper around the node SDK, but you actually wrote everything from scratch! That's amazing!
I'm using this lib with the gitlab feature flipping, however, I got a stacktrace on startup saying that the Request: POST https://git.corp.dawex.net/api/v4/feature_flags/unleash/326/register
failed with 404.
My understanding is that gitlab does not support registering app through the unleash api.
I would like to be able to disable registration so I don"t have those calls made
I had to check the source code to understand why my strategy was not called.
After some digging, I happily found out that there was some strategies already implemented. It would be nice to have a list of the implemented strategies and how they work
Since the way we write strategies in this package isn't like the regular client, we can't reuse our strategies in the proxy that is needed for anyone that has also a front-end/mobile app.
I've created a helper that allows to dynamically use the nestjs strategies in the regular proxy.
import { UnleashStrategy, UnleashContext } from 'nestjs-unleash';
import { Strategy, Context } from 'unleash-client';
export function ProxifyStrategy(type: { new (): UnleashStrategy }): Strategy {
// do stuff to return new instance of T.
return new ProxyStrategy(new type());
}
export class ProxyStrategy extends Strategy {
/**
*
*/
constructor(private readonly strategy: UnleashStrategy) {
super(strategy.name);
}
isEnabled(parameters: any, context: Context): boolean {
return this.strategy.isEnabled(
parameters,
this.contextToUnleashContext(context),
);
}
contextToUnleashContext(context: Context): UnleashContext {
let request: any = {};
const unleashContext = new UnleashContext(
{
session: context.sessionId ? { id: context.sessionId } : undefined,
user: context.userId ? { id: context.userId } : undefined,
ip: context.remoteAddress,
},
{ url: '', appName: context.appName ?? '', instanceId: '' }, // Just fill so it works
);
unleashContext.extend(context.properties);
return unleashContext;
}
}
And you use it like this:
import { ProxifyStrategy } from "./proxy-strategy";
import { RelatedEnterpriseStrategy } from '@precise/nestjs-utils/dist/unleash';
require('dotenv').config()
const { createApp } = require('@unleash/proxy');
const app = createApp({
unleashUrl: process.env.UNLEASH_URL,
unleashApiToken: process.env.UNLEASH_API_TOKEN,
proxySecrets: [process.env.PROXY_SECRET],
refreshInterval: process.env.REFRESH_INTERVAL,
customStrategies: [ProxifyStrategy(RelatedEnterpriseStrategy)]
// logLevel: 'info',
// projectName: 'order-team',
// environment: 'development',
});
app.listen(process.env.PORT, () =>
// eslint-disable-next-line no-console
console.log(`Unleash Proxy listening on http://localhost:${process.env.PORT}/proxy`),
);
Hi, when I'm running it directly in my pc via npm run start it's working but when I't trying to run it in docker I'm getting below error.
I'm not sure where it's coming from. Do you have any idea what might be the reason?
bot-gateway_1 | ...(options.extraProviders ?? []),
bot-gateway_1 | ^
bot-gateway_1 |
bot-gateway_1 | SyntaxError: Unexpected token '?'
bot-gateway_1 | at Module._compile (internal/modules/cjs/loader.js:895:18)
bot-gateway_1 | at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
bot-gateway_1 | at Module.load (internal/modules/cjs/loader.js:815:32)
bot-gateway_1 | at Function.Module._load (internal/modules/cjs/loader.js:727:14)
bot-gateway_1 | at Module.require (internal/modules/cjs/loader.js:852:19)
bot-gateway_1 | at Module.Hook._require.Module.require (/usr/src/app/node_modules/require-in-the-middle/index.js:80:39)
bot-gateway_1 | at require (internal/modules/cjs/helpers.js:74:18)
bot-gateway_1 | at Object.<anonymous> (/usr/src/app/node_modules/nestjs-unleash/src/unleash-strategies/index.ts:3:1)
bot-gateway_1 | at Module._compile (internal/modules/cjs/loader.js:959:30)
bot-gateway_1 | at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
My dependencies
"dependencies": {
"@google-cloud/bigquery": "^5.5.0",
"@google-cloud/pubsub": "^2.7.0",
"@google-cloud/trace-agent": "^5.1.1",
"@nestjs/common": "^7.6.1",
"@nestjs/config": "^0.4.2",
"@nestjs/core": "^7.6.1",
"@nestjs/jwt": "^7.2.0",
"@nestjs/passport": "^7.1.5",
"@nestjs/platform-express": "^7.6.1",
"@nestjs/schedule": "^0.4.1",
"@nestjs/swagger": "^4.7.6",
"@nestjs/terminus": "^7.0.1",
"class-transformer": "^0.2.3",
"class-validator": "^0.12.2",
"compression": "^1.7.4",
"dayjs": "^1.9.7",
"dotenv": "^8.2.0",
"gcp-metadata": "^4.2.1",
"helmet": "^3.23.3",
"lru-cache": "^6.0.0",
"measurement-protocol": "^0.1.1",
"nestjs-pino": "^1.3.0",
"nestjs-unleash": "^1.2.0",
"passport": "^0.4.1",
"passport-http": "^0.3.0",
"passport-local": "^1.0.0",
"pino-pretty": "^4.3.0",
"pino-stackdriver": "2.1.1",
"reflect-metadata": "^0.1.13",
"rxjs": "^6.6.3",
"source-map-support": "0.5.18"
},
"devDependencies": {
"@nestjs/cli": "^7.5.4",
"@nestjs/schematics": "^7.2.5",
"@nestjs/testing": "^7.6.1",
"@types/express": "^4.17.9",
"@types/helmet": "0.0.47",
"@types/jest": "25.1.4",
"@types/lru-cache": "^5.1.0",
"@types/node": "^13.13.36",
"@types/passport-http": "^0.3.8",
"@types/passport-local": "^1.0.33",
"@types/supertest": "^2.0.10",
"@types/universal-analytics": "^0.4.4",
"@typescript-eslint/eslint-plugin": "^2.34.0",
"@typescript-eslint/parser": "^2.34.0",
"commander": "^6.2.1",
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.15.0",
"eslint-plugin-import": "^2.22.1",
"husky": "^4.3.6",
"jest": "^26.6.3",
"jest-junit": "10.0.0",
"prettier": "^1.19.1",
"pretty-quick": "^2.0.2",
"supertest": "^4.0.2",
"ts-jest": "25.5.0",
"ts-loader": "^6.2.1",
"ts-node": "^8.10.2",
"tsconfig-paths": "^3.9.0",
"typescript": "^4.1.3"
},
Hello ๐
Thank you for this awesome package!
In my case, I want debugging logs, but I don't really need to get one logging message each time features are updated. Maybe it could be a way to deactivate it, or maybe there is?
There is no way to use variants using this library.
Any chance you can add it?
Thanks!
P.S if you need assistance let me know, but I'm unsure as to when I'll be able to do it.
It's not really clear what to provide when configuring the module,
maybe do this instead
UnleashModule.forRoot({
url: 'https://<path-to-your-unleash-server>/api/client',
appName: '<name-of-your-app-on-unleash>',
instanceId: '<pick-a-unique-id-to-identify-this-nest-server-on-unleash>',
http: {
headers: {
Authorization:
'<your-token-for-the-environment>',
},
},
}),
The nestjs/axios package has been bumped to version 2.0.0. Our project uses nestjs/axios, which makes it difficult to use this package.
In the peerDependencies of this package, the version of @nestjs/axios is listed as "^1.0.1". I understand that this does not support 2.0.0.
I would like to fork this package, update the peer dependencies, and then apply it to my project, is this a good way to do it? I would be grateful if you could point me to a good way.
There are no metrics reports or application reports.
This is over my head to assist, no idea how this works.
When using UnleashModule
in a WebSocketGateway, services are no longer instanciated.
When trying to use a service, it is always undefined.
If I use this.debuggerService.info
I'll get an error "Cannot use info of undefined".
If I don't inject UnleashModule
(or a service using UnleashModule
) I don't have the issue.
Getting a error TS1110: Type expected
from https://github.com/pmb0/nestjs-unleash/blob/master/src/unleash-strategies/strategy/flexible-rollout.ts#L14 when starting up my nest application. I'm not familiar with this syntax, is there something in the typescript compiler settings that need to be turned on in order to get this module to compile?
It would be nice to be abe to customize how the user id is computed, as it might not be the one in the user object of a context
When trying to build my project using this repo I'm getting below error.
Should I add @nestjs/schedule into my package (which should be noted in readme.md) or it will be added into unleash repo?
nest build
node_modules/nestjs-unleash/dist/src/unleash/updaters/base-updater.d.ts:2:35 - error TS2307: Cannot find module '@nestjs/schedule' or its corresponding type declarations.
2 import { SchedulerRegistry } from '@nestjs/schedule';
~~~~~~~~~~~~~~~~~~
node_modules/nestjs-unleash/dist/src/unleash/updaters/metrics-updater.service.d.ts:1:35 - error TS2307: Cannot find module '@nestjs/schedule' or its corresponding type declarations.
1 import { SchedulerRegistry } from '@nestjs/schedule';
~~~~~~~~~~~~~~~~~~
node_modules/nestjs-unleash/dist/src/unleash/updaters/toggles-updater.service.d.ts:1:35 - error TS2307: Cannot find module '@nestjs/schedule' or its corresponding type declarations.
1 import { SchedulerRegistry } from '@nestjs/schedule';
~~~~~~~~~~~~~~~~~~
Found 3 error(s).
I have a pending PR for months without any feedback, issues opened, nothing.
If this project is dead or deprecated it should be stated, as the implementation here isn't just wrapper to the original node library, but a full rehaul.
Hey, can you please bump the peer deps up to nest-js v9?
Hello,
I used this repo, and try to implement context values - it doesn't work :(
Do you have any solutions for it ?
Is this project still maintained ?
Thank you.
I've added a toggle with a standard startegy and added a constraint that a context value should be in a list of values.
the unleash playground evaluated the flag correctly.
seems like the node-sdk supports this
The logs are useful for development but spammy in production environments, although we can filter it out in Logger interface, it would be even better if this was an option to turn on/off in the library itself
Hi, I'm trying to use your plugin with nestjs and Typescript but all the time I'm getting error that module was not found
import { IfEnabled } from "nestjs-unleash";
Cannot find module 'nestjs-unleash' or its corresponding type declarations.ts(2307)
Yep, I did npm install and it's in package.js.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.