@beignet/core 0.0.12 → 0.0.14

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/CHANGELOG.md +21 -0
  2. package/README.md +159 -9
  3. package/dist/client/client.d.ts.map +1 -1
  4. package/dist/client/client.js +29 -1
  5. package/dist/client/client.js.map +1 -1
  6. package/dist/entitlements/index.d.ts +234 -0
  7. package/dist/entitlements/index.d.ts.map +1 -0
  8. package/dist/entitlements/index.js +172 -0
  9. package/dist/entitlements/index.js.map +1 -0
  10. package/dist/error-reporting/index.d.ts +131 -0
  11. package/dist/error-reporting/index.d.ts.map +1 -0
  12. package/dist/error-reporting/index.js +112 -0
  13. package/dist/error-reporting/index.js.map +1 -0
  14. package/dist/flags/index.d.ts +293 -0
  15. package/dist/flags/index.d.ts.map +1 -0
  16. package/dist/flags/index.js +204 -0
  17. package/dist/flags/index.js.map +1 -0
  18. package/dist/locks/index.d.ts +155 -0
  19. package/dist/locks/index.d.ts.map +1 -0
  20. package/dist/locks/index.js +248 -0
  21. package/dist/locks/index.js.map +1 -0
  22. package/dist/payments/index.d.ts +430 -0
  23. package/dist/payments/index.d.ts.map +1 -0
  24. package/dist/payments/index.js +230 -0
  25. package/dist/payments/index.js.map +1 -0
  26. package/dist/ports/index.d.ts +61 -1
  27. package/dist/ports/index.d.ts.map +1 -1
  28. package/dist/ports/index.js +33 -0
  29. package/dist/ports/index.js.map +1 -1
  30. package/dist/ports/policy.d.ts +104 -0
  31. package/dist/ports/policy.d.ts.map +1 -1
  32. package/dist/ports/policy.js +102 -7
  33. package/dist/ports/policy.js.map +1 -1
  34. package/dist/search/index.d.ts +175 -0
  35. package/dist/search/index.d.ts.map +1 -0
  36. package/dist/search/index.js +344 -0
  37. package/dist/search/index.js.map +1 -0
  38. package/dist/server/server.d.ts.map +1 -1
  39. package/dist/server/server.js +9 -1
  40. package/dist/server/server.js.map +1 -1
  41. package/dist/testing/index.d.ts +46 -1
  42. package/dist/testing/index.d.ts.map +1 -1
  43. package/dist/testing/index.js +33 -1
  44. package/dist/testing/index.js.map +1 -1
  45. package/package.json +25 -1
  46. package/src/client/client.ts +33 -1
  47. package/src/entitlements/index.ts +479 -0
  48. package/src/error-reporting/index.ts +273 -0
  49. package/src/flags/index.ts +608 -0
  50. package/src/locks/index.ts +440 -0
  51. package/src/payments/index.ts +699 -0
  52. package/src/ports/index.ts +194 -0
  53. package/src/ports/policy.ts +272 -7
  54. package/src/search/index.ts +632 -0
  55. package/src/server/server.ts +15 -0
  56. package/src/testing/index.ts +83 -1
