@adonis-agora/flags 0.0.0-stage → 0.1.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.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +15 -2
- package/dist/assets/spa/assets/index-DdmFo7xr.js +12 -0
- package/dist/assets/spa/assets/index-DdmFo7xr.js.map +1 -0
- package/dist/assets/spa/assets/index-DhkcP3Cw.css +2 -0
- package/dist/assets/spa/index.html +26 -0
- package/dist/commands/flags_list.d.ts +9 -0
- package/dist/commands/flags_list.d.ts.map +1 -0
- package/dist/commands/flags_list.js +51 -0
- package/dist/commands/flags_list.js.map +1 -0
- package/dist/commands/flags_ops.d.ts +60 -0
- package/dist/commands/flags_ops.d.ts.map +1 -0
- package/dist/commands/flags_ops.js +253 -0
- package/dist/commands/flags_ops.js.map +1 -0
- package/dist/commands/flags_refs.d.ts +15 -0
- package/dist/commands/flags_refs.d.ts.map +1 -0
- package/dist/commands/flags_refs.js +90 -0
- package/dist/commands/flags_refs.js.map +1 -0
- package/dist/commands/flags_set.d.ts +19 -0
- package/dist/commands/flags_set.d.ts.map +1 -0
- package/dist/commands/flags_set.js +97 -0
- package/dist/commands/flags_set.js.map +1 -0
- package/dist/commands/flags_types.d.ts +18 -0
- package/dist/commands/flags_types.d.ts.map +1 -0
- package/dist/commands/flags_types.js +94 -0
- package/dist/commands/flags_types.js.map +1 -0
- package/dist/commands/flags_work.d.ts +16 -0
- package/dist/commands/flags_work.d.ts.map +1 -0
- package/dist/commands/flags_work.js +71 -0
- package/dist/commands/flags_work.js.map +1 -0
- package/dist/commands/main.d.ts +15 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +30 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/commands/shared.d.ts +21 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +70 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/configure.d.ts +11 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +32 -0
- package/dist/configure.js.map +1 -0
- package/dist/providers/dashboard_provider.d.ts +65 -0
- package/dist/providers/dashboard_provider.d.ts.map +1 -0
- package/dist/providers/dashboard_provider.js +340 -0
- package/dist/providers/dashboard_provider.js.map +1 -0
- package/dist/providers/flags_provider.d.ts +30 -0
- package/dist/providers/flags_provider.d.ts.map +1 -0
- package/dist/providers/flags_provider.js +184 -0
- package/dist/providers/flags_provider.js.map +1 -0
- package/dist/services/main.d.ts +17 -0
- package/dist/services/main.d.ts.map +1 -0
- package/dist/services/main.js +20 -0
- package/dist/services/main.js.map +1 -0
- package/dist/src/admin.d.ts +189 -0
- package/dist/src/admin.d.ts.map +1 -0
- package/dist/src/admin.js +539 -0
- package/dist/src/admin.js.map +1 -0
- package/dist/src/analytics/backend.d.ts +18 -0
- package/dist/src/analytics/backend.d.ts.map +1 -0
- package/dist/src/analytics/backend.js +25 -0
- package/dist/src/analytics/backend.js.map +1 -0
- package/dist/src/analytics/clickhouse_backend.d.ts +16 -0
- package/dist/src/analytics/clickhouse_backend.d.ts.map +1 -0
- package/dist/src/analytics/clickhouse_backend.js +48 -0
- package/dist/src/analytics/clickhouse_backend.js.map +1 -0
- package/dist/src/analytics/duckdb.d.ts +39 -0
- package/dist/src/analytics/duckdb.d.ts.map +1 -0
- package/dist/src/analytics/duckdb.js +117 -0
- package/dist/src/analytics/duckdb.js.map +1 -0
- package/dist/src/analytics/lucid_backend.d.ts +16 -0
- package/dist/src/analytics/lucid_backend.d.ts.map +1 -0
- package/dist/src/analytics/lucid_backend.js +45 -0
- package/dist/src/analytics/lucid_backend.js.map +1 -0
- package/dist/src/analytics/metrics.d.ts +50 -0
- package/dist/src/analytics/metrics.d.ts.map +1 -0
- package/dist/src/analytics/metrics.js +42 -0
- package/dist/src/analytics/metrics.js.map +1 -0
- package/dist/src/analytics/results.d.ts +80 -0
- package/dist/src/analytics/results.d.ts.map +1 -0
- package/dist/src/analytics/results.js +143 -0
- package/dist/src/analytics/results.js.map +1 -0
- package/dist/src/dashboard/access_denied_page.d.ts +100 -0
- package/dist/src/dashboard/access_denied_page.d.ts.map +1 -0
- package/dist/src/dashboard/access_denied_page.js +262 -0
- package/dist/src/dashboard/access_denied_page.js.map +1 -0
- package/dist/src/dashboard/actor.d.ts +12 -0
- package/dist/src/dashboard/actor.d.ts.map +1 -0
- package/dist/src/dashboard/actor.js +33 -0
- package/dist/src/dashboard/actor.js.map +1 -0
- package/dist/src/dashboard/authorize_decision.d.ts +48 -0
- package/dist/src/dashboard/authorize_decision.d.ts.map +1 -0
- package/dist/src/dashboard/authorize_decision.js +44 -0
- package/dist/src/dashboard/authorize_decision.js.map +1 -0
- package/dist/src/dashboard/console_authorize.d.ts +77 -0
- package/dist/src/dashboard/console_authorize.d.ts.map +1 -0
- package/dist/src/dashboard/console_authorize.js +104 -0
- package/dist/src/dashboard/console_authorize.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +71 -0
- package/dist/src/dashboard/define_config.d.ts.map +1 -0
- package/dist/src/dashboard/define_config.js +18 -0
- package/dist/src/dashboard/define_config.js.map +1 -0
- package/dist/src/dashboard/handlers.d.ts +172 -0
- package/dist/src/dashboard/handlers.d.ts.map +1 -0
- package/dist/src/dashboard/handlers.js +949 -0
- package/dist/src/dashboard/handlers.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +15 -0
- package/dist/src/dashboard/index.d.ts.map +1 -0
- package/dist/src/dashboard/index.js +10 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/dashboard/shape.d.ts +12 -0
- package/dist/src/dashboard/shape.d.ts.map +1 -0
- package/dist/src/dashboard/shape.js +232 -0
- package/dist/src/dashboard/shape.js.map +1 -0
- package/dist/src/dashboard/spa.d.ts +34 -0
- package/dist/src/dashboard/spa.d.ts.map +1 -0
- package/dist/src/dashboard/spa.js +50 -0
- package/dist/src/dashboard/spa.js.map +1 -0
- package/dist/src/declare.d.ts +85 -0
- package/dist/src/declare.d.ts.map +1 -0
- package/dist/src/declare.js +62 -0
- package/dist/src/declare.js.map +1 -0
- package/dist/src/define_config.d.ts +256 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +90 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/durable.d.ts +29 -0
- package/dist/src/durable.d.ts.map +1 -0
- package/dist/src/durable.js +55 -0
- package/dist/src/durable.js.map +1 -0
- package/dist/src/enrichers.d.ts +51 -0
- package/dist/src/enrichers.d.ts.map +1 -0
- package/dist/src/enrichers.js +105 -0
- package/dist/src/enrichers.js.map +1 -0
- package/dist/src/events/buffer.d.ts +38 -0
- package/dist/src/events/buffer.d.ts.map +1 -0
- package/dist/src/events/buffer.js +86 -0
- package/dist/src/events/buffer.js.map +1 -0
- package/dist/src/events/event.d.ts +42 -0
- package/dist/src/events/event.d.ts.map +1 -0
- package/dist/src/events/event.js +82 -0
- package/dist/src/events/event.js.map +1 -0
- package/dist/src/http/browser.d.ts +33 -0
- package/dist/src/http/browser.d.ts.map +1 -0
- package/dist/src/http/browser.js +81 -0
- package/dist/src/http/browser.js.map +1 -0
- package/dist/src/http/browser_api.d.ts +48 -0
- package/dist/src/http/browser_api.d.ts.map +1 -0
- package/dist/src/http/browser_api.js +273 -0
- package/dist/src/http/browser_api.js.map +1 -0
- package/dist/src/http/browser_tokens.d.ts +27 -0
- package/dist/src/http/browser_tokens.d.ts.map +1 -0
- package/dist/src/http/browser_tokens.js +48 -0
- package/dist/src/http/browser_tokens.js.map +1 -0
- package/dist/src/http/control_plane.d.ts +58 -0
- package/dist/src/http/control_plane.d.ts.map +1 -0
- package/dist/src/http/control_plane.js +318 -0
- package/dist/src/http/control_plane.js.map +1 -0
- package/dist/src/http/csrf.d.ts +22 -0
- package/dist/src/http/csrf.d.ts.map +1 -0
- package/dist/src/http/csrf.js +24 -0
- package/dist/src/http/csrf.js.map +1 -0
- package/dist/src/http/edge_tag.d.ts +55 -0
- package/dist/src/http/edge_tag.d.ts.map +1 -0
- package/dist/src/http/edge_tag.js +45 -0
- package/dist/src/http/edge_tag.js.map +1 -0
- package/dist/src/http/flag_middleware.d.ts +27 -0
- package/dist/src/http/flag_middleware.d.ts.map +1 -0
- package/dist/src/http/flag_middleware.js +30 -0
- package/dist/src/http/flag_middleware.js.map +1 -0
- package/dist/src/http/flags_middleware.d.ts +20 -0
- package/dist/src/http/flags_middleware.d.ts.map +1 -0
- package/dist/src/http/flags_middleware.js +20 -0
- package/dist/src/http/flags_middleware.js.map +1 -0
- package/dist/src/http/subject_resolver.d.ts +45 -0
- package/dist/src/http/subject_resolver.d.ts.map +1 -0
- package/dist/src/http/subject_resolver.js +93 -0
- package/dist/src/http/subject_resolver.js.map +1 -0
- package/dist/src/identity.d.ts +82 -0
- package/dist/src/identity.d.ts.map +1 -0
- package/dist/src/identity.js +100 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/index.d.ts +41 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +34 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/manager.d.ts +154 -0
- package/dist/src/manager.d.ts.map +1 -0
- package/dist/src/manager.js +333 -0
- package/dist/src/manager.js.map +1 -0
- package/dist/src/openfeature/provider.d.ts +36 -0
- package/dist/src/openfeature/provider.d.ts.map +1 -0
- package/dist/src/openfeature/provider.js +82 -0
- package/dist/src/openfeature/provider.js.map +1 -0
- package/dist/src/relay/relay.d.ts +36 -0
- package/dist/src/relay/relay.d.ts.map +1 -0
- package/dist/src/relay/relay.js +73 -0
- package/dist/src/relay/relay.js.map +1 -0
- package/dist/src/relay/results_cache.d.ts +20 -0
- package/dist/src/relay/results_cache.d.ts.map +1 -0
- package/dist/src/relay/results_cache.js +31 -0
- package/dist/src/relay/results_cache.js.map +1 -0
- package/dist/src/relay/worker.d.ts +66 -0
- package/dist/src/relay/worker.d.ts.map +1 -0
- package/dist/src/relay/worker.js +177 -0
- package/dist/src/relay/worker.js.map +1 -0
- package/dist/src/ruleset_source.d.ts +73 -0
- package/dist/src/ruleset_source.d.ts.map +1 -0
- package/dist/src/ruleset_source.js +128 -0
- package/dist/src/ruleset_source.js.map +1 -0
- package/dist/src/runtime.d.ts +70 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +301 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/schema.d.ts +39 -0
- package/dist/src/schema.d.ts.map +1 -0
- package/dist/src/schema.js +311 -0
- package/dist/src/schema.js.map +1 -0
- package/dist/src/services/accessor.d.ts +5 -0
- package/dist/src/services/accessor.d.ts.map +1 -0
- package/dist/src/services/accessor.js +20 -0
- package/dist/src/services/accessor.js.map +1 -0
- package/dist/src/sinks/clickhouse.d.ts +41 -0
- package/dist/src/sinks/clickhouse.d.ts.map +1 -0
- package/dist/src/sinks/clickhouse.js +117 -0
- package/dist/src/sinks/clickhouse.js.map +1 -0
- package/dist/src/sinks/lucid_sink.d.ts +25 -0
- package/dist/src/sinks/lucid_sink.d.ts.map +1 -0
- package/dist/src/sinks/lucid_sink.js +87 -0
- package/dist/src/sinks/lucid_sink.js.map +1 -0
- package/dist/src/sinks/parquet_sink.d.ts +41 -0
- package/dist/src/sinks/parquet_sink.d.ts.map +1 -0
- package/dist/src/sinks/parquet_sink.js +140 -0
- package/dist/src/sinks/parquet_sink.js.map +1 -0
- package/dist/src/sinks/posthog_sink.d.ts +29 -0
- package/dist/src/sinks/posthog_sink.d.ts.map +1 -0
- package/dist/src/sinks/posthog_sink.js +65 -0
- package/dist/src/sinks/posthog_sink.js.map +1 -0
- package/dist/src/sinks/sink.d.ts +36 -0
- package/dist/src/sinks/sink.d.ts.map +1 -0
- package/dist/src/sinks/sink.js +36 -0
- package/dist/src/sinks/sink.js.map +1 -0
- package/dist/src/sql.d.ts +33 -0
- package/dist/src/sql.d.ts.map +1 -0
- package/dist/src/sql.js +66 -0
- package/dist/src/sql.js.map +1 -0
- package/dist/src/stores/lucid_store.d.ts +55 -0
- package/dist/src/stores/lucid_store.d.ts.map +1 -0
- package/dist/src/stores/lucid_store.js +412 -0
- package/dist/src/stores/lucid_store.js.map +1 -0
- package/dist/src/stores/memory_store.d.ts +38 -0
- package/dist/src/stores/memory_store.d.ts.map +1 -0
- package/dist/src/stores/memory_store.js +166 -0
- package/dist/src/stores/memory_store.js.map +1 -0
- package/dist/src/stores/store.d.ts +166 -0
- package/dist/src/stores/store.d.ts.map +1 -0
- package/dist/src/stores/store.js +67 -0
- package/dist/src/stores/store.js.map +1 -0
- package/dist/src/subject.d.ts +25 -0
- package/dist/src/subject.d.ts.map +1 -0
- package/dist/src/subject.js +30 -0
- package/dist/src/subject.js.map +1 -0
- package/dist/src/testing/index.d.ts +31 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +60 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/topology/browser_token.d.ts +48 -0
- package/dist/src/topology/browser_token.d.ts.map +1 -0
- package/dist/src/topology/browser_token.js +128 -0
- package/dist/src/topology/browser_token.js.map +1 -0
- package/dist/src/topology/remote_source.d.ts +39 -0
- package/dist/src/topology/remote_source.d.ts.map +1 -0
- package/dist/src/topology/remote_source.js +184 -0
- package/dist/src/topology/remote_source.js.map +1 -0
- package/dist/src/topology/token.d.ts +36 -0
- package/dist/src/topology/token.d.ts.map +1 -0
- package/dist/src/topology/token.js +68 -0
- package/dist/src/topology/token.js.map +1 -0
- package/dist/src/topology/verify.d.ts +88 -0
- package/dist/src/topology/verify.d.ts.map +1 -0
- package/dist/src/topology/verify.js +128 -0
- package/dist/src/topology/verify.js.map +1 -0
- package/dist/src/transports/db_transport.d.ts +55 -0
- package/dist/src/transports/db_transport.d.ts.map +1 -0
- package/dist/src/transports/db_transport.js +202 -0
- package/dist/src/transports/db_transport.js.map +1 -0
- package/dist/src/transports/http_transport.d.ts +30 -0
- package/dist/src/transports/http_transport.d.ts.map +1 -0
- package/dist/src/transports/http_transport.js +51 -0
- package/dist/src/transports/http_transport.js.map +1 -0
- package/dist/src/transports/memory_transport.d.ts +29 -0
- package/dist/src/transports/memory_transport.d.ts.map +1 -0
- package/dist/src/transports/memory_transport.js +91 -0
- package/dist/src/transports/memory_transport.js.map +1 -0
- package/dist/src/transports/redis_transport.d.ts +50 -0
- package/dist/src/transports/redis_transport.d.ts.map +1 -0
- package/dist/src/transports/redis_transport.js +107 -0
- package/dist/src/transports/redis_transport.js.map +1 -0
- package/dist/src/transports/transport.d.ts +62 -0
- package/dist/src/transports/transport.d.ts.map +1 -0
- package/dist/src/transports/transport.js +2 -0
- package/dist/src/transports/transport.js.map +1 -0
- package/dist/src/types.d.ts +30 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/usage.d.ts +18 -0
- package/dist/src/usage.d.ts.map +1 -0
- package/dist/src/usage.js +52 -0
- package/dist/src/usage.js.map +1 -0
- package/dist/stubs/config/flags.stub +50 -0
- package/dist/stubs/config/flags_dashboard.stub +35 -0
- package/dist/stubs/database/migrations/create_flags_tables.stub +27 -0
- package/dist/stubs/main.d.ts +3 -0
- package/dist/stubs/main.d.ts.map +1 -0
- package/dist/stubs/main.js +9 -0
- package/dist/stubs/main.js.map +1 -0
- package/package.json +178 -3
- package/skills/flags-basics/SKILL.md +142 -0
- package/skills/flags-deployment/SKILL.md +125 -0
- package/skills/flags-experiments/SKILL.md +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory_store.js","sourceRoot":"","sources":["../../../src/stores/memory_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import type { FlagDefinition, Holdout, Layer, Ruleset, Segment } from '@adonis-agora/flags-core';
|
|
2
|
+
import type { FlagDeclaration } from '../declare.js';
|
|
3
|
+
/** What a change targets. */
|
|
4
|
+
export type EntityType = 'flag' | 'segment' | 'layer' | 'holdout' | 'ruleset';
|
|
5
|
+
/** One change to the ruleset of an environment. `value: null` deletes. */
|
|
6
|
+
export type RulesetChange = {
|
|
7
|
+
entity: 'flag';
|
|
8
|
+
key: string;
|
|
9
|
+
value: FlagDefinition | null;
|
|
10
|
+
} | {
|
|
11
|
+
entity: 'segment';
|
|
12
|
+
key: string;
|
|
13
|
+
value: Segment | null;
|
|
14
|
+
} | {
|
|
15
|
+
entity: 'layer';
|
|
16
|
+
key: string;
|
|
17
|
+
value: Layer | null;
|
|
18
|
+
} | {
|
|
19
|
+
entity: 'holdout';
|
|
20
|
+
key?: undefined;
|
|
21
|
+
value: Holdout | null;
|
|
22
|
+
}
|
|
23
|
+
/** Replaces every flag, segment, layer and the holdout (import, promote). */
|
|
24
|
+
| {
|
|
25
|
+
entity: 'ruleset';
|
|
26
|
+
key?: undefined;
|
|
27
|
+
value: Omit<Ruleset, 'version' | 'schemaVersion'>;
|
|
28
|
+
};
|
|
29
|
+
/** Who did something: the authkit `sub`, a user id, `cli`, `schedule`… */
|
|
30
|
+
export interface Actor {
|
|
31
|
+
id: string;
|
|
32
|
+
name?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Nobody could be identified (e.g. the console with no signed-in user). Allowed to change
|
|
35
|
+
* environments without approvals; refused where approvals are on, because two anonymous people
|
|
36
|
+
* would be the same actor and the two-person rule would mean nothing.
|
|
37
|
+
*/
|
|
38
|
+
anonymous?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface AuditEntry {
|
|
41
|
+
id: string;
|
|
42
|
+
environment: string;
|
|
43
|
+
entity: EntityType;
|
|
44
|
+
key: string | null;
|
|
45
|
+
action: 'create' | 'update' | 'delete' | 'replace';
|
|
46
|
+
before: unknown;
|
|
47
|
+
after: unknown;
|
|
48
|
+
actor: Actor;
|
|
49
|
+
/** Change request that carried the change, when approvals are on. */
|
|
50
|
+
changeRequestId?: string;
|
|
51
|
+
/** The ruleset version this change produced. */
|
|
52
|
+
version: string;
|
|
53
|
+
at: Date;
|
|
54
|
+
}
|
|
55
|
+
export type ChangeRequestStatus = 'pending' | 'approved' | 'rejected' | 'applied' | 'cancelled';
|
|
56
|
+
export interface ChangeRequest {
|
|
57
|
+
id: string;
|
|
58
|
+
environment: string;
|
|
59
|
+
change: RulesetChange;
|
|
60
|
+
/** Why the change is wanted. */
|
|
61
|
+
note?: string;
|
|
62
|
+
requestedBy: Actor;
|
|
63
|
+
requestedAt: Date;
|
|
64
|
+
status: ChangeRequestStatus;
|
|
65
|
+
reviewedBy?: Actor;
|
|
66
|
+
reviewedAt?: Date;
|
|
67
|
+
reviewNote?: string;
|
|
68
|
+
/** The ruleset version the request was made against; applying on a newer one warns. */
|
|
69
|
+
baseVersion: string;
|
|
70
|
+
}
|
|
71
|
+
export type ScheduleKind = 'enable' | 'disable' | 'rollout' | 'change';
|
|
72
|
+
/** A change to apply at a given time (DESIGN §14: scheduling and gradual rollout). */
|
|
73
|
+
export interface ScheduledChange {
|
|
74
|
+
id: string;
|
|
75
|
+
environment: string;
|
|
76
|
+
flag: string;
|
|
77
|
+
kind: ScheduleKind;
|
|
78
|
+
/** `rollout`: the share (0 … 100) the `on` arm should reach. `change`: a full RulesetChange. */
|
|
79
|
+
payload: {
|
|
80
|
+
percent?: number;
|
|
81
|
+
variant?: string;
|
|
82
|
+
change?: RulesetChange;
|
|
83
|
+
};
|
|
84
|
+
runAt: Date;
|
|
85
|
+
status: 'pending' | 'running' | 'done' | 'failed' | 'cancelled';
|
|
86
|
+
createdBy: Actor;
|
|
87
|
+
error?: string;
|
|
88
|
+
executedAt?: Date;
|
|
89
|
+
}
|
|
90
|
+
/** Evaluations of a flag on one day, for stale-flag detection. */
|
|
91
|
+
export interface UsageRow {
|
|
92
|
+
environment: string;
|
|
93
|
+
flag: string;
|
|
94
|
+
day: string;
|
|
95
|
+
evaluations: number;
|
|
96
|
+
}
|
|
97
|
+
export interface DeclarationRow {
|
|
98
|
+
app: string;
|
|
99
|
+
key: string;
|
|
100
|
+
declaration: FlagDeclaration;
|
|
101
|
+
lastSeenAt: Date;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Where the ruleset lives. Every write bumps the environment's version in the same transaction,
|
|
105
|
+
* which is what readers poll (or are notified about) to know the ruleset changed.
|
|
106
|
+
*/
|
|
107
|
+
export interface FlagsStore {
|
|
108
|
+
/** Creates the tables if needed. Idempotent. */
|
|
109
|
+
setup?(): Promise<void>;
|
|
110
|
+
/** The assembled ruleset of an environment. */
|
|
111
|
+
readRuleset(environment: string): Promise<Ruleset>;
|
|
112
|
+
/** The current version string of an environment — cheap, polled. */
|
|
113
|
+
version(environment: string): Promise<string>;
|
|
114
|
+
/** Applies a change, bumps the version and writes the audit entry atomically. */
|
|
115
|
+
apply(environment: string, change: RulesetChange, actor: Actor, options?: {
|
|
116
|
+
changeRequestId?: string;
|
|
117
|
+
}): Promise<{
|
|
118
|
+
version: string;
|
|
119
|
+
}>;
|
|
120
|
+
environments(): Promise<string[]>;
|
|
121
|
+
audit(query: {
|
|
122
|
+
environment?: string;
|
|
123
|
+
entity?: EntityType;
|
|
124
|
+
key?: string;
|
|
125
|
+
limit?: number;
|
|
126
|
+
before?: Date;
|
|
127
|
+
}): Promise<AuditEntry[]>;
|
|
128
|
+
createChangeRequest(request: Omit<ChangeRequest, 'id' | 'status' | 'requestedAt'>): Promise<ChangeRequest>;
|
|
129
|
+
getChangeRequest(id: string): Promise<ChangeRequest | null>;
|
|
130
|
+
listChangeRequests(query: {
|
|
131
|
+
environment?: string;
|
|
132
|
+
status?: ChangeRequestStatus;
|
|
133
|
+
limit?: number;
|
|
134
|
+
}): Promise<ChangeRequest[]>;
|
|
135
|
+
updateChangeRequest(id: string, patch: Partial<Pick<ChangeRequest, 'status' | 'reviewedBy' | 'reviewedAt' | 'reviewNote'>>): Promise<ChangeRequest>;
|
|
136
|
+
getSchedule(id: string): Promise<ScheduledChange | null>;
|
|
137
|
+
createSchedule(schedule: Omit<ScheduledChange, 'id' | 'status'>): Promise<ScheduledChange>;
|
|
138
|
+
listSchedules(query: {
|
|
139
|
+
environment?: string;
|
|
140
|
+
flag?: string;
|
|
141
|
+
status?: ScheduledChange['status'];
|
|
142
|
+
dueBefore?: Date;
|
|
143
|
+
limit?: number;
|
|
144
|
+
}): Promise<ScheduledChange[]>;
|
|
145
|
+
updateSchedule(id: string, patch: Partial<Pick<ScheduledChange, 'status' | 'error' | 'executedAt'>>): Promise<ScheduledChange>;
|
|
146
|
+
/**
|
|
147
|
+
* Atomically claims a due schedule (pending → running) so one replica executes it. Returns
|
|
148
|
+
* `false` when another replica got it first.
|
|
149
|
+
*/
|
|
150
|
+
claimSchedule(id: string): Promise<boolean>;
|
|
151
|
+
/** Adds evaluation counts (stale-flag detection). */
|
|
152
|
+
recordUsage(rows: UsageRow[]): Promise<void>;
|
|
153
|
+
usage(query: {
|
|
154
|
+
environment: string;
|
|
155
|
+
since: string;
|
|
156
|
+
}): Promise<UsageRow[]>;
|
|
157
|
+
/** Records the flags an app declares in code (schema push). */
|
|
158
|
+
saveDeclarations(app: string, declarations: Record<string, FlagDeclaration>): Promise<void>;
|
|
159
|
+
declarations(app?: string): Promise<DeclarationRow[]>;
|
|
160
|
+
}
|
|
161
|
+
/** Apply a change to an in-memory ruleset (shared by the stores and the console preview). */
|
|
162
|
+
export declare function applyChange(ruleset: Ruleset, change: RulesetChange): Ruleset;
|
|
163
|
+
/** The value a change replaces, for the audit `before` column. */
|
|
164
|
+
export declare function currentValue(ruleset: Ruleset, change: RulesetChange): unknown;
|
|
165
|
+
export declare function auditAction(before: unknown, change: RulesetChange): AuditEntry['action'];
|
|
166
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/stores/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Apply a change to an in-memory ruleset (shared by the stores and the console preview). */
|
|
2
|
+
export function applyChange(ruleset, change) {
|
|
3
|
+
const next = structuredClone(ruleset);
|
|
4
|
+
const upsert = (map, key, value) => {
|
|
5
|
+
const out = { ...(map ?? {}) };
|
|
6
|
+
if (value === null)
|
|
7
|
+
delete out[key];
|
|
8
|
+
else
|
|
9
|
+
out[key] = value;
|
|
10
|
+
return out;
|
|
11
|
+
};
|
|
12
|
+
switch (change.entity) {
|
|
13
|
+
case 'flag':
|
|
14
|
+
next.flags = upsert(next.flags, change.key, change.value);
|
|
15
|
+
break;
|
|
16
|
+
case 'segment':
|
|
17
|
+
next.segments = upsert(next.segments, change.key, change.value);
|
|
18
|
+
break;
|
|
19
|
+
case 'layer':
|
|
20
|
+
next.layers = upsert(next.layers, change.key, change.value);
|
|
21
|
+
break;
|
|
22
|
+
case 'holdout':
|
|
23
|
+
if (change.value === null)
|
|
24
|
+
delete next.holdout;
|
|
25
|
+
else
|
|
26
|
+
next.holdout = change.value;
|
|
27
|
+
break;
|
|
28
|
+
case 'ruleset':
|
|
29
|
+
next.flags = structuredClone(change.value.flags);
|
|
30
|
+
next.segments = structuredClone(change.value.segments ?? {});
|
|
31
|
+
next.layers = structuredClone(change.value.layers ?? {});
|
|
32
|
+
if (change.value.holdout)
|
|
33
|
+
next.holdout = structuredClone(change.value.holdout);
|
|
34
|
+
else
|
|
35
|
+
delete next.holdout;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
return next;
|
|
39
|
+
}
|
|
40
|
+
/** The value a change replaces, for the audit `before` column. */
|
|
41
|
+
export function currentValue(ruleset, change) {
|
|
42
|
+
switch (change.entity) {
|
|
43
|
+
case 'flag':
|
|
44
|
+
return ruleset.flags[change.key] ?? null;
|
|
45
|
+
case 'segment':
|
|
46
|
+
return ruleset.segments?.[change.key] ?? null;
|
|
47
|
+
case 'layer':
|
|
48
|
+
return ruleset.layers?.[change.key] ?? null;
|
|
49
|
+
case 'holdout':
|
|
50
|
+
return ruleset.holdout ?? null;
|
|
51
|
+
case 'ruleset':
|
|
52
|
+
return {
|
|
53
|
+
flags: ruleset.flags,
|
|
54
|
+
segments: ruleset.segments ?? {},
|
|
55
|
+
layers: ruleset.layers ?? {},
|
|
56
|
+
...(ruleset.holdout ? { holdout: ruleset.holdout } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function auditAction(before, change) {
|
|
61
|
+
if (change.entity === 'ruleset')
|
|
62
|
+
return 'replace';
|
|
63
|
+
if (change.value === null)
|
|
64
|
+
return 'delete';
|
|
65
|
+
return before === null || before === undefined ? 'create' : 'update';
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/stores/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EvaluationContext } from '@adonis-agora/flags-core';
|
|
2
|
+
/**
|
|
3
|
+
* Who a flag is evaluated for. Same vocabulary as `@adonis-agora/authz`: a subject has an id and a
|
|
4
|
+
* type (`user`, `organization`, …). With authkit as the IdP, use the `sub` claim as the id so the
|
|
5
|
+
* same person lands in the same bucket in every app.
|
|
6
|
+
*/
|
|
7
|
+
export interface Subject {
|
|
8
|
+
id: string | number;
|
|
9
|
+
/** Default `user`. Stored on events; does not change bucketing. */
|
|
10
|
+
type?: string;
|
|
11
|
+
/** Targeting attributes (`plan`, `country`, `orgId`, …). Must come from trusted server state. */
|
|
12
|
+
attributes?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
/** Anything `flags.for()` accepts: a subject, a bare id, or a model with an `id`. */
|
|
15
|
+
export type SubjectLike = Subject | string | number | {
|
|
16
|
+
id: string | number;
|
|
17
|
+
} | null | undefined;
|
|
18
|
+
/** Normalizes {@link SubjectLike}. `null`/`undefined` is the anonymous subject (no targeting key). */
|
|
19
|
+
export declare function toSubject(input: SubjectLike): Subject | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* The evaluation context for a subject. The targeting key is the subject id; the type travels as
|
|
22
|
+
* the `subjectType` attribute so rules can target it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function toContext(subject: Subject | undefined, extra?: Record<string, unknown>): EvaluationContext;
|
|
25
|
+
//# sourceMappingURL=subject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/subject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,CAAC;AAEjG,sGAAsG;AACtG,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAUjE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAClC,iBAAiB,CAQnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Normalizes {@link SubjectLike}. `null`/`undefined` is the anonymous subject (no targeting key). */
|
|
2
|
+
export function toSubject(input) {
|
|
3
|
+
if (input === null || input === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
if (typeof input === 'string' || typeof input === 'number')
|
|
6
|
+
return { id: input };
|
|
7
|
+
const candidate = input;
|
|
8
|
+
if (candidate.id === undefined || candidate.id === null)
|
|
9
|
+
return undefined;
|
|
10
|
+
return {
|
|
11
|
+
id: candidate.id,
|
|
12
|
+
...(candidate.type !== undefined ? { type: candidate.type } : {}),
|
|
13
|
+
...(candidate.attributes !== undefined ? { attributes: candidate.attributes } : {}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The evaluation context for a subject. The targeting key is the subject id; the type travels as
|
|
18
|
+
* the `subjectType` attribute so rules can target it.
|
|
19
|
+
*/
|
|
20
|
+
export function toContext(subject, extra = {}) {
|
|
21
|
+
if (!subject)
|
|
22
|
+
return { ...extra };
|
|
23
|
+
return {
|
|
24
|
+
...extra,
|
|
25
|
+
...subject.attributes,
|
|
26
|
+
subjectType: subject.type ?? 'user',
|
|
27
|
+
targetingKey: String(subject.id),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=subject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/subject.ts"],"names":[],"mappings":"AAkBA,sGAAsG;AACtG,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACjF,MAAM,SAAS,GAAG,KAAyB,CAAC;IAC5C,IAAI,SAAS,CAAC,EAAE,KAAK,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO;QACL,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,OAA4B,EAC5B,KAAK,GAA4B,EAAE;IAEnC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;IAClC,OAAO;QACL,GAAG,KAAK;QACR,GAAG,OAAO,CAAC,UAAU;QACrB,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM;QACnC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { JsonValue, Ruleset } from '@adonis-agora/flags-core';
|
|
2
|
+
import type { FlagDeclaration } from '../declare.js';
|
|
3
|
+
import { FlagsManager } from '../manager.js';
|
|
4
|
+
import type { FlagKey } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Fakes flag values in a test of a booted app and restores them afterwards:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* test('one-page checkout', async ({ cleanup }) => {
|
|
10
|
+
* cleanup(fakeFlags({ checkout: 'one_page' }))
|
|
11
|
+
* // …request the page…
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function fakeFlags(values: Partial<Record<FlagKey, JsonValue>>): () => void;
|
|
16
|
+
/**
|
|
17
|
+
* A manager with no database, for unit tests of code that takes a manager or scope: give it the
|
|
18
|
+
* declarations and an optional ruleset; tracked and exposure events land in `events`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createTestFlags<F extends Record<string, FlagDeclaration>>(options: {
|
|
21
|
+
flags: F;
|
|
22
|
+
ruleset?: Partial<Ruleset>;
|
|
23
|
+
app?: string;
|
|
24
|
+
}): {
|
|
25
|
+
manager: FlagsManager;
|
|
26
|
+
/** Replaces the ruleset. */
|
|
27
|
+
setRuleset(ruleset: Partial<Ruleset>): void;
|
|
28
|
+
/** Every event recorded so far (exposures and tracks). */
|
|
29
|
+
events(): Promise<import("../index.js").FlagEvent[]>;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,MAAM,IAAI,CAEjF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE;IAClF,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;;IAoBG,4BAA4B;wBACR,OAAO,CAAC,OAAO,CAAC;IASpC,0DAA0D;;EAM7D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventBuffer } from '../events/buffer.js';
|
|
2
|
+
import { FlagsManager } from '../manager.js';
|
|
3
|
+
import { StaticSource } from '../ruleset_source.js';
|
|
4
|
+
import { getRuntime } from '../services/accessor.js';
|
|
5
|
+
import { MemoryTransport } from '../transports/memory_transport.js';
|
|
6
|
+
/**
|
|
7
|
+
* Fakes flag values in a test of a booted app and restores them afterwards:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* test('one-page checkout', async ({ cleanup }) => {
|
|
11
|
+
* cleanup(fakeFlags({ checkout: 'one_page' }))
|
|
12
|
+
* // …request the page…
|
|
13
|
+
* })
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export function fakeFlags(values) {
|
|
17
|
+
return getRuntime().manager.fake(values);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A manager with no database, for unit tests of code that takes a manager or scope: give it the
|
|
21
|
+
* declarations and an optional ruleset; tracked and exposure events land in `events`.
|
|
22
|
+
*/
|
|
23
|
+
export function createTestFlags(options) {
|
|
24
|
+
const source = new StaticSource({
|
|
25
|
+
schemaVersion: 1,
|
|
26
|
+
version: '1',
|
|
27
|
+
flags: {},
|
|
28
|
+
segments: {},
|
|
29
|
+
...options.ruleset,
|
|
30
|
+
});
|
|
31
|
+
const transport = new MemoryTransport();
|
|
32
|
+
const buffer = new EventBuffer(transport, { maxSize: 1 });
|
|
33
|
+
const manager = new FlagsManager({
|
|
34
|
+
app: options.app ?? 'test',
|
|
35
|
+
environment: 'test',
|
|
36
|
+
declarations: options.flags,
|
|
37
|
+
source,
|
|
38
|
+
buffer,
|
|
39
|
+
transport,
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
manager,
|
|
43
|
+
/** Replaces the ruleset. */
|
|
44
|
+
setRuleset(ruleset) {
|
|
45
|
+
source.replace({
|
|
46
|
+
schemaVersion: 1,
|
|
47
|
+
version: String(Date.now()),
|
|
48
|
+
flags: {},
|
|
49
|
+
segments: {},
|
|
50
|
+
...ruleset,
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
/** Every event recorded so far (exposures and tracks). */
|
|
54
|
+
async events() {
|
|
55
|
+
await buffer.flush();
|
|
56
|
+
return transport.log.map((entry) => entry.event);
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGpE;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,MAA2C;IACnE,OAAO,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAA4C,OAI1E;IACC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,GAAG,OAAO,CAAC,OAAO;KACnB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAC/B,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,MAAM;QAC1B,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,OAAO,CAAC,KAAK;QAC3B,MAAM;QACN,MAAM;QACN,SAAS;KACV,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,4BAA4B;QAC5B,UAAU,CAAC,OAAyB;YAClC,MAAM,CAAC,OAAO,CAAC;gBACb,aAAa,EAAE,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,GAAG,OAAO;aACX,CAAC,CAAC;QACL,CAAC;QACD,0DAA0D;QAC1D,KAAK,CAAC,MAAM;YACV,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Subject } from '../subject.js';
|
|
2
|
+
import type { TokenSource } from './token.js';
|
|
3
|
+
import type { VerifiedUser } from './verify.js';
|
|
4
|
+
export interface BrowserTokenPayload {
|
|
5
|
+
sub?: string;
|
|
6
|
+
typ?: string;
|
|
7
|
+
attrs?: Record<string, unknown>;
|
|
8
|
+
app: string;
|
|
9
|
+
env: string;
|
|
10
|
+
exp: number;
|
|
11
|
+
}
|
|
12
|
+
export interface IssuedBrowserToken {
|
|
13
|
+
token: string;
|
|
14
|
+
/** Epoch ms. */
|
|
15
|
+
expiresAt: number;
|
|
16
|
+
}
|
|
17
|
+
/** The signing key of one app in one environment. */
|
|
18
|
+
export declare function browserKey(secret: string, app: string, environment: string): string;
|
|
19
|
+
export declare function signBrowserToken(subject: Subject | undefined, options: {
|
|
20
|
+
key: string;
|
|
21
|
+
app: string;
|
|
22
|
+
environment: string;
|
|
23
|
+
ttlSeconds?: number;
|
|
24
|
+
}): IssuedBrowserToken;
|
|
25
|
+
/** Verifies a browser token against the flags server's secret. `null` when invalid or expired. */
|
|
26
|
+
export declare function verifyBrowserToken(token: string | undefined, secret: string): VerifiedUser | null;
|
|
27
|
+
/** Where an app gets the key it signs its browser tokens with. */
|
|
28
|
+
export interface BrowserKeySource {
|
|
29
|
+
get(): Promise<{
|
|
30
|
+
key: string;
|
|
31
|
+
app: string;
|
|
32
|
+
environment: string;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/** Standalone and control-plane: the key is derived locally. */
|
|
36
|
+
export declare function localKeySource(secret: string, app: string, environment: string): BrowserKeySource;
|
|
37
|
+
/**
|
|
38
|
+
* Tenant: asks the control-plane for this app's key (`POST <url>/v1/browser-key`), authenticated
|
|
39
|
+
* like every other tenant call. Cached for an hour; concurrent callers share one request.
|
|
40
|
+
*/
|
|
41
|
+
export declare function remoteKeySource(options: {
|
|
42
|
+
url: string;
|
|
43
|
+
token: TokenSource;
|
|
44
|
+
partition: string;
|
|
45
|
+
fetch?: typeof fetch;
|
|
46
|
+
cacheMs?: number;
|
|
47
|
+
}): BrowserKeySource;
|
|
48
|
+
//# sourceMappingURL=browser_token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser_token.d.ts","sourceRoot":"","sources":["../../../src/topology/browser_token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAehD,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAInF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9E,kBAAkB,CAiBpB;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAiCjG;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAGjG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,gBAAgB,CAuCnB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Browser tokens: short-lived, HMAC-signed evaluation contexts that an app's backend mints for
|
|
4
|
+
* its own frontend (`GET /_flags/token`) and the flags API verifies.
|
|
5
|
+
*
|
|
6
|
+
* Each app signs with its own key, derived from the flags server's secret and the app's name and
|
|
7
|
+
* environment. The flags server re-derives the key from the token's `app` and `env`, so a token
|
|
8
|
+
* cannot be moved to another app or environment, and an app can only ever mint tokens for itself.
|
|
9
|
+
* A tenant gets its key from the control-plane over its authenticated tenant connection, so there
|
|
10
|
+
* is no extra secret to distribute.
|
|
11
|
+
*/
|
|
12
|
+
const VERSION = 'v1';
|
|
13
|
+
function sameString(a, b) {
|
|
14
|
+
const x = Buffer.from(a);
|
|
15
|
+
const y = Buffer.from(b);
|
|
16
|
+
return x.length === y.length && timingSafeEqual(x, y);
|
|
17
|
+
}
|
|
18
|
+
/** The signing key of one app in one environment. */
|
|
19
|
+
export function browserKey(secret, app, environment) {
|
|
20
|
+
return createHmac('sha256', secret)
|
|
21
|
+
.update(`flags-browser-key:${VERSION}:${app}:${environment}`)
|
|
22
|
+
.digest('base64url');
|
|
23
|
+
}
|
|
24
|
+
export function signBrowserToken(subject, options) {
|
|
25
|
+
const exp = Math.floor(Date.now() / 1000) + (options.ttlSeconds ?? 300);
|
|
26
|
+
const payload = {
|
|
27
|
+
...(subject ? { sub: String(subject.id) } : {}),
|
|
28
|
+
...(subject?.type ? { typ: subject.type } : {}),
|
|
29
|
+
...(subject?.attributes && Object.keys(subject.attributes).length > 0
|
|
30
|
+
? { attrs: subject.attributes }
|
|
31
|
+
: {}),
|
|
32
|
+
app: options.app,
|
|
33
|
+
env: options.environment,
|
|
34
|
+
exp,
|
|
35
|
+
};
|
|
36
|
+
const body = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
37
|
+
const signature = createHmac('sha256', options.key)
|
|
38
|
+
.update(`${VERSION}.${body}`)
|
|
39
|
+
.digest('base64url');
|
|
40
|
+
return { token: `${VERSION}.${body}.${signature}`, expiresAt: exp * 1000 };
|
|
41
|
+
}
|
|
42
|
+
/** Verifies a browser token against the flags server's secret. `null` when invalid or expired. */
|
|
43
|
+
export function verifyBrowserToken(token, secret) {
|
|
44
|
+
if (!token)
|
|
45
|
+
return null;
|
|
46
|
+
const [version, body, signature] = token.split('.');
|
|
47
|
+
if (version !== VERSION || !body || !signature)
|
|
48
|
+
return null;
|
|
49
|
+
let payload;
|
|
50
|
+
try {
|
|
51
|
+
payload = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (typeof payload.app !== 'string' || typeof payload.env !== 'string')
|
|
57
|
+
return null;
|
|
58
|
+
if (typeof payload.exp !== 'number' || payload.exp * 1000 < Date.now())
|
|
59
|
+
return null;
|
|
60
|
+
const key = browserKey(secret, payload.app, payload.env);
|
|
61
|
+
const expected = createHmac('sha256', key).update(`${VERSION}.${body}`).digest('base64url');
|
|
62
|
+
if (!sameString(signature, expected))
|
|
63
|
+
return null;
|
|
64
|
+
const attributes = payload.attrs && typeof payload.attrs === 'object' && !Array.isArray(payload.attrs)
|
|
65
|
+
? payload.attrs
|
|
66
|
+
: undefined;
|
|
67
|
+
return {
|
|
68
|
+
...(typeof payload.sub === 'string'
|
|
69
|
+
? {
|
|
70
|
+
subject: {
|
|
71
|
+
id: payload.sub,
|
|
72
|
+
...(typeof payload.typ === 'string' ? { type: payload.typ } : {}),
|
|
73
|
+
...(attributes ? { attributes } : {}),
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
: {}),
|
|
77
|
+
environment: payload.env,
|
|
78
|
+
app: payload.app,
|
|
79
|
+
expiresAt: payload.exp * 1000,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Standalone and control-plane: the key is derived locally. */
|
|
83
|
+
export function localKeySource(secret, app, environment) {
|
|
84
|
+
const key = { key: browserKey(secret, app, environment), app, environment };
|
|
85
|
+
return { get: async () => key };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Tenant: asks the control-plane for this app's key (`POST <url>/v1/browser-key`), authenticated
|
|
89
|
+
* like every other tenant call. Cached for an hour; concurrent callers share one request.
|
|
90
|
+
*/
|
|
91
|
+
export function remoteKeySource(options) {
|
|
92
|
+
const doFetch = options.fetch ?? fetch;
|
|
93
|
+
let cached = null;
|
|
94
|
+
let inflight;
|
|
95
|
+
const load = async () => {
|
|
96
|
+
const request = async () => doFetch(`${options.url.replace(/\/$/, '')}/v1/browser-key`, {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
headers: {
|
|
99
|
+
authorization: `Bearer ${await options.token.get()}`,
|
|
100
|
+
'x-flags-tenant': options.partition,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
let response = await request();
|
|
104
|
+
if (response.status === 401 && options.token.invalidate) {
|
|
105
|
+
options.token.invalidate();
|
|
106
|
+
response = await request();
|
|
107
|
+
}
|
|
108
|
+
if (response.status === 404) {
|
|
109
|
+
throw new Error('the control-plane does not serve browsers: set `browser` in its config/flags.ts');
|
|
110
|
+
}
|
|
111
|
+
if (!response.ok)
|
|
112
|
+
throw new Error(`control-plane answered ${response.status} on /v1/browser-key`);
|
|
113
|
+
const value = (await response.json());
|
|
114
|
+
cached = { value, until: Date.now() + (options.cacheMs ?? 3_600_000) };
|
|
115
|
+
return value;
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
async get() {
|
|
119
|
+
if (cached && cached.until > Date.now())
|
|
120
|
+
return cached.value;
|
|
121
|
+
inflight ??= load().finally(() => {
|
|
122
|
+
inflight = undefined;
|
|
123
|
+
});
|
|
124
|
+
return inflight;
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=browser_token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser_token.js","sourceRoot":"","sources":["../../../src/topology/browser_token.ts"],"names":[],"mappings":"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"}
|