@ubean/server 0.1.13 → 0.2.0

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.
Files changed (56) hide show
  1. package/dist/analytics-entry.d.ts +2 -0
  2. package/dist/analytics-entry.js +2 -0
  3. package/dist/cache-C84ix1Vq.js +173 -0
  4. package/dist/cache-b-MZlyv0.d.ts +48 -0
  5. package/dist/cache-directive-C1Nekkza.js +304 -0
  6. package/dist/cache-directive-CAxJAQyE.d.ts +175 -0
  7. package/dist/cache-directive.d.ts +2 -0
  8. package/dist/cache-directive.js +2 -0
  9. package/dist/cache-entry.d.ts +3 -0
  10. package/dist/cache-entry.js +3 -0
  11. package/dist/cron-entry.d.ts +2 -0
  12. package/dist/cron-entry.js +2 -0
  13. package/dist/cron-scheduler-BF33PPn4.d.ts +77 -0
  14. package/dist/cron-scheduler-BVuXv7nn.js +258 -0
  15. package/dist/database-CfpFznl-.d.ts +67 -0
  16. package/dist/database-DNrY44SQ.js +352 -0
  17. package/dist/database.d.ts +2 -0
  18. package/dist/database.js +2 -0
  19. package/dist/email-BjfRiR9b.js +354 -0
  20. package/dist/email-BvpEuNn_.d.ts +226 -0
  21. package/dist/email.d.ts +2 -0
  22. package/dist/email.js +2 -0
  23. package/dist/feature-flags-CdLwsMD2.js +657 -0
  24. package/dist/feature-flags-DWkS6p0D.d.ts +386 -0
  25. package/dist/fetch-memo-rbkxxnW4.js +338 -0
  26. package/dist/index.d.ts +183 -488
  27. package/dist/index.js +352 -2023
  28. package/dist/middleware.d.ts +2 -0
  29. package/dist/middleware.js +3 -0
  30. package/dist/observability-Cio6Qq1H.js +339 -0
  31. package/dist/observability-DUNUEjj3.d.ts +70 -0
  32. package/dist/observability.d.ts +2 -0
  33. package/dist/observability.js +2 -0
  34. package/dist/queue-Bwzi3mhK.js +210 -0
  35. package/dist/queue-GOfTAWlz.d.ts +55 -0
  36. package/dist/queue.d.ts +2 -0
  37. package/dist/queue.js +2 -0
  38. package/dist/realtime.d.ts +2 -0
  39. package/dist/realtime.js +2 -0
  40. package/dist/security.d.ts +2 -0
  41. package/dist/security.js +2 -0
  42. package/dist/sessions-BLqFFQTL.d.ts +217 -0
  43. package/dist/sessions-BsBsyFAG.js +450 -0
  44. package/dist/single-flight-BJyhDLdU.d.ts +422 -0
  45. package/dist/single-flight-mJ4ZKbx1.js +715 -0
  46. package/dist/sse-Ct72zhic.d.ts +95 -0
  47. package/dist/sse-a6Ky9Vcl.js +310 -0
  48. package/dist/static-DPHaovQe.js +90 -0
  49. package/dist/static-K2dRvjpS.d.ts +11 -0
  50. package/dist/static.d.ts +2 -0
  51. package/dist/static.js +2 -0
  52. package/dist/storage-BZLMaqHr.js +162 -0
  53. package/dist/storage-QdlPtPtR.d.ts +48 -0
  54. package/dist/storage.d.ts +2 -0
  55. package/dist/storage.js +2 -0
  56. package/package.json +68 -6
