@barekey/sdk 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.
Files changed (57) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +21 -0
  3. package/dist/client.d.ts +41 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +302 -0
  6. package/dist/errors.d.ts +461 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +343 -0
  9. package/dist/handle.d.ts +20 -0
  10. package/dist/handle.d.ts.map +1 -0
  11. package/dist/handle.js +35 -0
  12. package/dist/index.d.ts +5 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +3 -0
  15. package/dist/internal/cache.d.ts +13 -0
  16. package/dist/internal/cache.d.ts.map +1 -0
  17. package/dist/internal/cache.js +24 -0
  18. package/dist/internal/evaluate.d.ts +7 -0
  19. package/dist/internal/evaluate.d.ts.map +1 -0
  20. package/dist/internal/evaluate.js +176 -0
  21. package/dist/internal/http.d.ts +19 -0
  22. package/dist/internal/http.d.ts.map +1 -0
  23. package/dist/internal/http.js +92 -0
  24. package/dist/internal/node-runtime.d.ts +19 -0
  25. package/dist/internal/node-runtime.d.ts.map +1 -0
  26. package/dist/internal/node-runtime.js +422 -0
  27. package/dist/internal/requirements.d.ts +3 -0
  28. package/dist/internal/requirements.d.ts.map +1 -0
  29. package/dist/internal/requirements.js +40 -0
  30. package/dist/internal/runtime.d.ts +15 -0
  31. package/dist/internal/runtime.d.ts.map +1 -0
  32. package/dist/internal/runtime.js +135 -0
  33. package/dist/internal/ttl.d.ts +4 -0
  34. package/dist/internal/ttl.d.ts.map +1 -0
  35. package/dist/internal/ttl.js +30 -0
  36. package/dist/internal/typegen.d.ts +25 -0
  37. package/dist/internal/typegen.d.ts.map +1 -0
  38. package/dist/internal/typegen.js +75 -0
  39. package/dist/types.d.ts +130 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +1 -0
  42. package/generated.d.ts +16 -0
  43. package/index.d.ts +2 -0
  44. package/package.json +42 -0
  45. package/src/client.ts +422 -0
  46. package/src/errors.ts +420 -0
  47. package/src/handle.ts +67 -0
  48. package/src/index.ts +60 -0
  49. package/src/internal/cache.ts +33 -0
  50. package/src/internal/evaluate.ts +232 -0
  51. package/src/internal/http.ts +134 -0
  52. package/src/internal/node-runtime.ts +581 -0
  53. package/src/internal/requirements.ts +57 -0
  54. package/src/internal/runtime.ts +199 -0
  55. package/src/internal/ttl.ts +41 -0
  56. package/src/internal/typegen.ts +124 -0
  57. package/src/types.ts +189 -0
