Bucketeer - OpenFeature Node.js 服务器提供商
这是正式的 Node.js 服务器端 OpenFeature 供应商,用于访问您的功能旗 巴克特尔。 。 。 .
巴克特尔 是一个开源平台,由 网络代理商 帮助各小组作出更好的决定,减少部署准备时间,并通过特征旗帜释放风险。 Bucketeer提供先进的功能,如暗发射和相继推出,根据用户属性,设备,以及其他部分进行有限的发布.
与 OpenFeature 服务器 SDK 您可以在节点服务器应用程序中评估您的特性标记.
[尖叫声] 这是一个β版本。 在一般发布前可以引入中断更改.
有关巴克特尔旗帜管理的文件,参见 巴克特文档网站。 。 。 .
安装
npm install @bucketeer/openfeature-node-server-sdk @openfeature/server-sdk @bucketeer/node-server-sdk @openfeature/core
说明: 此软件包需要 @openfeature/server-sdk 财务报告和审定财务报表 @bucketeer/node-server-sdk 作为同伴的依赖关系.
@openfeature/server-sdk 需求 @openfeature/core 作为同伴的依赖.
使用量
初始化提供者
Bucketeer 提供者需要创建,然后设置在全球 OpenFeature 实例中.
import { OpenFeature } from '@openfeature/server-sdk';
import { BucketeerProvider, defineBKTConfig } from '@bucketeer/openfeature-node-server-sdk';
const config = defineBKTConfig({
apiKey: 'BUCKETEER_API_KEY',
apiEndpoint: 'BUCKETEER_API_ENDPOINT',
featureTag: 'FEATURE_TAG',
appVersion: '1.2.3',
});
// Initialize the provider
const provider = new BucketeerProvider(config);
// Set the provider and wait for initialization
await OpenFeature.setProviderAndWait(provider);
看我们的 文档 用于更多的 SDK 配置选项.
评价上下文允许客户端指定Bucketeer用来评价特征旗的上下文数据.
这个 targetingKey 是用户ID(唯一ID),不能为空.
评价背景
在服务器侧应用程序中,评价背景通常按请求提供,而不是全球设定。 这使得用户可以根据请求的数据进行特定旗帜的评价.
const client = OpenFeature.getClient();
// Define evaluation context per request/user
const evaluationContext = {
targetingKey: 'user-123', // Required: unique user identifier
email: '[email protected]', // User attributes for targeting
plan: 'premium',
region: 'us-east-1',
timestamp: new Date().toISOString(),
};
// Evaluate flags with context
const featureEnabled = await client.getBooleanValue('new-feature', false, evaluationContext);
对于需要在所有评价中共享一些共同上下文的应用程序,可以设置客户级上下文:
const client = OpenFeature.getClient();
// Set common context at the client level (e.g., application version)
client.setContext({
version: process.env.APP_VERSION,
environment: process.env.NODE_ENV,
});
// Per-request context will be merged with client context
const requestContext = {
targetingKey: req.user.id,
email: req.user.email,
plan: req.user.plan,
};
const result = await client.getBooleanValue('feature-flag', false, requestContext);
评估特征旗
在提供者设置并准备好之后,您可以使用 OpenFeature 客户端来评价特征标记. 总是为每项评价提供评价背景.
const client = OpenFeature.getClient();
// Define evaluation context (typically per request)
const context = {
targetingKey: 'user-123', // Required
email: '[email protected]',
plan: 'premium',
};
// boolean flag
const booleanValue = await client.getBooleanValue('my-feature-flag', false, context);
// string flag
const stringValue = await client.getStringValue('my-feature-flag', 'default-value', context);
// number flag
const numberValue = await client.getNumberValue('my-feature-flag', 0, context);
// object flag
const objectValue = await client.getObjectValue('my-feature-flag', {}, context);
// Get detailed evaluation results
const booleanDetails = await client.getBooleanDetails('my-feature-flag', false, context);
console.log(booleanDetails.value, booleanDetails.reason, booleanDetails.variant);
Express.js 示例
以下是您在 Express.js 应用程序中如何使用这个 :
import express from 'express';
import { OpenFeature } from '@openfeature/server-sdk';
import { BucketeerProvider, defineBKTConfig } from '@bucketeer/openfeature-node-server-sdk';
const app = express();
const client = OpenFeature.getClient();
app.get('/api/features', async (req, res) => {
// Create evaluation context from request
// In a real app, you'd get the user ID from your auth system
const userId = (req.headers['x-user-id'] as string) || 'anonymous';
const userEmail = req.headers['x-user-email'] as string;
const context = {
targetingKey: userId,
email: userEmail,
userAgent: req.get('User-Agent'),
ipAddress: req.ip,
};
try {
const features = {
newDashboard: await client.getBooleanValue('new-dashboard', false, context),
welcomeMessage: await client.getStringValue('welcome-message', 'Welcome!', context),
maxItems: await client.getNumberValue('max-items-per-page', 10, context),
};
res.json(features);
} catch (error) {
console.error('Feature flag evaluation error:', error);
res.status(500).json({ error: 'Failed to evaluate features' });
}
});
// Alternative example with authentication middleware
interface AuthenticatedRequest extends express.Request {
user?: {
id: string;
email: string;
plan: string;
};
}
app.get('/api/user-features', async (req: AuthenticatedRequest, res) => {
// Assuming you have authentication middleware that sets req.user
const context = {
targetingKey: req.user?.id || 'anonymous',
email: req.user?.email,
plan: req.user?.plan || 'free',
userAgent: req.get('User-Agent'),
ipAddress: req.ip,
};
try {
const features = {
premiumFeature: await client.getBooleanValue('premium-feature', false, context),
dashboardTheme: await client.getStringValue('dashboard-theme', 'default', context),
};
res.json(features);
} catch (error) {
console.error('Feature flag evaluation error:', error);
res.status(500).json({ error: 'Failed to evaluate features' });
}
});
完整示例
以下是如何使用 Bucketeer OpenFeature Node.js 服务器供应商的完整实例:
import { OpenFeature } from '@openfeature/server-sdk';
import { BucketeerProvider, defineBKTConfig } from '@bucketeer/openfeature-node-server-sdk';
async function main() {
try {
// Configure Bucketeer
const config = defineBKTConfig({
apiKey: process.env.BUCKETEER_API_KEY!,
apiEndpoint: process.env.BUCKETEER_API_ENDPOINT!,
featureTag: process.env.BUCKETEER_FEATURE_TAG!,
appVersion: '1.0.0',
});
// Initialize provider with optional timeout
const provider = new BucketeerProvider(config, {
initializationTimeoutMs: 30000, // 30 seconds
});
// Set provider and wait for initialization
await OpenFeature.setProviderAndWait(provider);
// Get client
const client = OpenFeature.getClient('my-app');
// Simulate user request - define evaluation context per user/request
const userContext = {
targetingKey: 'user-123',
email: '[email protected]',
plan: 'premium',
timestamp: new Date().toISOString(),
};
// Evaluate feature flags with context
const isNewFeatureEnabled = await client.getBooleanValue('new-feature', false, userContext);
const welcomeMessage = await client.getStringValue('welcome-message', 'Welcome!', userContext);
const maxItems = await client.getNumberValue('max-items', 10, userContext);
console.log(`New feature enabled: ${isNewFeatureEnabled}`);
console.log(`Welcome message: ${welcomeMessage}`);
console.log(`Max items: ${maxItems}`);
// Example of different user context
const anotherUserContext = {
targetingKey: 'user-456',
email: '[email protected]',
plan: 'free',
};
const featureForAnotherUser = await client.getBooleanValue(
'new-feature',
false,
anotherUserContext,
);
console.log(`Feature for another user: ${featureForAnotherUser}`);
} catch (error) {
console.error('Error:', error);
} finally {
// Clean up when your application shuts down
await OpenFeature.close();
}
}
main();
捐款
我们会为你贡献给巴克特 并帮助改善它! 任何人都可以使用和享受它!
请遵照我们的贡献指南 这里。 。 。 .
发展
环境
- 节点.js
- 检查
./.nvmrc所需的版本
- 检查
- 线条
- 软件包管理器
你需要一个 .env 为测试提供 API 机密的文件.
复制 .env.example 并重命名为 .env,然后用你的巴克特证书更新它.
图标
# Install dependencies
yarn install
# Build the project
yarn build
# Run tests
yarn test
# Run end-to-end tests
yarn test:e2e
# Lint code
yarn lint
# Format code
yarn prettier:fix
示例应用程序
检查 example/ 一个完整的Express.js应用程序的目录,演示如何使用此SDK.
cd example
npm install
npm run build
npm run dev
许可证
Apache 许可证 2.0, 见 自由主义。 。 。 .