@@ -0,0 +1,386 @@
1
+ import { Context, MiddlewareHandler } from "hono";
2
+ import { UbeanEnv } from "@ubean/shared";
3
+ //#region src/analytics.d.ts
4
+ interface AnalyticsContext {
5
+ /** 请求路径 */
6
+ path?: string;
7
+ /** HTTP 方法 */
8
+ method?: string;
9
+ /** 响应状态码 */
10
+ status?: number;
11
+ /** 请求耗时(毫秒) */
12
+ duration?: number;
13
+ /** Referrer */
14
+ referrer?: string;
15
+ /** User-Agent */
16
+ userAgent?: string;
17
+ /** Accept-Language 头部 */
18
+ locale?: string;
19
+ /** 请求 ID */
20
+ requestId?: string;
21
+ /** 客户端 IP */
22
+ ip?: string;
23
+ /** 额外的上下文键 */
24
+ [key: string]: unknown;
25
+ }
26
+ interface AnalyticsEvent {
27
+ /** 事件名称,如 'page_view'、'click'、'purchase' */
28
+ name: string;
29
+ /** 事件时间戳 */
30
+ timestamp: number;
31
+ /** 事件类型,默认 'event' */
32
+ type?: 'page_view' | 'event' | 'custom';
33
+ }
34
+ interface AnalyticsProperties {
35
+ [key: string]: unknown;
36
+ }
37
+ interface AnalyticsRecord {
38
+ event: string;
39
+ type: 'page_view' | 'event' | 'custom';
40
+ timestamp: number;
41
+ properties: AnalyticsProperties;
42
+ context: AnalyticsContext;
43
+ }
44
+ interface AnalyticsProvider {
45
+ /** provider 名称 */
46
+ name: string;
47
+ /** 跟踪一个事件 */
48
+ track(event: string, properties: AnalyticsProperties, context: AnalyticsContext): void | Promise<void>;
49
+ /** 可选:刷新缓冲区 */
50
+ flush?(): Promise<void>;
51
+ /** 可选:销毁 provider */
52
+ destroy?(): void;
53
+ }
54
+ interface AnalyticsProviderOptions {
55
+ /** provider 名称 */
56
+ name?: string;
57
+ /** track 实现 */
58
+ track: AnalyticsProvider['track'];
59
+ /** flush 实现 */
60
+ flush?: () => Promise<void>;
61
+ /** destroy 实现 */
62
+ destroy?: () => void;
63
+ }
64
+ interface AnalyticsTrackOptions {
65
+ /** 是否自动抽取上下文字段,默认 true */
66
+ autoContext?: boolean;
67
+ /** 附加 properties */
68
+ properties?: AnalyticsProperties;
69
+ /** 覆盖事件名(仅 trackPageView 时有效) */
70
+ eventName?: string;
71
+ /** 是否阻塞直到 provider 完成,默认 false */
72
+ awaitFlush?: boolean;
73
+ }
74
+ interface AnalyticsMiddlewareOptions {
75
+ /** 使用指定 provider(不传则用全局 provider) */
76
+ provider?: AnalyticsProvider | AnalyticsProvider[];
77
+ /** 自动跟踪的方法,默认 ['GET'] */
78
+ methods?: string[];
79
+ /** 跳过路径(前缀匹配) */
80
+ exclude?: string[];
81
+ /** 是否跟踪所有 status(默认仅 2xx/3xx) */
82
+ trackAllStatus?: boolean;
83
+ /** 自定义是否跟踪的判定 */
84
+ shouldTrack?: (c: Context<UbeanEnv>) => boolean | Promise<boolean>;
85
+ /** 自定义 properties 提取 */
86
+ getProperties?: (c: Context<UbeanEnv>) => AnalyticsProperties | Promise<AnalyticsProperties>;
87
+ /** 自定义事件名 */
88
+ eventName?: string;
89
+ }
90
+ /** log provider:输出到 console */
91
+ declare function createLogAnalyticsProvider(): AnalyticsProvider;
92
+ /** memory provider:存储在内存,用于测试 */
93
+ declare function createMemoryAnalyticsProvider(): AnalyticsProvider & {
94
+ records: AnalyticsRecord[];
95
+ clear(): void;
96
+ };
97
+ /** mock provider:记录调用次数,用于断言 */
98
+ declare function createMockAnalyticsProvider(impl?: Partial<AnalyticsProvider>): AnalyticsProvider & {
99
+ calls: Array<{
100
+ event: string;
101
+ properties: AnalyticsProperties;
102
+ context: AnalyticsContext;
103
+ }>;
104
+ callCount: number;
105
+ reset(): void;
106
+ };
107
+ /** 注册一个 provider 到全局 registry */
108
+ declare function registerAnalyticsProvider(provider: AnalyticsProvider): void;
109
+ /** 取消注册 */
110
+ declare function unregisterAnalyticsProvider(name: string): void;
111
+ /** 从 registry 获取指定名称的 provider */
112
+ declare function getAnalyticsProvider(name: string): AnalyticsProvider | undefined;
113
+ /** 获取所有已注册的 provider */
114
+ declare function listAnalyticsProviders(): AnalyticsProvider[];
115
+ /** 清空 registry(主要供测试使用) */
116
+ declare function clearAnalyticsProviders(): void;
117
+ /** 设置全局默认 provider */
118
+ declare function setGlobalAnalyticsProvider(provider: AnalyticsProvider | AnalyticsProvider[] | null): void;
119
+ /** 获取全局默认 provider(若未设置,返回空 provider) */
120
+ declare function getGlobalAnalyticsProvider(): AnalyticsProvider | AnalyticsProvider[];
121
+ /** 从 Hono 上下文中自动抽取 analytics context */
122
+ declare function extractAnalyticsContext(c: Context<UbeanEnv>): AnalyticsContext;
123
+ /**
124
+ * 跟踪一次页面浏览
125
+ */
126
+ declare function trackPageView(c: Context<UbeanEnv>, options?: AnalyticsTrackOptions): Promise<void>;
127
+ /**
128
+ * 跟踪一次自定义事件
129
+ */
130
+ declare function trackEvent(c: Context<UbeanEnv>, name: string, properties?: AnalyticsProperties): Promise<void>;
131
+ /** 直接调用 provider 跟踪事件(无 Hono 上下文) */
132
+ declare function trackRaw(event: string, properties?: AnalyticsProperties, context?: AnalyticsContext, provider?: AnalyticsProvider | AnalyticsProvider[]): Promise<void>;
133
+ /**
134
+ * 定义一个 analytics provider,并注册到全局 registry
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * const provider = defineAnalyticsProvider({
139
+ * name: 'posthog',
140
+ * track(event, properties, context) {
141
+ * await fetch('https://app.posthog.com/capture/', { ... });
142
+ * }
143
+ * });
144
+ * ```
145
+ */
146
+ declare function defineAnalyticsProvider(options: AnalyticsProviderOptions): AnalyticsProvider;
147
+ /**
148
+ * 创建 analytics 中间件,自动跟踪页面浏览
149
+ *
150
+ * @example
151
+ * ```ts
152
+ * const memory = createMemoryAnalyticsProvider();
153
+ * app.use('*', createAnalyticsMiddleware({ provider: memory }));
154
+ * ```
155
+ */
156
+ declare function createAnalyticsMiddleware(options?: AnalyticsMiddlewareOptions): MiddlewareHandler<UbeanEnv>;
157
+ /** 定义 analytics 中间件(等同于 createAnalyticsMiddleware) */
158
+ declare function defineAnalytics(options: AnalyticsMiddlewareOptions): MiddlewareHandler<UbeanEnv>;
159
+ /** 从上下文获取 analytics provider(便于在 handler 中手动 track) */
160
+ declare function useAnalytics(c?: Context<UbeanEnv>, provider?: AnalyticsProvider | AnalyticsProvider[]): {
161
+ trackPageView(properties?: AnalyticsProperties): void;
162
+ trackEvent(name: string, properties?: AnalyticsProperties): void;
163
+ };
164
+ //#endregion
165
+ //#region src/feature-flags.d.ts
166
+ type FlagValue = boolean | string | number;
167
+ interface FlagContext {
168
+ /** 用户 ID(用于一致性分配) */
169
+ userId?: string;
170
+ /** 设备 ID / 匿名 ID */
171
+ anonymousId?: string;
172
+ /** 会话 ID */
173
+ sessionId?: string;
174
+ /** 语言/地区 */
175
+ locale?: string;
176
+ /** 国家 */
177
+ country?: string;
178
+ /** 自定义属性 */
179
+ attributes?: Record<string, unknown>;
180
+ /** IP(用于地理分群) */
181
+ ip?: string;
182
+ /** Hono 上下文引用(由中间件设置) */
183
+ [key: string]: unknown;
184
+ }
185
+ type FlagKind = 'boolean' | 'multivariate' | 'percentage';
186
+ interface SegmentRule {
187
+ /** 匹配的属性名 */
188
+ attribute: string;
189
+ /** 操作符 */
190
+ operator: 'eq' | 'neq' | 'in' | 'not_in' | 'contains' | 'gt' | 'lt' | 'gte' | 'lte' | 'exists' | 'not_exists';
191
+ /** 期望值 */
192
+ value?: unknown;
193
+ /** 期望值列表(in / not_in 用) */
194
+ values?: unknown[];
195
+ }
196
+ interface Segment {
197
+ /** 段名称 */
198
+ name?: string;
199
+ /** 规则(全部匹配才命中) */
200
+ rules: SegmentRule[];
201
+ /** 该段是否启用 */
202
+ enabled?: boolean;
203
+ }
204
+ interface Variant {
205
+ /** variant 唯一标识 */
206
+ key: string;
207
+ /** variant 显示名 */
208
+ name?: string;
209
+ /** variant 权重(用于流量分配,所有 variant 权重之和决定分配比例) */
210
+ weight: number;
211
+ /** variant 值(可任意类型,字符串/JSON) */
212
+ value?: unknown;
213
+ /** variant 描述 */
214
+ description?: string;
215
+ }
216
+ interface FeatureFlagOptions {
217
+ /** flag 类型,默认 'boolean' */
218
+ kind?: FlagKind;
219
+ /** 默认值(评估失败时返回) */
220
+ defaultValue?: FlagValue;
221
+ /** multivariate 类型的可选值 */
222
+ variants?: Variant[];
223
+ /** 百分比 rollout(0-100),仅当 kind='percentage' 时生效 */
224
+ percentage?: number;
225
+ /** 用户分群:命中段则启用 */
226
+ segments?: Segment[];
227
+ /** 全局开关,默认 true */
228
+ enabled?: boolean;
229
+ /** 描述 */
230
+ description?: string;
231
+ /** 用于一致性哈希的 salt(避免不同 flag 对同一用户产生相同分配) */
232
+ salt?: string;
233
+ }
234
+ interface ExperimentOptions {
235
+ /** 实验描述 */
236
+ description?: string;
237
+ /** variants */
238
+ variants: Variant[];
239
+ /** 流量分配比例(0-100),默认 100 */
240
+ traffic?: number;
241
+ /** 用户分群:命中段才进入实验 */
242
+ segments?: Segment[];
243
+ /** 是否启用,默认 true */
244
+ enabled?: boolean;
245
+ /** 一致性哈希 salt */
246
+ salt?: string;
247
+ }
248
+ interface FeatureFlagDefinition extends FeatureFlagOptions {
249
+ name: string;
250
+ kind: FlagKind;
251
+ defaultValue: FlagValue;
252
+ }
253
+ interface ExperimentDefinition extends ExperimentOptions {
254
+ name: string;
255
+ }
256
+ interface FlagEvaluation {
257
+ name: string;
258
+ kind: FlagKind;
259
+ value: FlagValue;
260
+ reason: 'default' | 'enabled' | 'disabled' | 'segment' | 'percentage' | 'variant';
261
+ variant?: string;
262
+ }
263
+ interface ExperimentAssignment {
264
+ name: string;
265
+ variant: string;
266
+ inExperiment: boolean;
267
+ reason: 'enabled' | 'disabled' | 'segment' | 'traffic' | 'no_variants';
268
+ }
269
+ interface FeatureFlagStore {
270
+ getFlag(name: string): Promise<FeatureFlagDefinition | undefined>;
271
+ setFlag(name: string, flag: FeatureFlagDefinition): Promise<void>;
272
+ deleteFlag(name: string): Promise<void>;
273
+ listFlags(): Promise<FeatureFlagDefinition[]>;
274
+ getExperiment(name: string): Promise<ExperimentDefinition | undefined>;
275
+ setExperiment(name: string, exp: ExperimentDefinition): Promise<void>;
276
+ deleteExperiment(name: string): Promise<void>;
277
+ listExperiments(): Promise<ExperimentDefinition[]>;
278
+ }
279
+ interface FeatureFlagsMiddlewareOptions {
280
+ /** 使用指定 store(不传则用全局 store) */
281
+ store?: FeatureFlagStore;
282
+ /** 从 Hono 上下文中提取 flag context */
283
+ getContext?: (c: Context<UbeanEnv>) => FlagContext | Promise<FlagContext>;
284
+ /** 把评估结果写入 c.set 的 key 名,默认 'flags' / 'experiments' */
285
+ flagsVarKey?: string;
286
+ experimentsVarKey?: string;
287
+ }
288
+ declare function createMemoryFeatureFlagStore(): FeatureFlagStore;
289
+ /** 设置全局 feature flag store */
290
+ declare function setGlobalFeatureFlagStore(store: FeatureFlagStore | null): void;
291
+ /** 获取全局 store(默认内存 store) */
292
+ declare function getGlobalFeatureFlagStore(): FeatureFlagStore;
293
+ /** 清空全局 store 和 registry(供测试使用) */
294
+ declare function clearFeatureFlags(): void;
295
+ /**
296
+ * 定义一个 feature flag,注册到全局 registry 和 store
297
+ *
298
+ * @example
299
+ * ```ts
300
+ * defineFeatureFlag('new_dashboard', {
301
+ * kind: 'percentage',
302
+ * percentage: 50,
303
+ * defaultValue: false
304
+ * });
305
+ *
306
+ * defineFeatureFlag('checkout_flow', {
307
+ * kind: 'multivariate',
308
+ * variants: [
309
+ * { key: 'control', weight: 1, value: 'v1' },
310
+ * { key: 'treatment', weight: 1, value: 'v2' }
311
+ * ],
312
+ * defaultValue: 'v1'
313
+ * });
314
+ * ```
315
+ */
316
+ declare function defineFeatureFlag(name: string, options?: FeatureFlagOptions): FeatureFlagDefinition;
317
+ /**
318
+ * 定义一个 A/B 测试实验,注册到全局 registry 和 store
319
+ *
320
+ * @example
321
+ * ```ts
322
+ * defineExperiment('checkout_v2_test', {
323
+ * variants: [
324
+ * { key: 'control', weight: 1, value: 'A' },
325
+ * { key: 'treatment', weight: 1, value: 'B' }
326
+ * ],
327
+ * traffic: 50
328
+ * });
329
+ * ```
330
+ */
331
+ declare function defineExperiment(name: string, options: ExperimentOptions): ExperimentDefinition;
332
+ /**
333
+ * 评估一个 flag,返回 boolean 或 variant value
334
+ *
335
+ * - boolean flag:返回 true / false
336
+ * - percentage flag:返回 true / false(基于用户身份的稳定百分比)
337
+ * - multivariate flag:返回选中的 variant value
338
+ */
339
+ declare function evaluateFlag(name: string, context?: FlagContext, store?: FeatureFlagStore): Promise<FlagValue>;
340
+ /** 评估 flag 并返回原因(用于调试 / debug) */
341
+ declare function evaluateFlagWithReason(name: string, context?: FlagContext, store?: FeatureFlagStore): Promise<FlagEvaluation>;
342
+ /**
343
+ * 获取一个实验分配给当前用户的 variant key
344
+ */
345
+ declare function getVariant(name: string, context?: FlagContext, store?: FeatureFlagStore): Promise<string | undefined>;
346
+ /** 获取实验分配详情(用于调试) */
347
+ declare function getVariantAssignment(name: string, context?: FlagContext, store?: FeatureFlagStore): Promise<ExperimentAssignment>;
348
+ /** 默认从 Hono 上下文提取 flag context */
349
+ declare function extractFlagContext(c: Context<UbeanEnv>): FlagContext;
350
+ /**
351
+ * 创建 feature flags 中间件,把 flag/experiment 评估附加到 context
352
+ *
353
+ * @example
354
+ * ```ts
355
+ * app.use('*', createFeatureFlagsMiddleware());
356
+ *
357
+ * app.get('/', (c) => {
358
+ * const flags = useFlags(c);
359
+ * if (flags.new_dashboard) {
360
+ * return c.render('dashboard-v2');
361
+ * }
362
+ * return c.render('dashboard');
363
+ * });
364
+ * ```
365
+ */
366
+ declare function createFeatureFlagsMiddleware(options?: FeatureFlagsMiddlewareOptions): MiddlewareHandler<UbeanEnv>;
367
+ /** 从 Hono 上下文中获取所有 flag(由中间件写入) */
368
+ declare function useFlags(c: Context<UbeanEnv>): Record<string, FlagValue>;
369
+ /** 从 Hono 上下文中获取所有 experiment 分配 */
370
+ declare function useExperiments(c: Context<UbeanEnv>): Record<string, string>;
371
+ /** 获取当前请求的 flag context(由中间件写入) */
372
+ declare function useFlagContext(c: Context<UbeanEnv>): FlagContext;
373
+ /** 在 handler 中即时评估一个 flag(如果未启用中间件也可用) */
374
+ declare function evaluateFlagFromContext(c: Context<UbeanEnv>, name: string, store?: FeatureFlagStore): Promise<FlagValue>;
375
+ /** 在 handler 中即时获取一个实验的 variant(如果未启用中间件也可用) */
376
+ declare function getVariantFromContext(c: Context<UbeanEnv>, name: string, store?: FeatureFlagStore): Promise<string | undefined>;
377
+ /** 列出所有已注册的 flag 名称 */
378
+ declare function listFlagNames(): string[];
379
+ /** 列出所有已注册的 experiment 名称 */
380
+ declare function listExperimentNames(): string[];
381
+ /** 从 registry 中删除一个 flag */
382
+ declare function removeFeatureFlag(name: string): void;
383
+ /** 从 registry 中删除一个实验 */
384
+ declare function removeExperiment(name: string): void;
385
+ //#endregion
386
+ export { getGlobalAnalyticsProvider as $, removeExperiment as A, AnalyticsProvider as B, extractFlagContext as C, getVariantFromContext as D, getVariantAssignment as E, useFlags as F, createAnalyticsMiddleware as G, AnalyticsRecord as H, AnalyticsContext as I, createMockAnalyticsProvider as J, createLogAnalyticsProvider as K, AnalyticsEvent as L, setGlobalFeatureFlagStore as M, useExperiments as N, listExperimentNames as O, useFlagContext as P, getAnalyticsProvider as Q, AnalyticsMiddlewareOptions as R, evaluateFlagWithReason as S, getVariant as T, AnalyticsTrackOptions as U, AnalyticsProviderOptions as V, clearAnalyticsProviders as W, defineAnalyticsProvider as X, defineAnalytics as Y, extractAnalyticsContext as Z, createMemoryFeatureFlagStore as _, FeatureFlagOptions as a, trackRaw as at, evaluateFlag as b, FlagContext as c, FlagValue as d, listAnalyticsProviders as et, Segment as f, createFeatureFlagsMiddleware as g, clearFeatureFlags as h, FeatureFlagDefinition as i, trackPageView as it, removeFeatureFlag as j, listFlagNames as k, FlagEvaluation as l, Variant as m, ExperimentDefinition as n, setGlobalAnalyticsProvider as nt, FeatureFlagStore as o, unregisterAnalyticsProvider as ot, SegmentRule as p, createMemoryAnalyticsProvider as q, ExperimentOptions as r, trackEvent as rt, FeatureFlagsMiddlewareOptions as s, useAnalytics as st, ExperimentAssignment as t, registerAnalyticsProvider as tt, FlagKind as u, defineExperiment as v, getGlobalFeatureFlagStore as w, evaluateFlagFromContext as x, defineFeatureFlag as y, AnalyticsProperties as z };