package/dist/errors.js ADDED
@@ -0,0 +1,343 @@
1
+ const INT64_MIN = BigInt("-9223372036854775808");
2
+ const INT64_MAX = BigInt("9223372036854775807");
3
+ const ERROR_DESCRIPTORS = {
4
+ FS_NOT_AVAILABLE: {
5
+ code: "FS_NOT_AVAILABLE",
6
+ name: "FsNotAvailableError",
7
+ description: "A filesystem is not available.",
8
+ },
9
+ NO_CONFIGURATION_PROVIDED: {
10
+ code: "NO_CONFIGURATION_PROVIDED",
11
+ name: "NoConfigurationProvidedError",
12
+ description: "No Barekey configuration was provided.",
13
+ },
14
+ INVALID_CONFIGURATION_PROVIDED: {
15
+ code: "INVALID_CONFIGURATION_PROVIDED",
16
+ name: "InvalidConfigurationProvidedError",
17
+ description: "Invalid Barekey configuration was provided.",
18
+ },
19
+ NO_CREDENTIALS_PROVIDED: {
20
+ code: "NO_CREDENTIALS_PROVIDED",
21
+ name: "NoCredentialsProvidedError",
22
+ description: "No Barekey credentials were provided.",
23
+ },
24
+ INVALID_CREDENTIALS_PROVIDED: {
25
+ code: "INVALID_CREDENTIALS_PROVIDED",
26
+ name: "InvalidCredentialsProvidedError",
27
+ description: "Invalid Barekey credentials were provided.",
28
+ },
29
+ INVALID_DYNAMIC_OPTIONS: {
30
+ code: "INVALID_DYNAMIC_OPTIONS",
31
+ name: "InvalidDynamicOptionsError",
32
+ description: "Invalid dynamic options were provided.",
33
+ },
34
+ REQUIREMENTS_VALIDATION_FAILED: {
35
+ code: "REQUIREMENTS_VALIDATION_FAILED",
36
+ name: "RequirementsValidationFailedError",
37
+ description: "Barekey requirements validation failed.",
38
+ },
39
+ NETWORK_ERROR: {
40
+ code: "NETWORK_ERROR",
41
+ name: "NetworkError",
42
+ description: "A Barekey network request failed.",
43
+ },
44
+ COERCE_FAILED: {
45
+ code: "COERCE_FAILED",
46
+ name: "CoerceFailedError",
47
+ description: "Barekey could not coerce the resolved value.",
48
+ },
49
+ TEMPORAL_NOT_AVAILABLE: {
50
+ code: "TEMPORAL_NOT_AVAILABLE",
51
+ name: "TemporalNotAvailableError",
52
+ description: "Temporal is not available in this runtime.",
53
+ },
54
+ SDK_MODULE_NOT_FOUND: {
55
+ code: "SDK_MODULE_NOT_FOUND",
56
+ name: "SdkModuleNotFoundError",
57
+ description: "The installed @barekey/sdk module could not be found.",
58
+ },
59
+ TYPEGEN_UNSUPPORTED_SDK: {
60
+ code: "TYPEGEN_UNSUPPORTED_SDK",
61
+ name: "TypegenUnsupportedSdkError",
62
+ description: "The installed @barekey/sdk module does not support in-module typegen.",
63
+ },
64
+ TYPEGEN_READ_FAILED: {
65
+ code: "TYPEGEN_READ_FAILED",
66
+ name: "TypegenReadFailedError",
67
+ description: "Barekey could not read the generated SDK types.",
68
+ },
69
+ TYPEGEN_WRITE_FAILED: {
70
+ code: "TYPEGEN_WRITE_FAILED",
71
+ name: "TypegenWriteFailedError",
72
+ description: "Barekey could not write the generated SDK types.",
73
+ },
74
+ UNAUTHORIZED: {
75
+ code: "UNAUTHORIZED",
76
+ name: "UnauthorizedError",
77
+ description: "The provided Barekey credentials were rejected.",
78
+ },
79
+ INVALID_ORG_SCOPE: {
80
+ code: "INVALID_ORG_SCOPE",
81
+ name: "InvalidOrgScopeError",
82
+ description: "The requested organization scope is invalid.",
83
+ },
84
+ ORG_SCOPE_INVALID: {
85
+ code: "ORG_SCOPE_INVALID",
86
+ name: "OrgScopeInvalidError",
87
+ description: "The authenticated organization scope is invalid.",
88
+ },
89
+ INVALID_JSON: {
90
+ code: "INVALID_JSON",
91
+ name: "InvalidJsonError",
92
+ description: "The Barekey request body was invalid JSON.",
93
+ },
94
+ INVALID_REQUEST: {
95
+ code: "INVALID_REQUEST",
96
+ name: "InvalidRequestError",
97
+ description: "The Barekey request was invalid.",
98
+ },
99
+ VARIABLE_NOT_FOUND: {
100
+ code: "VARIABLE_NOT_FOUND",
101
+ name: "VariableNotFoundError",
102
+ description: "The requested Barekey variable was not found.",
103
+ },
104
+ EVALUATION_FAILED: {
105
+ code: "EVALUATION_FAILED",
106
+ name: "EvaluationFailedError",
107
+ description: "Barekey could not evaluate the requested variable.",
108
+ },
109
+ USAGE_LIMIT_EXCEEDED: {
110
+ code: "USAGE_LIMIT_EXCEEDED",
111
+ name: "UsageLimitExceededError",
112
+ description: "The Barekey usage limit has been exceeded.",
113
+ },
114
+ BILLING_UNAVAILABLE: {
115
+ code: "BILLING_UNAVAILABLE",
116
+ name: "BillingUnavailableError",
117
+ description: "Barekey billing is temporarily unavailable.",
118
+ },
119
+ DEVICE_CODE_NOT_FOUND: {
120
+ code: "DEVICE_CODE_NOT_FOUND",
121
+ name: "DeviceCodeNotFoundError",
122
+ description: "The Barekey device code was not found.",
123
+ },
124
+ DEVICE_CODE_EXPIRED: {
125
+ code: "DEVICE_CODE_EXPIRED",
126
+ name: "DeviceCodeExpiredError",
127
+ description: "The Barekey device code has expired.",
128
+ },
129
+ USER_CODE_INVALID: {
130
+ code: "USER_CODE_INVALID",
131
+ name: "UserCodeInvalidError",
132
+ description: "The Barekey user code is invalid.",
133
+ },
134
+ INVALID_REFRESH_TOKEN: {
135
+ code: "INVALID_REFRESH_TOKEN",
136
+ name: "InvalidRefreshTokenError",
137
+ description: "The Barekey refresh token is invalid.",
138
+ },
139
+ UNKNOWN_ERROR: {
140
+ code: "UNKNOWN_ERROR",
141
+ name: "UnknownError",
142
+ description: "An unknown Barekey error occurred.",
143
+ },
144
+ };
145
+ function toDocsSlug(code) {
146
+ return code.toLowerCase().replaceAll("_", "-");
147
+ }
148
+ export function docsUrlForErrorCode(code) {
149
+ return `https://docs.barekey.dev/errors/${toDocsSlug(code)}`;
150
+ }
151
+ export function formatBarekeyErrorMessage(code, description) {
152
+ return `[${code}]: ${description}\n${docsUrlForErrorCode(code)}`;
153
+ }
154
+ export class BarekeyError extends Error {
155
+ code;
156
+ docsUrl;
157
+ requestId;
158
+ status;
159
+ cause;
160
+ constructor(input) {
161
+ super(formatBarekeyErrorMessage(input.code, input.message));
162
+ this.name = input.name;
163
+ this.code = input.code;
164
+ this.docsUrl = docsUrlForErrorCode(input.code);
165
+ this.requestId = input.requestId ?? null;
166
+ this.status = input.status ?? null;
167
+ this.cause = input.cause;
168
+ }
169
+ }
170
+ function buildErrorClass(descriptor) {
171
+ return class extends BarekeyError {
172
+ constructor(input = {}) {
173
+ super({
174
+ code: descriptor.code,
175
+ name: descriptor.name,
176
+ message: input.message ?? descriptor.description,
177
+ requestId: input.requestId,
178
+ status: input.status,
179
+ cause: input.cause,
180
+ });
181
+ }
182
+ };
183
+ }
184
+ export const FsNotAvailableError = buildErrorClass(ERROR_DESCRIPTORS.FS_NOT_AVAILABLE);
185
+ export const NoConfigurationProvidedError = buildErrorClass(ERROR_DESCRIPTORS.NO_CONFIGURATION_PROVIDED);
186
+ export const InvalidConfigurationProvidedError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_CONFIGURATION_PROVIDED);
187
+ export const NoCredentialsProvidedError = buildErrorClass(ERROR_DESCRIPTORS.NO_CREDENTIALS_PROVIDED);
188
+ export const InvalidCredentialsProvidedError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_CREDENTIALS_PROVIDED);
189
+ export const InvalidDynamicOptionsError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_DYNAMIC_OPTIONS);
190
+ export const RequirementsValidationFailedError = buildErrorClass(ERROR_DESCRIPTORS.REQUIREMENTS_VALIDATION_FAILED);
191
+ export const NetworkError = buildErrorClass(ERROR_DESCRIPTORS.NETWORK_ERROR);
192
+ export const CoerceFailedError = buildErrorClass(ERROR_DESCRIPTORS.COERCE_FAILED);
193
+ export const TemporalNotAvailableError = buildErrorClass(ERROR_DESCRIPTORS.TEMPORAL_NOT_AVAILABLE);
194
+ export const SdkModuleNotFoundError = buildErrorClass(ERROR_DESCRIPTORS.SDK_MODULE_NOT_FOUND);
195
+ export const TypegenUnsupportedSdkError = buildErrorClass(ERROR_DESCRIPTORS.TYPEGEN_UNSUPPORTED_SDK);
196
+ export const TypegenReadFailedError = buildErrorClass(ERROR_DESCRIPTORS.TYPEGEN_READ_FAILED);
197
+ export const TypegenWriteFailedError = buildErrorClass(ERROR_DESCRIPTORS.TYPEGEN_WRITE_FAILED);
198
+ export const UnauthorizedError = buildErrorClass(ERROR_DESCRIPTORS.UNAUTHORIZED);
199
+ export const InvalidOrgScopeError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_ORG_SCOPE);
200
+ export const OrgScopeInvalidError = buildErrorClass(ERROR_DESCRIPTORS.ORG_SCOPE_INVALID);
201
+ export const InvalidJsonError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_JSON);
202
+ export const InvalidRequestError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_REQUEST);
203
+ export const VariableNotFoundError = buildErrorClass(ERROR_DESCRIPTORS.VARIABLE_NOT_FOUND);
204
+ export const EvaluationFailedError = buildErrorClass(ERROR_DESCRIPTORS.EVALUATION_FAILED);
205
+ export const UsageLimitExceededError = buildErrorClass(ERROR_DESCRIPTORS.USAGE_LIMIT_EXCEEDED);
206
+ export const BillingUnavailableError = buildErrorClass(ERROR_DESCRIPTORS.BILLING_UNAVAILABLE);
207
+ export const DeviceCodeNotFoundError = buildErrorClass(ERROR_DESCRIPTORS.DEVICE_CODE_NOT_FOUND);
208
+ export const DeviceCodeExpiredError = buildErrorClass(ERROR_DESCRIPTORS.DEVICE_CODE_EXPIRED);
209
+ export const UserCodeInvalidError = buildErrorClass(ERROR_DESCRIPTORS.USER_CODE_INVALID);
210
+ export const InvalidRefreshTokenError = buildErrorClass(ERROR_DESCRIPTORS.INVALID_REFRESH_TOKEN);
211
+ export const UnknownError = buildErrorClass(ERROR_DESCRIPTORS.UNKNOWN_ERROR);
212
+ const ERROR_FACTORIES = {
213
+ FS_NOT_AVAILABLE: (input) => new FsNotAvailableError(input),
214
+ NO_CONFIGURATION_PROVIDED: (input) => new NoConfigurationProvidedError(input),
215
+ INVALID_CONFIGURATION_PROVIDED: (input) => new InvalidConfigurationProvidedError(input),
216
+ NO_CREDENTIALS_PROVIDED: (input) => new NoCredentialsProvidedError(input),
217
+ INVALID_CREDENTIALS_PROVIDED: (input) => new InvalidCredentialsProvidedError(input),
218
+ INVALID_DYNAMIC_OPTIONS: (input) => new InvalidDynamicOptionsError(input),
219
+ REQUIREMENTS_VALIDATION_FAILED: (input) => new RequirementsValidationFailedError(input),
220
+ NETWORK_ERROR: (input) => new NetworkError(input),
221
+ COERCE_FAILED: (input) => new CoerceFailedError(input),
222
+ TEMPORAL_NOT_AVAILABLE: (input) => new TemporalNotAvailableError(input),
223
+ SDK_MODULE_NOT_FOUND: (input) => new SdkModuleNotFoundError(input),
224
+ TYPEGEN_UNSUPPORTED_SDK: (input) => new TypegenUnsupportedSdkError(input),
225
+ TYPEGEN_READ_FAILED: (input) => new TypegenReadFailedError(input),
226
+ TYPEGEN_WRITE_FAILED: (input) => new TypegenWriteFailedError(input),
227
+ UNAUTHORIZED: (input) => new UnauthorizedError(input),
228
+ INVALID_ORG_SCOPE: (input) => new InvalidOrgScopeError(input),
229
+ ORG_SCOPE_INVALID: (input) => new OrgScopeInvalidError(input),
230
+ INVALID_JSON: (input) => new InvalidJsonError(input),
231
+ INVALID_REQUEST: (input) => new InvalidRequestError(input),
232
+ VARIABLE_NOT_FOUND: (input) => new VariableNotFoundError(input),
233
+ EVALUATION_FAILED: (input) => new EvaluationFailedError(input),
234
+ USAGE_LIMIT_EXCEEDED: (input) => new UsageLimitExceededError(input),
235
+ BILLING_UNAVAILABLE: (input) => new BillingUnavailableError(input),
236
+ DEVICE_CODE_NOT_FOUND: (input) => new DeviceCodeNotFoundError(input),
237
+ DEVICE_CODE_EXPIRED: (input) => new DeviceCodeExpiredError(input),
238
+ USER_CODE_INVALID: (input) => new UserCodeInvalidError(input),
239
+ INVALID_REFRESH_TOKEN: (input) => new InvalidRefreshTokenError(input),
240
+ UNKNOWN_ERROR: (input) => new UnknownError(input),
241
+ };
242
+ export function isBarekeyErrorCode(value) {
243
+ return Object.hasOwn(ERROR_DESCRIPTORS, value);
244
+ }
245
+ export function normalizeErrorCode(value) {
246
+ const normalized = value.trim().toUpperCase();
247
+ return isBarekeyErrorCode(normalized) ? normalized : "UNKNOWN_ERROR";
248
+ }
249
+ export function createBarekeyErrorFromCode(input) {
250
+ const code = normalizeErrorCode(input.code);
251
+ return ERROR_FACTORIES[code]({
252
+ message: input.message,
253
+ requestId: input.requestId,
254
+ status: input.status,
255
+ cause: input.cause,
256
+ });
257
+ }
258
+ export function parseFloatOrThrow(value) {
259
+ const normalized = value.trim();
260
+ if (normalized.length === 0) {
261
+ throw new CoerceFailedError({
262
+ message: `Barekey could not coerce "${value}" to a float.`,
263
+ });
264
+ }
265
+ const parsed = Number(normalized);
266
+ if (!Number.isFinite(parsed)) {
267
+ throw new CoerceFailedError({
268
+ message: `Barekey could not coerce "${value}" to a float.`,
269
+ });
270
+ }
271
+ return parsed;
272
+ }
273
+ export function parseBigIntOrThrow(value) {
274
+ const normalized = value.trim();
275
+ if (normalized.length === 0 || !/^-?(0|[1-9]\d*)$/.test(normalized)) {
276
+ throw new CoerceFailedError({
277
+ message: `Barekey could not coerce "${value}" to an int64.`,
278
+ });
279
+ }
280
+ let parsed;
281
+ try {
282
+ parsed = BigInt(normalized);
283
+ }
284
+ catch (error) {
285
+ throw new CoerceFailedError({
286
+ message: `Barekey could not coerce "${value}" to an int64.`,
287
+ cause: error,
288
+ });
289
+ }
290
+ if (parsed < INT64_MIN || parsed > INT64_MAX) {
291
+ throw new CoerceFailedError({
292
+ message: `Barekey could not coerce "${value}" to an int64.`,
293
+ });
294
+ }
295
+ return parsed;
296
+ }
297
+ export function parseBooleanOrThrow(value) {
298
+ const normalized = value.trim().toLowerCase();
299
+ if (normalized === "true" || normalized === "1" || normalized === "yes") {
300
+ return true;
301
+ }
302
+ if (normalized === "false" || normalized === "0" || normalized === "no") {
303
+ return false;
304
+ }
305
+ throw new CoerceFailedError({
306
+ message: `Barekey could not coerce "${value}" to a boolean.`,
307
+ });
308
+ }
309
+ export function parseJsonOrThrow(value) {
310
+ try {
311
+ return JSON.parse(value);
312
+ }
313
+ catch (error) {
314
+ throw new CoerceFailedError({
315
+ message: "Barekey could not coerce the resolved value to JSON.",
316
+ cause: error,
317
+ });
318
+ }
319
+ }
320
+ export function parseDateOrThrow(value) {
321
+ const parsed = new Date(value);
322
+ if (Number.isNaN(parsed.getTime())) {
323
+ throw new CoerceFailedError({
324
+ message: `Barekey could not coerce "${value}" to a Date.`,
325
+ });
326
+ }
327
+ return parsed;
328
+ }
329
+ export function parseTemporalInstantOrThrow(value) {
330
+ const temporalNamespace = globalThis.Temporal;
331
+ if (!temporalNamespace?.Instant) {
332
+ throw new TemporalNotAvailableError();
333
+ }
334
+ try {
335
+ return temporalNamespace.Instant.from(value);
336
+ }
337
+ catch (error) {
338
+ throw new CoerceFailedError({
339
+ message: `Barekey could not coerce "${value}" to a Temporal.Instant.`,
340
+ cause: error,
341
+ });
342
+ }
343
+ }
@@ -0,0 +1,20 @@
1
+ import type { BarekeyCoerceTarget, BarekeyEvaluatedValue } from "./types.js";
2
+ type BarekeyCoercibleEnvMarker = {
3
+ readonly __barekey?: {
4
+ readonly mode: "ab";
5
+ };
6
+ };
7
+ export declare class BarekeyEnvHandle<TValue = unknown> implements PromiseLike<TValue> {
8
+ private readonly resolveEvaluatedValue;
9
+ private readonly transform;
10
+ private evaluatedValuePromise;
11
+ constructor(resolveEvaluatedValue: () => Promise<BarekeyEvaluatedValue>, transform?: (resolved: BarekeyEvaluatedValue) => Promise<TValue>);
12
+ private resolveValue;
13
+ private getEvaluatedValue;
14
+ coerce<TCoerced = unknown>(this: [TValue] extends [BarekeyCoercibleEnvMarker] ? BarekeyEnvHandle<TValue> : never, target: BarekeyCoerceTarget): BarekeyEnvHandle<TCoerced>;
15
+ then<TResult1 = TValue, TResult2 = never>(onfulfilled?: ((value: TValue) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
16
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<TValue | TResult>;
17
+ finally(onfinally?: (() => void) | null): Promise<TValue>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE7E,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,qBAAa,gBAAgB,CAAC,MAAM,GAAG,OAAO,CAAE,YAAW,WAAW,CAAC,MAAM,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuC;IAC7E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuD;IACjF,OAAO,CAAC,qBAAqB,CAA+C;gBAG1E,qBAAqB,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAC3D,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC;YAQpD,YAAY;YAIZ,iBAAiB;IAO/B,MAAM,CAAC,QAAQ,GAAG,OAAO,EACvB,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,KAAK,EACrF,MAAM,EAAE,mBAAmB,GAC1B,gBAAgB,CAAC,QAAQ,CAAC;IAS7B,IAAI,CAAC,QAAQ,GAAG,MAAM,EAAE,QAAQ,GAAG,KAAK,EACtC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAC1E,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAC1E,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAI/B,KAAK,CAAC,OAAO,GAAG,KAAK,EACnB,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GACxE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC;IAI5B,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAG1D"}
package/dist/handle.js ADDED
@@ -0,0 +1,35 @@
1
+ import { coerceEvaluatedValue, parseDeclaredValue, } from "./internal/evaluate.js";
2
+ export class BarekeyEnvHandle {
3
+ resolveEvaluatedValue;
4
+ transform;
5
+ evaluatedValuePromise = null;
6
+ constructor(resolveEvaluatedValue, transform) {
7
+ this.resolveEvaluatedValue = resolveEvaluatedValue;
8
+ this.transform =
9
+ transform ??
10
+ (async (resolved) => parseDeclaredValue(resolved.value, resolved.declaredType));
11
+ }
12
+ async resolveValue() {
13
+ return await this.transform(await this.getEvaluatedValue());
14
+ }
15
+ async getEvaluatedValue() {
16
+ if (this.evaluatedValuePromise === null) {
17
+ this.evaluatedValuePromise = this.resolveEvaluatedValue();
18
+ }
19
+ return await this.evaluatedValuePromise;
20
+ }
21
+ coerce(target) {
22
+ return new BarekeyEnvHandle(async () => await this.getEvaluatedValue(), async (resolved) => {
23
+ return coerceEvaluatedValue(resolved, target);
24
+ });
25
+ }
26
+ then(onfulfilled, onrejected) {
27
+ return this.resolveValue().then(onfulfilled ?? undefined, onrejected ?? undefined);
28
+ }
29
+ catch(onrejected) {
30
+ return this.resolveValue().catch(onrejected ?? undefined);
31
+ }
32
+ finally(onfinally) {
33
+ return this.resolveValue().finally(onfinally ?? undefined);
34
+ }
35
+ }
@@ -0,0 +1,5 @@
1
+ export { BarekeyClient } from "./client.js";
2
+ export { BarekeyEnvHandle } from "./handle.js";
3
+ export { BarekeyError, BillingUnavailableError, CoerceFailedError, DeviceCodeExpiredError, DeviceCodeNotFoundError, EvaluationFailedError, FsNotAvailableError, InvalidConfigurationProvidedError, InvalidCredentialsProvidedError, InvalidDynamicOptionsError, InvalidJsonError, InvalidOrgScopeError, InvalidRefreshTokenError, InvalidRequestError, NetworkError, NoConfigurationProvidedError, NoCredentialsProvidedError, OrgScopeInvalidError, RequirementsValidationFailedError, SdkModuleNotFoundError, TemporalNotAvailableError, TypegenReadFailedError, TypegenUnsupportedSdkError, TypegenWriteFailedError, UnauthorizedError, UnknownError, UsageLimitExceededError, UserCodeInvalidError, VariableNotFoundError, createBarekeyErrorFromCode, docsUrlForErrorCode, formatBarekeyErrorMessage, isBarekeyErrorCode, normalizeErrorCode, } from "./errors.js";
4
+ export type { AB, BarekeyClientOptions, BarekeyCoerceTarget, BarekeyDeclaredType, BarekeyErrorCode, BarekeyGeneratedTypeMap, BarekeyGetOptions, BarekeyJsonConfig, BarekeyKnownKey, BarekeyResolvedKind, BarekeyRolloutMilestone, BarekeyStandardSchemaV1, BarekeyTemporalInstant, BarekeyTemporalInstantLike, BarekeyTtlInput, BarekeyTypegenResult, Env, Linear, Secret, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,iCAAiC,EACjC,+BAA+B,EAC/B,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,EACpB,iCAAiC,EACjC,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,EAAE,EACF,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,eAAe,EACf,oBAAoB,EACpB,GAAG,EACH,MAAM,EACN,MAAM,GACP,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { BarekeyClient } from "./client.js";
2
+ export { BarekeyEnvHandle } from "./handle.js";
3
+ export { BarekeyError, BillingUnavailableError, CoerceFailedError, DeviceCodeExpiredError, DeviceCodeNotFoundError, EvaluationFailedError, FsNotAvailableError, InvalidConfigurationProvidedError, InvalidCredentialsProvidedError, InvalidDynamicOptionsError, InvalidJsonError, InvalidOrgScopeError, InvalidRefreshTokenError, InvalidRequestError, NetworkError, NoConfigurationProvidedError, NoCredentialsProvidedError, OrgScopeInvalidError, RequirementsValidationFailedError, SdkModuleNotFoundError, TemporalNotAvailableError, TypegenReadFailedError, TypegenUnsupportedSdkError, TypegenWriteFailedError, UnauthorizedError, UnknownError, UsageLimitExceededError, UserCodeInvalidError, VariableNotFoundError, createBarekeyErrorFromCode, docsUrlForErrorCode, formatBarekeyErrorMessage, isBarekeyErrorCode, normalizeErrorCode, } from "./errors.js";
@@ -0,0 +1,13 @@
1
+ type MemoryCacheRecord<TValue> = {
2
+ value: TValue;
3
+ storedAtMs: number;
4
+ expiresAtMs: number | null;
5
+ };
6
+ export declare class MemoryCache<TValue> {
7
+ private readonly records;
8
+ getRecord(key: string): MemoryCacheRecord<TValue> | null;
9
+ get(key: string): TValue | null;
10
+ set(key: string, value: TValue, expiresAtMs?: number | null): void;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/internal/cache.ts"],"names":[],"mappings":"AAAA,KAAK,iBAAiB,CAAC,MAAM,IAAI;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,qBAAa,WAAW,CAAC,MAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI;IAYxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;CAOzE"}
@@ -0,0 +1,24 @@
1
+ export class MemoryCache {
2
+ records = new Map();
3
+ getRecord(key) {
4
+ const record = this.records.get(key) ?? null;
5
+ if (record === null) {
6
+ return null;
7
+ }
8
+ if (record.expiresAtMs !== null && record.expiresAtMs <= Date.now()) {
9
+ this.records.delete(key);
10
+ return null;
11
+ }
12
+ return record;
13
+ }
14
+ get(key) {
15
+ return this.getRecord(key)?.value ?? null;
16
+ }
17
+ set(key, value, expiresAtMs = null) {
18
+ this.records.set(key, {
19
+ value,
20
+ storedAtMs: Date.now(),
21
+ expiresAtMs,
22
+ });
23
+ }
24
+ }
@@ -0,0 +1,7 @@
1
+ import type { BarekeyCoerceTarget, BarekeyDeclaredType, BarekeyDecision, BarekeyEvaluatedValue, BarekeyGetOptions, BarekeyVariableDefinition } from "../types.js";
2
+ export declare function validateDynamicOptions(options?: BarekeyGetOptions): void;
3
+ export declare function evaluateDefinition(definition: BarekeyVariableDefinition, options?: Pick<BarekeyGetOptions, "seed" | "key">): Promise<BarekeyEvaluatedValue>;
4
+ export declare function inferSelectedArmFromDecision(decision?: BarekeyDecision): "A" | "B" | undefined;
5
+ export declare function parseDeclaredValue(value: string, declaredType: BarekeyDeclaredType): unknown;
6
+ export declare function coerceEvaluatedValue(resolved: BarekeyEvaluatedValue, target: BarekeyCoerceTarget): unknown;
7
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/internal/evaluate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EAEjB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAgDrB,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAKxE;AA4CD,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,yBAAyB,EACrC,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,CAAC,GAChD,OAAO,CAAC,qBAAqB,CAAC,CAsDhC;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS,CAQ9F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAiB5F;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CA0BT"}
@@ -0,0 +1,176 @@
1
+ import { CoerceFailedError, parseBigIntOrThrow, parseBooleanOrThrow, parseDateOrThrow, parseFloatOrThrow, parseJsonOrThrow, } from "../errors.js";
2
+ import { resolveTtlMilliseconds } from "./ttl.js";
3
+ function parseRolloutInstant(value) {
4
+ const parsed = Date.parse(value);
5
+ if (!Number.isFinite(parsed)) {
6
+ throw new CoerceFailedError({
7
+ message: `Invalid Barekey rollout milestone instant "${value}".`,
8
+ });
9
+ }
10
+ return parsed;
11
+ }
12
+ function normalizeRolloutMilestones(value) {
13
+ if (value.length === 0) {
14
+ throw new CoerceFailedError({
15
+ message: "Rollout milestones must contain at least one entry.",
16
+ });
17
+ }
18
+ let previousAtMs = -Infinity;
19
+ return value.map((milestone) => {
20
+ if (!Number.isFinite(milestone.percentage) ||
21
+ milestone.percentage < 0 ||
22
+ milestone.percentage > 100) {
23
+ throw new CoerceFailedError({
24
+ message: "Rollout milestone percentages must be between 0 and 100.",
25
+ });
26
+ }
27
+ const atMs = parseRolloutInstant(milestone.at);
28
+ if (atMs <= previousAtMs) {
29
+ throw new CoerceFailedError({
30
+ message: "Rollout milestones must be strictly increasing by time.",
31
+ });
32
+ }
33
+ previousAtMs = atMs;
34
+ return {
35
+ at: new Date(atMs).toISOString(),
36
+ percentage: milestone.percentage,
37
+ };
38
+ });
39
+ }
40
+ export function validateDynamicOptions(options) {
41
+ if (options?.dynamic === undefined || options.dynamic === true) {
42
+ return;
43
+ }
44
+ resolveTtlMilliseconds(options.dynamic.ttl, "dynamic.ttl");
45
+ }
46
+ async function deterministicBucket(input) {
47
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input));
48
+ const bytes = new Uint8Array(digest);
49
+ const value = ((bytes[0] ?? 0) << 24) | ((bytes[1] ?? 0) << 16) | ((bytes[2] ?? 0) << 8) | (bytes[3] ?? 0);
50
+ return (value >>> 0) / 4294967296;
51
+ }
52
+ function resolveLinearRolloutChance(input) {
53
+ const milestones = normalizeRolloutMilestones(input.milestones);
54
+ const first = milestones[0];
55
+ if (first === undefined) {
56
+ return 0;
57
+ }
58
+ if (input.nowMs < parseRolloutInstant(first.at)) {
59
+ return 0;
60
+ }
61
+ for (let index = 0; index < milestones.length - 1; index += 1) {
62
+ const current = milestones[index];
63
+ const next = milestones[index + 1];
64
+ if (current === undefined || next === undefined) {
65
+ continue;
66
+ }
67
+ const currentAtMs = parseRolloutInstant(current.at);
68
+ const nextAtMs = parseRolloutInstant(next.at);
69
+ if (input.nowMs >= currentAtMs && input.nowMs < nextAtMs) {
70
+ const progress = (input.nowMs - currentAtMs) / (nextAtMs - currentAtMs);
71
+ const percentage = current.percentage + (next.percentage - current.percentage) * progress;
72
+ return percentage / 100;
73
+ }
74
+ }
75
+ const last = milestones[milestones.length - 1];
76
+ return last === undefined ? 0 : last.percentage / 100;
77
+ }
78
+ export async function evaluateDefinition(definition, options) {
79
+ if (definition.kind === "secret") {
80
+ return {
81
+ name: definition.name,
82
+ kind: definition.kind,
83
+ declaredType: definition.declaredType,
84
+ value: definition.value,
85
+ };
86
+ }
87
+ const seed = options?.seed?.trim() ?? "";
88
+ const key = options?.key?.trim() ?? "";
89
+ const bucket = seed.length > 0 || key.length > 0
90
+ ? await deterministicBucket(`${definition.kind}:${definition.name}:${seed}:${key}`)
91
+ : Math.random();
92
+ if (definition.kind === "ab_roll") {
93
+ const selectedArm = bucket < definition.chance ? "A" : "B";
94
+ return {
95
+ name: definition.name,
96
+ kind: definition.kind,
97
+ declaredType: definition.declaredType,
98
+ value: selectedArm === "A" ? definition.valueA : definition.valueB,
99
+ selectedArm,
100
+ decision: {
101
+ bucket,
102
+ chance: definition.chance,
103
+ seed: seed.length > 0 ? seed : undefined,
104
+ key: key.length > 0 ? key : undefined,
105
+ matchedRule: "ab_roll",
106
+ },
107
+ };
108
+ }
109
+ const chance = resolveLinearRolloutChance({
110
+ milestones: definition.rolloutMilestones,
111
+ nowMs: Date.now(),
112
+ });
113
+ const selectedArm = bucket < chance ? "B" : "A";
114
+ return {
115
+ name: definition.name,
116
+ kind: definition.kind,
117
+ declaredType: definition.declaredType,
118
+ value: selectedArm === "A" ? definition.valueA : definition.valueB,
119
+ selectedArm,
120
+ decision: {
121
+ bucket,
122
+ chance,
123
+ seed: seed.length > 0 ? seed : undefined,
124
+ key: key.length > 0 ? key : undefined,
125
+ matchedRule: "linear_rollout",
126
+ },
127
+ };
128
+ }
129
+ export function inferSelectedArmFromDecision(decision) {
130
+ if (decision === undefined) {
131
+ return undefined;
132
+ }
133
+ if (decision.matchedRule === "ab_roll") {
134
+ return decision.bucket < decision.chance ? "A" : "B";
135
+ }
136
+ return decision.bucket < decision.chance ? "B" : "A";
137
+ }
138
+ export function parseDeclaredValue(value, declaredType) {
139
+ if (declaredType === "string") {
140
+ return value;
141
+ }
142
+ if (declaredType === "boolean") {
143
+ return parseBooleanOrThrow(value);
144
+ }
145
+ if (declaredType === "int64") {
146
+ return parseBigIntOrThrow(value);
147
+ }
148
+ if (declaredType === "float") {
149
+ return parseFloatOrThrow(value);
150
+ }
151
+ if (declaredType === "date") {
152
+ return parseDateOrThrow(value);
153
+ }
154
+ return parseJsonOrThrow(value);
155
+ }
156
+ export function coerceEvaluatedValue(resolved, target) {
157
+ if (target === "string") {
158
+ return resolved.value;
159
+ }
160
+ if (target === "boolean" && resolved.selectedArm !== undefined) {
161
+ return resolved.selectedArm === "B";
162
+ }
163
+ if (target === "boolean") {
164
+ return parseBooleanOrThrow(resolved.value);
165
+ }
166
+ if (target === "int64") {
167
+ return parseBigIntOrThrow(resolved.value);
168
+ }
169
+ if (target === "float") {
170
+ return parseFloatOrThrow(resolved.value);
171
+ }
172
+ if (target === "date") {
173
+ return parseDateOrThrow(resolved.value);
174
+ }
175
+ return parseJsonOrThrow(resolved.value);
176
+ }
@@ -0,0 +1,19 @@
1
+ export type InternalAuthResolver = {
2
+ getAccessToken(): Promise<string>;
3
+ onUnauthorized?(): Promise<void>;
4
+ };
5
+ export declare function normalizeBaseUrl(baseUrl: string): string;
6
+ export declare function postJson<TResponse>(input: {
7
+ fetchFn: typeof globalThis.fetch;
8
+ baseUrl: string;
9
+ path: string;
10
+ payload: unknown;
11
+ auth?: InternalAuthResolver;
12
+ }): Promise<TResponse>;
13
+ export declare function getJson<TResponse>(input: {
14
+ fetchFn: typeof globalThis.fetch;
15
+ baseUrl: string;
16
+ path: string;
17
+ auth?: InternalAuthResolver;
18
+ }): Promise<TResponse>;
19
+ //# sourceMappingURL=http.d.ts.map