@@ -0,0 +1,293 @@
1
+ /**
2
+ * @beignet/core/flags
3
+ *
4
+ * Provider-neutral feature flag primitives for Beignet applications.
5
+ */
6
+ type MaybePromise<T> = T | Promise<T>;
7
+ /**
8
+ * JSON-compatible value used by object flags and flag metadata.
9
+ */
10
+ export type FlagJsonValue = null | boolean | number | string | readonly FlagJsonValue[] | {
11
+ readonly [key: string]: FlagJsonValue;
12
+ };
13
+ /**
14
+ * Object-valued flags intentionally exclude scalar JSON values so the flag
15
+ * kind remains predictable.
16
+ */
17
+ export type FlagObjectValue = readonly FlagJsonValue[] | {
18
+ readonly [key: string]: FlagJsonValue;
19
+ };
20
+ /**
21
+ * Value kinds supported by Beignet flags.
22
+ */
23
+ export type FlagValue = boolean | string | number | FlagObjectValue;
24
+ /**
25
+ * Stable feature flag key.
26
+ */
27
+ export type FlagKey = string;
28
+ /**
29
+ * Feature flag value kind.
30
+ */
31
+ export type FlagKind = "boolean" | "string" | "number" | "object";
32
+ /**
33
+ * Subject used for provider-neutral flag targeting.
34
+ */
35
+ export type FlagSubject = {
36
+ type: string;
37
+ id: string;
38
+ };
39
+ /**
40
+ * Tenant or account used for provider-neutral flag targeting.
41
+ */
42
+ export type FlagTenant = {
43
+ id: string;
44
+ slug?: string;
45
+ };
46
+ /**
47
+ * Attribute value accepted by the provider-neutral flag context.
48
+ */
49
+ export type FlagAttributeValue = null | boolean | number | string | readonly FlagAttributeValue[] | {
50
+ readonly [key: string]: FlagAttributeValue;
51
+ };
52
+ /**
53
+ * Context supplied to flag evaluations, exposure recording, and tracking.
54
+ */
55
+ export type FlagEvaluationContext = {
56
+ /**
57
+ * Stable key used by providers for rollout bucketing and targeting.
58
+ */
59
+ targetingKey: string;
60
+ /**
61
+ * Actor, user, service, tenant, or account being targeted.
62
+ */
63
+ subject?: FlagSubject;
64
+ /**
65
+ * Tenant/account scope, when available.
66
+ */
67
+ tenant?: FlagTenant;
68
+ /**
69
+ * Provider-neutral targeting attributes. Keep private data out unless the
70
+ * selected provider and retention policy are approved for it.
71
+ */
72
+ attributes?: Record<string, FlagAttributeValue>;
73
+ /**
74
+ * Attribute keys that should be treated as private by providers and
75
+ * instrumentation.
76
+ */
77
+ privateAttributes?: readonly string[];
78
+ requestId?: string;
79
+ traceId?: string;
80
+ spanId?: string;
81
+ parentSpanId?: string;
82
+ traceparent?: string;
83
+ };
84
+ /**
85
+ * Flag definition registered through `defineFlags(...)`.
86
+ */
87
+ export type FlagDef<TValue extends FlagValue = FlagValue> = {
88
+ key: FlagKey;
89
+ kind: FlagKindForValue<TValue>;
90
+ defaultValue: TValue;
91
+ description?: string;
92
+ metadata?: Record<string, unknown>;
93
+ };
94
+ /**
95
+ * Infer the flag value type from a flag definition.
96
+ */
97
+ export type InferFlagValue<TFlag> = TFlag extends FlagDef<infer TValue> ? TValue : never;
98
+ /**
99
+ * Map a value type to its runtime flag kind.
100
+ */
101
+ export type FlagKindForValue<TValue extends FlagValue> = TValue extends boolean ? "boolean" : TValue extends string ? "string" : TValue extends number ? "number" : "object";
102
+ /**
103
+ * Options accepted when declaring a flag.
104
+ */
105
+ export type DefineFlagOptions<TValue extends FlagValue> = {
106
+ default: TValue;
107
+ description?: string;
108
+ metadata?: Record<string, unknown>;
109
+ };
110
+ /**
111
+ * Registry returned by `defineFlags(...)`.
112
+ */
113
+ export type FlagRegistry = Record<string, FlagDef>;
114
+ /**
115
+ * Reason a flag received its value.
116
+ */
117
+ export type FlagEvaluationReason = "static" | "targeting_match" | "default" | "error" | "unknown" | (string & {});
118
+ /**
119
+ * Normalized error summary for failed flag provider evaluations.
120
+ */
121
+ export type FlagEvaluationError = {
122
+ message: string;
123
+ code?: string;
124
+ };
125
+ /**
126
+ * Options accepted by flag evaluations.
127
+ */
128
+ export type FlagEvaluationOptions<TValue extends FlagValue = FlagValue> = {
129
+ context?: FlagEvaluationContext;
130
+ /**
131
+ * Override the flag declaration default for this call.
132
+ */
133
+ defaultValue?: TValue;
134
+ /**
135
+ * Explicitly record an exposure after evaluation succeeds. Plain evaluation
136
+ * does not record exposure by default.
137
+ */
138
+ expose?: boolean;
139
+ };
140
+ /**
141
+ * Normalized flag evaluation details.
142
+ */
143
+ export type FlagEvaluationDetails<TValue extends FlagValue = FlagValue> = {
144
+ key: string;
145
+ value: TValue;
146
+ defaultValue: TValue;
147
+ kind: FlagKindForValue<TValue>;
148
+ reason: FlagEvaluationReason;
149
+ defaulted: boolean;
150
+ variant?: string;
151
+ metadata?: Record<string, unknown>;
152
+ error?: FlagEvaluationError;
153
+ };
154
+ /**
155
+ * Options accepted by explicit exposure recording.
156
+ */
157
+ export type FlagExposureOptions = {
158
+ context?: FlagEvaluationContext;
159
+ value?: FlagValue;
160
+ variant?: string;
161
+ metadata?: Record<string, unknown>;
162
+ };
163
+ /**
164
+ * Options accepted by tracking calls.
165
+ */
166
+ export type FlagTrackOptions = {
167
+ context?: FlagEvaluationContext;
168
+ value?: number;
169
+ metadata?: Record<string, unknown>;
170
+ };
171
+ /**
172
+ * App-facing feature flag port.
173
+ */
174
+ export type FlagsPort = {
175
+ evaluate<TValue extends FlagValue>(flag: FlagDef<TValue>, options?: FlagEvaluationOptions<TValue>): Promise<TValue>;
176
+ details<TValue extends FlagValue>(flag: FlagDef<TValue>, options?: FlagEvaluationOptions<TValue>): Promise<FlagEvaluationDetails<TValue>>;
177
+ recordExposure<TValue extends FlagValue>(flag: FlagDef<TValue>, options?: FlagExposureOptions): Promise<void>;
178
+ track(event: string, options?: FlagTrackOptions): Promise<void>;
179
+ };
180
+ /**
181
+ * Flag evaluation observation emitted by memory/static adapters.
182
+ */
183
+ export type FlagEvaluationObservation<TValue extends FlagValue = FlagValue> = {
184
+ source: "evaluate" | "details";
185
+ flag: FlagDef<TValue>;
186
+ context?: FlagEvaluationContext;
187
+ details: FlagEvaluationDetails<TValue>;
188
+ durationMs: number;
189
+ requestId?: string;
190
+ traceId?: string;
191
+ spanId?: string;
192
+ parentSpanId?: string;
193
+ traceparent?: string;
194
+ };
195
+ /**
196
+ * Explicit flag exposure observation.
197
+ */
198
+ export type FlagExposureObservation<TValue extends FlagValue = FlagValue> = {
199
+ flag: FlagDef<TValue>;
200
+ context?: FlagEvaluationContext;
201
+ value?: FlagValue;
202
+ variant?: string;
203
+ metadata?: Record<string, unknown>;
204
+ requestId?: string;
205
+ traceId?: string;
206
+ spanId?: string;
207
+ parentSpanId?: string;
208
+ traceparent?: string;
209
+ };
210
+ /**
211
+ * Flag tracking observation.
212
+ */
213
+ export type FlagTrackObservation = {
214
+ event: string;
215
+ context?: FlagEvaluationContext;
216
+ value?: number;
217
+ metadata?: Record<string, unknown>;
218
+ requestId?: string;
219
+ traceId?: string;
220
+ spanId?: string;
221
+ parentSpanId?: string;
222
+ traceparent?: string;
223
+ };
224
+ export type FlagEvaluationObserver = (observation: FlagEvaluationObservation) => MaybePromise<void>;
225
+ export type FlagExposureObserver = (observation: FlagExposureObservation) => MaybePromise<void>;
226
+ export type FlagTrackObserver = (observation: FlagTrackObservation) => MaybePromise<void>;
227
+ /**
228
+ * Options for memory/static flag adapters.
229
+ */
230
+ export type CreateFlagsOptions = {
231
+ onEvaluation?: FlagEvaluationObserver;
232
+ onExposure?: FlagExposureObserver;
233
+ onTrack?: FlagTrackObserver;
234
+ };
235
+ /**
236
+ * Static flag values keyed by flag key.
237
+ */
238
+ export type StaticFlagValues = Record<string, FlagValue>;
239
+ /**
240
+ * Options for `createStaticFlags(...)`.
241
+ */
242
+ export type CreateStaticFlagsOptions = CreateFlagsOptions & {
243
+ values?: StaticFlagValues;
244
+ };
245
+ /**
246
+ * In-memory flags port with mutation helpers for tests and local development.
247
+ */
248
+ export type MemoryFlagsPort = FlagsPort & {
249
+ values: Map<string, FlagValue>;
250
+ set<TValue extends FlagValue>(flag: FlagDef<TValue>, value: TValue): void;
251
+ reset(flag?: FlagDef): void;
252
+ };
253
+ declare function defineBooleanFlag(key: string, options: DefineFlagOptions<boolean>): FlagDef<boolean>;
254
+ declare function defineStringFlag(key: string, options: DefineFlagOptions<string>): FlagDef<string>;
255
+ declare function defineStringFlag<const TValue extends string>(key: string, options: DefineFlagOptions<TValue>): FlagDef<TValue>;
256
+ declare function defineNumberFlag(key: string, options: DefineFlagOptions<number>): FlagDef<number>;
257
+ declare function defineNumberFlag<const TValue extends number>(key: string, options: DefineFlagOptions<TValue>): FlagDef<TValue>;
258
+ declare function defineObjectFlag<TValue extends FlagObjectValue>(key: string, options: DefineFlagOptions<TValue>): FlagDef<TValue>;
259
+ /**
260
+ * Define one feature flag declaration.
261
+ */
262
+ export declare const defineFlag: {
263
+ boolean: typeof defineBooleanFlag;
264
+ string: typeof defineStringFlag;
265
+ number: typeof defineNumberFlag;
266
+ object: typeof defineObjectFlag;
267
+ };
268
+ /**
269
+ * Define a typed registry of feature flags.
270
+ */
271
+ export declare function defineFlags<const TRegistry extends FlagRegistry>(registry: TRegistry): TRegistry;
272
+ /**
273
+ * Alias for apps that prefer to name the collection explicitly.
274
+ */
275
+ export declare const defineFlagRegistry: typeof defineFlags;
276
+ /**
277
+ * Evaluate a flag through any `FlagsPort`.
278
+ */
279
+ export declare function evaluateFlag<TValue extends FlagValue>(flags: FlagsPort, flag: FlagDef<TValue>, options?: FlagEvaluationOptions<TValue>): Promise<TValue>;
280
+ /**
281
+ * Return detailed flag evaluation information through any `FlagsPort`.
282
+ */
283
+ export declare function getFlagDetails<TValue extends FlagValue>(flags: FlagsPort, flag: FlagDef<TValue>, options?: FlagEvaluationOptions<TValue>): Promise<FlagEvaluationDetails<TValue>>;
284
+ /**
285
+ * Create static flags backed by fixed values.
286
+ */
287
+ export declare function createStaticFlags(options?: CreateStaticFlagsOptions): FlagsPort;
288
+ /**
289
+ * Create mutable in-memory flags for tests, examples, and local development.
290
+ */
291
+ export declare function createMemoryFlags(options?: CreateStaticFlagsOptions): MemoryFlagsPort;
292
+ export {};
293
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/flags/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @beignet/core/flags
3
+ *
4
+ * Provider-neutral feature flag primitives for Beignet applications.
5
+ */
6
+ function createFlag(kind, key, options) {
7
+ const defaultValue = options.default;
8
+ if (!matchesKind(defaultValue, kind)) {
9
+ throw new Error(`Flag "${key}" default value does not match "${kind}" flag kind.`);
10
+ }
11
+ return {
12
+ key,
13
+ kind: kind,
14
+ defaultValue,
15
+ description: options.description,
16
+ metadata: options.metadata,
17
+ };
18
+ }
19
+ function defineBooleanFlag(key, options) {
20
+ return createFlag("boolean", key, options);
21
+ }
22
+ function defineStringFlag(key, options) {
23
+ return createFlag("string", key, options);
24
+ }
25
+ function defineNumberFlag(key, options) {
26
+ return createFlag("number", key, options);
27
+ }
28
+ function defineObjectFlag(key, options) {
29
+ return createFlag("object", key, options);
30
+ }
31
+ /**
32
+ * Define one feature flag declaration.
33
+ */
34
+ export const defineFlag = {
35
+ boolean: defineBooleanFlag,
36
+ string: defineStringFlag,
37
+ number: defineNumberFlag,
38
+ object: defineObjectFlag,
39
+ };
40
+ /**
41
+ * Define a typed registry of feature flags.
42
+ */
43
+ export function defineFlags(registry) {
44
+ return registry;
45
+ }
46
+ /**
47
+ * Alias for apps that prefer to name the collection explicitly.
48
+ */
49
+ export const defineFlagRegistry = defineFlags;
50
+ /**
51
+ * Evaluate a flag through any `FlagsPort`.
52
+ */
53
+ export function evaluateFlag(flags, flag, options) {
54
+ return flags.evaluate(flag, options);
55
+ }
56
+ /**
57
+ * Return detailed flag evaluation information through any `FlagsPort`.
58
+ */
59
+ export function getFlagDetails(flags, flag, options) {
60
+ return flags.details(flag, options);
61
+ }
62
+ /**
63
+ * Create static flags backed by fixed values.
64
+ */
65
+ export function createStaticFlags(options = {}) {
66
+ return createFlagsFromStore(() => options.values ?? {}, options);
67
+ }
68
+ /**
69
+ * Create mutable in-memory flags for tests, examples, and local development.
70
+ */
71
+ export function createMemoryFlags(options = {}) {
72
+ const values = new Map(Object.entries(options.values ?? {}));
73
+ const port = createFlagsFromStore(() => Object.fromEntries(values), options);
74
+ return {
75
+ ...port,
76
+ values,
77
+ set(flag, value) {
78
+ if (!matchesKind(value, flag.kind)) {
79
+ throw new Error(`Flag "${flag.key}" value does not match "${flag.kind}" flag kind.`);
80
+ }
81
+ values.set(flag.key, value);
82
+ },
83
+ reset(flag) {
84
+ if (flag) {
85
+ values.delete(flag.key);
86
+ return;
87
+ }
88
+ values.clear();
89
+ },
90
+ };
91
+ }
92
+ function createFlagsFromStore(readValues, observers) {
93
+ async function resolve(flag, options, source) {
94
+ const startedAt = Date.now();
95
+ const defaultValue = options?.defaultValue ?? flag.defaultValue;
96
+ const values = readValues();
97
+ const stored = values[flag.key];
98
+ const hasStored = Object.hasOwn(values, flag.key);
99
+ const usedStoredValue = hasStored && matchesKind(stored, flag.kind);
100
+ const value = usedStoredValue
101
+ ? stored
102
+ : defaultValue;
103
+ const details = {
104
+ key: flag.key,
105
+ kind: flag.kind,
106
+ value,
107
+ defaultValue,
108
+ reason: usedStoredValue ? "static" : "default",
109
+ defaulted: !usedStoredValue,
110
+ };
111
+ await observeEvaluation(observers.onEvaluation, {
112
+ source,
113
+ flag,
114
+ context: options?.context,
115
+ details,
116
+ durationMs: Date.now() - startedAt,
117
+ ...correlationFromContext(options?.context),
118
+ });
119
+ if (options?.expose) {
120
+ await flags.recordExposure(flag, {
121
+ context: options.context,
122
+ value: details.value,
123
+ variant: details.variant,
124
+ metadata: details.metadata,
125
+ });
126
+ }
127
+ return details;
128
+ }
129
+ const flags = {
130
+ async evaluate(flag, options) {
131
+ const details = await resolve(flag, options, "evaluate");
132
+ return details.value;
133
+ },
134
+ async details(flag, options) {
135
+ return resolve(flag, options, "details");
136
+ },
137
+ async recordExposure(flag, options) {
138
+ await observeExposure(observers.onExposure, {
139
+ flag,
140
+ context: options?.context,
141
+ value: options?.value,
142
+ variant: options?.variant,
143
+ metadata: options?.metadata,
144
+ ...correlationFromContext(options?.context),
145
+ });
146
+ },
147
+ async track(event, options) {
148
+ await observeTrack(observers.onTrack, {
149
+ event,
150
+ context: options?.context,
151
+ value: options?.value,
152
+ metadata: options?.metadata,
153
+ ...correlationFromContext(options?.context),
154
+ });
155
+ },
156
+ };
157
+ return flags;
158
+ }
159
+ function matchesKind(value, kind) {
160
+ switch (kind) {
161
+ case "boolean":
162
+ return typeof value === "boolean";
163
+ case "string":
164
+ return typeof value === "string";
165
+ case "number":
166
+ return typeof value === "number" && Number.isFinite(value);
167
+ case "object":
168
+ return typeof value === "object" && value !== null;
169
+ }
170
+ }
171
+ function correlationFromContext(context) {
172
+ return {
173
+ requestId: context?.requestId,
174
+ traceId: context?.traceId,
175
+ spanId: context?.spanId,
176
+ parentSpanId: context?.parentSpanId,
177
+ traceparent: context?.traceparent,
178
+ };
179
+ }
180
+ async function observeEvaluation(observer, observation) {
181
+ try {
182
+ await observer?.(observation);
183
+ }
184
+ catch {
185
+ // Observers are diagnostic only.
186
+ }
187
+ }
188
+ async function observeExposure(observer, observation) {
189
+ try {
190
+ await observer?.(observation);
191
+ }
192
+ catch {
193
+ // Observers are diagnostic only.
194
+ }
195
+ }
196
+ async function observeTrack(observer, observation) {
197
+ try {
198
+ await observer?.(observation);
199
+ }
200
+ catch {
201
+ // Observers are diagnostic only.
202
+ }
203
+ }
204
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flags/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @beignet/core/locks
3
+ *
4
+ * Provider-neutral distributed lock and lease primitives for Beignet apps.
5
+ */
6
+ type MaybePromise<T> = T | Promise<T>;
7
+ /**
8
+ * Metadata attached to lock acquisition instrumentation and diagnostics.
9
+ */
10
+ export type LeaseMetadata = Record<string, string | number | boolean | null | undefined>;
11
+ /**
12
+ * Options for acquiring a lease.
13
+ */
14
+ export type LeaseAcquireOptions = {
15
+ /**
16
+ * Lease time-to-live in milliseconds. The provider must treat ownership as
17
+ * expired after this duration unless the lease is renewed.
18
+ */
19
+ ttlMs: number;
20
+ /**
21
+ * How long to wait for the lease before returning a non-acquired result.
22
+ *
23
+ * @default 0
24
+ */
25
+ waitMs?: number;
26
+ /**
27
+ * Delay between acquisition attempts while waiting.
28
+ *
29
+ * @default 50
30
+ */
31
+ retryDelayMs?: number;
32
+ /**
33
+ * Optional owner token supplied by the caller. Providers generate one when
34
+ * omitted. Release and renew operations must only succeed for the current
35
+ * owner token.
36
+ */
37
+ ownerToken?: string;
38
+ /**
39
+ * Optional diagnostics metadata. Providers should not use this for lock
40
+ * correctness.
41
+ */
42
+ metadata?: LeaseMetadata;
43
+ };
44
+ /**
45
+ * Options for renewing a lease.
46
+ */
47
+ export type LeaseRenewOptions = {
48
+ /**
49
+ * New lease time-to-live in milliseconds. Defaults to the original ttlMs
50
+ * used to acquire the lease.
51
+ */
52
+ ttlMs?: number;
53
+ };
54
+ /**
55
+ * Active lease handle returned by a lock provider.
56
+ */
57
+ export type LeaseHandle = {
58
+ key: string;
59
+ ownerToken: string;
60
+ expiresAt?: Date;
61
+ /**
62
+ * Optional monotonically increasing token. Apps can store this with writes to
63
+ * reject stale lease owners when the underlying resource supports fencing.
64
+ */
65
+ fencingToken?: string | number;
66
+ renew(options?: LeaseRenewOptions): Promise<boolean>;
67
+ release(): Promise<boolean>;
68
+ };
69
+ /**
70
+ * Lease acquisition result.
71
+ */
72
+ export type LeaseAcquireResult = {
73
+ acquired: true;
74
+ lease: LeaseHandle;
75
+ } | {
76
+ acquired: false;
77
+ reason: "unavailable" | "timeout";
78
+ };
79
+ /**
80
+ * App-facing lock port.
81
+ */
82
+ export type LocksPort = {
83
+ acquire(key: string, options: LeaseAcquireOptions): Promise<LeaseAcquireResult>;
84
+ withLease<T>(key: string, options: LeaseAcquireOptions, fn: (ctx: {
85
+ lease: LeaseHandle;
86
+ }) => MaybePromise<T>): Promise<T | undefined>;
87
+ restore(key: string, ownerToken: string): LeaseHandle;
88
+ forceRelease(key: string): Promise<boolean>;
89
+ };
90
+ /**
91
+ * Captured memory lease state exposed for tests.
92
+ */
93
+ export type MemoryLeaseRecord = {
94
+ key: string;
95
+ ownerToken: string;
96
+ expiresAt: Date;
97
+ ttlMs: number;
98
+ fencingToken: number;
99
+ metadata?: LeaseMetadata;
100
+ };
101
+ /**
102
+ * In-memory locks port exposed for assertions in tests.
103
+ */
104
+ export type MemoryLocksPort = LocksPort & {
105
+ leases: Map<string, MemoryLeaseRecord>;
106
+ reset(): void;
107
+ };
108
+ /**
109
+ * Options for the in-memory locks adapter.
110
+ */
111
+ export type CreateMemoryLocksOptions = {
112
+ now?: () => Date;
113
+ createOwnerToken?: () => string;
114
+ sleep?: (ms: number) => Promise<void>;
115
+ };
116
+ /**
117
+ * Options for the in-memory locks provider.
118
+ */
119
+ export type MemoryLocksProviderOptions = CreateMemoryLocksOptions & {
120
+ name?: string;
121
+ };
122
+ /**
123
+ * Ports contributed by the memory locks provider.
124
+ */
125
+ export interface MemoryLocksProviderPorts {
126
+ locks: LocksPort;
127
+ }
128
+ /**
129
+ * Error thrown when a lease option is invalid.
130
+ */
131
+ export declare class LeaseOptionsError extends Error {
132
+ constructor(message: string);
133
+ }
134
+ /**
135
+ * Create an in-memory locks port for tests and single-process development.
136
+ */
137
+ export declare function createMemoryLocks(options?: CreateMemoryLocksOptions): MemoryLocksPort;
138
+ /**
139
+ * Create a provider that contributes an in-memory locks port.
140
+ */
141
+ export declare function createMemoryLocksProvider(options?: MemoryLocksProviderOptions): import("../providers/provider.js").ServiceProvider<unknown, import("@standard-schema/spec").StandardSchemaV1<void, void>, {
142
+ locks: LocksPort;
143
+ }, unknown, void>;
144
+ /**
145
+ * Convenience helper for any lock port.
146
+ */
147
+ export declare function acquireLease(locks: LocksPort, key: string, options: LeaseAcquireOptions): Promise<LeaseAcquireResult>;
148
+ /**
149
+ * Convenience helper for any lock port.
150
+ */
151
+ export declare function withLease<T>(locks: LocksPort, key: string, options: LeaseAcquireOptions, fn: (ctx: {
152
+ lease: LeaseHandle;
153
+ }) => MaybePromise<T>): Promise<T | undefined>;
154
+ export {};
155
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/locks/index.ts"],"names":[],"mappings":"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"}