@zdevzone/keyforge-client 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/dist/client.js ADDED
@@ -0,0 +1,563 @@
1
+ import { z } from "zod";
2
+ import { encodeBase64url, TokenError, verifySignedToken } from "./tokens.js";
3
+ import { DEVICE_SIGNAL_KINDS } from "./types.js";
4
+ export class KeyForgeError extends Error {
5
+ code;
6
+ status;
7
+ retryable;
8
+ constructor(code, status = 0, retryable = false) {
9
+ super(`KeyForge request failed (${code}).`);
10
+ this.code = code;
11
+ this.status = status;
12
+ this.retryable = retryable;
13
+ this.name = "KeyForgeError";
14
+ }
15
+ }
16
+ /** Ephemeral test/example storage. Not a production persistence implementation. */
17
+ export class MemoryStorage {
18
+ state = null;
19
+ async load() {
20
+ return structuredClone(this.state);
21
+ }
22
+ async save(state) {
23
+ this.state = structuredClone(state);
24
+ }
25
+ }
26
+ const metadataSchema = z
27
+ .object({
28
+ appVersion: z.string().max(50).optional(),
29
+ platform: z.string().max(100).optional(),
30
+ userName: z.string().max(200).optional(),
31
+ userEmail: z.string().max(200).optional(),
32
+ machineSignals: z
33
+ .array(z
34
+ .object({
35
+ kind: z.enum(DEVICE_SIGNAL_KINDS),
36
+ hash: z.string().regex(/^[a-f0-9]{64}$/),
37
+ })
38
+ .strict())
39
+ .max(3)
40
+ .optional(),
41
+ })
42
+ .strict();
43
+ const stateSchema = z
44
+ .object({
45
+ version: z.literal(1),
46
+ serverUrl: z.string(),
47
+ productId: z.string(),
48
+ subjectKind: z.enum(["installation", "service"]),
49
+ installationId: z.string().uuid(),
50
+ credential: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
51
+ registration: metadataSchema.extend({
52
+ installationId: z.string().uuid(),
53
+ requestId: z.string().uuid(),
54
+ }),
55
+ registered: z.boolean(),
56
+ trialStarted: z.boolean(),
57
+ trialConsumed: z.number().int().nonnegative().safe(),
58
+ trialToken: z.string().nullable(),
59
+ licenseToken: z.string().nullable(),
60
+ denial: z.string().nullable(),
61
+ lastObservedTime: z.number().finite().nonnegative(),
62
+ deviceSignals: z
63
+ .object({
64
+ signals: metadataSchema.shape.machineSignals.unwrap(),
65
+ diagnostics: z
66
+ .array(z
67
+ .object({
68
+ kind: z.enum(DEVICE_SIGNAL_KINDS),
69
+ status: z.enum([
70
+ "available",
71
+ "unavailable",
72
+ "invalid",
73
+ "timeout",
74
+ "permission_denied",
75
+ "unsupported",
76
+ "query_failed",
77
+ ]),
78
+ })
79
+ .strict())
80
+ .max(3),
81
+ })
82
+ .strict()
83
+ .optional(),
84
+ })
85
+ .strict();
86
+ export class KeyForgeClient {
87
+ options;
88
+ url;
89
+ queue = Promise.resolve();
90
+ constructor(options) {
91
+ if (!options.storage ||
92
+ !options.publicKeys ||
93
+ !/^[a-z][a-z0-9-]{0,59}$/.test(options.productId))
94
+ throw new KeyForgeError("invalid_configuration");
95
+ let u;
96
+ try {
97
+ u = new URL(options.serverUrl);
98
+ }
99
+ catch {
100
+ throw new KeyForgeError("invalid_server_url");
101
+ }
102
+ if (u.username ||
103
+ u.password ||
104
+ u.search ||
105
+ u.hash ||
106
+ (u.protocol !== "https:" &&
107
+ !(u.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(u.hostname))))
108
+ throw new KeyForgeError("invalid_server_url");
109
+ this.url = u.toString().replace(/\/$/, "");
110
+ this.options = {
111
+ ...options,
112
+ publicKeys: { ...options.publicKeys },
113
+ registration: metadataSchema.parse(options.registration ?? {}),
114
+ };
115
+ if (!Number.isInteger(options.maxAttempts ?? 3) ||
116
+ (options.maxAttempts ?? 3) < 1 ||
117
+ (options.maxAttempts ?? 3) > 5 ||
118
+ !Number.isFinite(options.timeoutMs ?? 10000) ||
119
+ (options.timeoutMs ?? 10000) <= 0 ||
120
+ !Number.isFinite(options.clockToleranceMs ?? 300000) ||
121
+ (options.clockToleranceMs ?? 300000) < 0)
122
+ throw new KeyForgeError("invalid_configuration");
123
+ }
124
+ now() {
125
+ const time = (this.options.now ?? Date.now)();
126
+ if (!Number.isFinite(time) || time < 0)
127
+ throw new KeyForgeError("invalid_clock");
128
+ return time;
129
+ }
130
+ serial(work) {
131
+ const next = this.queue.then(work);
132
+ this.queue = next.catch(() => { });
133
+ return next;
134
+ }
135
+ async load() {
136
+ const stored = await this.options.storage.load();
137
+ if (stored !== null) {
138
+ const parsed = stateSchema.safeParse(stored);
139
+ if (!parsed.success)
140
+ throw new KeyForgeError("invalid_stored_state");
141
+ const state = parsed.data;
142
+ if (state.serverUrl !== this.url ||
143
+ state.productId !== this.options.productId ||
144
+ state.subjectKind !== (this.options.subjectKind ?? "installation") ||
145
+ state.registration.installationId !== state.installationId)
146
+ throw new KeyForgeError("storage_context_mismatch");
147
+ return state;
148
+ }
149
+ const installationId = crypto.randomUUID();
150
+ const deviceSignals = this.options.deviceSignalsProvider
151
+ ? await this.collectDeviceSignals()
152
+ : undefined;
153
+ const state = {
154
+ version: 1,
155
+ serverUrl: this.url,
156
+ productId: this.options.productId,
157
+ subjectKind: this.options.subjectKind ?? "installation",
158
+ installationId,
159
+ credential: encodeBase64url(crypto.getRandomValues(new Uint8Array(32))),
160
+ registration: {
161
+ ...this.options.registration,
162
+ ...(deviceSignals && !this.options.registration?.machineSignals
163
+ ? { machineSignals: deviceSignals.signals }
164
+ : {}),
165
+ installationId,
166
+ requestId: crypto.randomUUID(),
167
+ },
168
+ registered: false,
169
+ trialStarted: false,
170
+ trialConsumed: 0,
171
+ trialToken: null,
172
+ licenseToken: null,
173
+ denial: null,
174
+ lastObservedTime: this.now(),
175
+ ...(deviceSignals ? { deviceSignals } : {}),
176
+ };
177
+ // Identity and exact registration body must be durable before the first network request.
178
+ await this.options.storage.save(state);
179
+ return state;
180
+ }
181
+ async collectDeviceSignals() {
182
+ try {
183
+ const result = await this.options.deviceSignalsProvider({
184
+ serverUrl: this.url,
185
+ productId: this.options.productId,
186
+ });
187
+ return stateSchema.shape.deviceSignals.unwrap().parse(result);
188
+ }
189
+ catch {
190
+ // Never propagate system query output or provider exceptions (which may contain identifiers).
191
+ return {
192
+ signals: [],
193
+ diagnostics: ["machine-guid", "smbios-uuid", "volume-serial"].map((kind) => ({
194
+ kind: kind,
195
+ status: "query_failed",
196
+ })),
197
+ };
198
+ }
199
+ }
200
+ /** Recollect recognition hints for this authenticated installation; never re-registers it. */
201
+ async updateDeviceSignals() {
202
+ return this.serial(async () => {
203
+ if (!this.options.deviceSignalsProvider)
204
+ throw new KeyForgeError("device_signals_provider_required");
205
+ const state = await this.load();
206
+ if (!state.registered)
207
+ throw new KeyForgeError("registration_required");
208
+ const report = await this.collectDeviceSignals();
209
+ await this.request(state, "PUT", this.installationPath(state, "/device-signals"), {
210
+ machineSignals: report.signals,
211
+ });
212
+ state.deviceSignals = report;
213
+ await this.options.storage.save(state);
214
+ return structuredClone(report);
215
+ });
216
+ }
217
+ async getDeviceSignalsDiagnostics() {
218
+ return this.serial(async () => structuredClone((await this.load()).deviceSignals?.diagnostics ?? []));
219
+ }
220
+ context(state) {
221
+ return {
222
+ productId: state.productId,
223
+ installationId: state.installationId,
224
+ subjectKind: state.subjectKind,
225
+ publicKeys: this.options.publicKeys,
226
+ now: this.now(),
227
+ clockToleranceMs: this.options.clockToleranceMs,
228
+ };
229
+ }
230
+ productPath(suffix) {
231
+ return `/v1/products/${encodeURIComponent(this.options.productId)}${suffix}`;
232
+ }
233
+ installationPath(state, suffix) {
234
+ return this.productPath(`/installations/${encodeURIComponent(state.installationId)}${suffix}`);
235
+ }
236
+ async request(state, method, path, body, extraHeaders) {
237
+ const attempts = this.options.maxAttempts ?? 3;
238
+ const serialized = body === undefined ? undefined : JSON.stringify(body);
239
+ for (let attempt = 0; attempt < attempts; attempt++) {
240
+ const controller = new AbortController();
241
+ const timer = setTimeout(() => controller.abort(), this.options.timeoutMs ?? 10000);
242
+ let failure;
243
+ let retryAfter = 0;
244
+ try {
245
+ const response = await (this.options.fetch ?? globalThis.fetch)(this.url + path, {
246
+ method,
247
+ headers: {
248
+ authorization: "Bearer " + state.credential,
249
+ ...(serialized === undefined ? {} : { "content-type": "application/json" }),
250
+ ...extraHeaders,
251
+ },
252
+ body: serialized,
253
+ signal: controller.signal,
254
+ redirect: "error",
255
+ credentials: "omit",
256
+ cache: "no-store",
257
+ });
258
+ let value;
259
+ try {
260
+ value = await response.json();
261
+ }
262
+ catch {
263
+ if (response.ok)
264
+ throw new KeyForgeError("invalid_response", response.status);
265
+ }
266
+ if (response.ok)
267
+ return value;
268
+ const error = value && typeof value === "object" ? value : {};
269
+ const code = typeof error.error === "string" && /^[a-z_]{1,100}$/.test(error.error)
270
+ ? error.error
271
+ : "http_error";
272
+ failure = new KeyForgeError(code, response.status, [429, 502, 503, 504].includes(response.status));
273
+ const header = response.headers.get("retry-after");
274
+ retryAfter = header
275
+ ? /^\d+$/.test(header)
276
+ ? Number(header) * 1000
277
+ : Date.parse(header) - Date.now()
278
+ : 0;
279
+ }
280
+ catch (error) {
281
+ if (error instanceof KeyForgeError)
282
+ throw error;
283
+ failure = new KeyForgeError(controller.signal.aborted ? "request_timeout" : "network_error", 0, true);
284
+ }
285
+ finally {
286
+ clearTimeout(timer);
287
+ }
288
+ if (!failure.retryable || attempt === attempts - 1)
289
+ throw failure;
290
+ // Do not retry earlier than Retry-After; return control for long server throttles.
291
+ if (Number.isFinite(retryAfter) && retryAfter > 30000)
292
+ throw failure;
293
+ const backoff = Math.min(8000, 250 * 2 ** attempt) * (0.5 + Math.random());
294
+ await (this.options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms))))(Math.max(backoff, retryAfter || 0));
295
+ }
296
+ throw new KeyForgeError("network_error", 0, true);
297
+ }
298
+ async ensureRegistered(state) {
299
+ if (state.registered)
300
+ return;
301
+ const response = await this.request(state, "POST", this.productPath("/register"), state.registration);
302
+ if (response?.ok !== true ||
303
+ !(response.trial === null || typeof response.trial?.token === "string"))
304
+ throw new KeyForgeError("invalid_response");
305
+ if (response.trial) {
306
+ const grant = await verifySignedToken(response.trial.token, this.context(state));
307
+ if (grant.kind !== "trial")
308
+ throw new TokenError("unexpected_token_kind");
309
+ state.trialToken = response.trial.token;
310
+ this.observe(state, grant);
311
+ }
312
+ state.registered = true;
313
+ await this.options.storage.save(state);
314
+ }
315
+ observe(state, grant) {
316
+ state.lastObservedTime = Math.max(state.lastObservedTime, this.now(), grant ? Date.parse(grant.issuedAt) : 0);
317
+ }
318
+ async evaluate(state) {
319
+ const now = this.now();
320
+ if (now + (this.options.clockToleranceMs ?? 300000) < state.lastObservedTime)
321
+ return { state: "reconnect_required", reason: "clock_rollback" };
322
+ this.observe(state);
323
+ await this.options.storage.save(state);
324
+ if (state.denial)
325
+ return { state: "reconnect_required", reason: state.denial };
326
+ const token = state.licenseToken ?? (state.trialStarted ? state.trialToken : null);
327
+ if (!token)
328
+ return { state: "unlicensed", reason: "activation_required" };
329
+ let grant;
330
+ try {
331
+ grant = await verifySignedToken(token, this.context(state));
332
+ }
333
+ catch (error) {
334
+ if (!(error instanceof TokenError))
335
+ throw error;
336
+ return { state: "reconnect_required", reason: error.code };
337
+ }
338
+ const time = Math.max(now, state.lastObservedTime);
339
+ if (grant.kind === "license") {
340
+ if (grant.status === "revoked")
341
+ return { state: "revoked", reason: "license_revoked" };
342
+ if (grant.status === "expired" ||
343
+ (grant.expiresAt !== null && Date.parse(grant.expiresAt) <= time))
344
+ return { state: "expired", reason: "license_expired" };
345
+ if (Date.parse(grant.offlineGraceUntil) <= time)
346
+ return { state: "reconnect_required", reason: "offline_grace_expired" };
347
+ const deadline = new Date(Math.min(Date.parse(grant.offlineGraceUntil), grant.expiresAt ? Date.parse(grant.expiresAt) : Infinity)).toISOString();
348
+ return { state: "licensed", token: grant, entitlements: grant.entitlements, deadline };
349
+ }
350
+ if (grant.verdict !== "fresh")
351
+ return { state: "expired", reason: "trial_spent" };
352
+ if (grant.expiresAt !== null && Date.parse(grant.expiresAt) <= time)
353
+ return { state: "expired", reason: "trial_expired" };
354
+ if (grant.allowance !== null && state.trialConsumed >= grant.allowance)
355
+ return { state: "expired", reason: "trial_exhausted" };
356
+ return {
357
+ state: "trial",
358
+ token: grant,
359
+ remaining: grant.allowance === null ? null : grant.allowance - state.trialConsumed,
360
+ };
361
+ }
362
+ /** Registers online but does not select a trial or unlock features. */
363
+ register() {
364
+ return this.serial(async () => {
365
+ const state = await this.load();
366
+ await this.ensureRegistered(state);
367
+ const grant = state.trialToken
368
+ ? await verifySignedToken(state.trialToken, this.context(state))
369
+ : null;
370
+ return {
371
+ installationId: state.installationId,
372
+ trialAvailable: grant?.kind === "trial" &&
373
+ grant.verdict === "fresh" &&
374
+ (grant.expiresAt === null ||
375
+ Date.parse(grant.expiresAt) > Math.max(this.now(), state.lastObservedTime)) &&
376
+ (grant.allowance === null || grant.allowance > state.trialConsumed),
377
+ };
378
+ });
379
+ }
380
+ startTrial() {
381
+ return this.serial(async () => {
382
+ const state = await this.load(), wasRegistered = state.registered;
383
+ await this.ensureRegistered(state);
384
+ // Explicit trial onboarding requires connectivity even if registration was completed earlier.
385
+ if (wasRegistered)
386
+ await this.request(state, "POST", this.productPath("/register"), state.registration);
387
+ state.trialStarted = true;
388
+ await this.options.storage.save(state);
389
+ return this.evaluate(state);
390
+ });
391
+ }
392
+ getAuthorization() {
393
+ return this.serial(async () => this.evaluate(await this.load()));
394
+ }
395
+ /** Saves usage independently of grants. Refresh/activation never resets this counter. */
396
+ consumeTrial(units = 1) {
397
+ return this.serial(async () => {
398
+ if (!Number.isSafeInteger(units) || units <= 0)
399
+ throw new KeyForgeError("invalid_units");
400
+ const state = await this.load(), authorization = await this.evaluate(state);
401
+ if (authorization.state !== "trial" ||
402
+ (authorization.remaining !== null && units > authorization.remaining))
403
+ throw new KeyForgeError("trial_unavailable");
404
+ if (!Number.isSafeInteger(state.trialConsumed + units))
405
+ throw new KeyForgeError("invalid_units");
406
+ state.trialConsumed += units;
407
+ await this.options.storage.save(state);
408
+ return this.evaluate(state);
409
+ });
410
+ }
411
+ validate(key) {
412
+ return this.serial(async () => {
413
+ const state = await this.load();
414
+ await this.ensureRegistered(state);
415
+ return this.request(state, "POST", this.productPath("/validate"), {
416
+ installationId: state.installationId,
417
+ key,
418
+ });
419
+ });
420
+ }
421
+ activate(key) {
422
+ return this.serial(async () => {
423
+ if (typeof key !== "string" || !key.trim())
424
+ throw new KeyForgeError("key_required");
425
+ const state = await this.load();
426
+ await this.ensureRegistered(state);
427
+ const response = await this.request(state, "POST", this.productPath("/activate"), { installationId: state.installationId, key });
428
+ await this.saveLicense(state, response?.token);
429
+ return this.evaluate(state);
430
+ });
431
+ }
432
+ async saveLicense(state, token, expectedLicenseId) {
433
+ const grant = await verifySignedToken(token, this.context(state));
434
+ if (grant.kind !== "license" || (expectedLicenseId && grant.licenseId !== expectedLicenseId))
435
+ throw new TokenError("unexpected_license");
436
+ if (state.licenseToken) {
437
+ let prior = null;
438
+ try {
439
+ prior = await verifySignedToken(state.licenseToken, this.context(state));
440
+ }
441
+ catch (error) {
442
+ if (!(error instanceof TokenError))
443
+ throw error;
444
+ }
445
+ if (prior?.kind === "license" &&
446
+ prior.licenseId === grant.licenseId &&
447
+ (Date.parse(grant.issuedAt) < Date.parse(prior.issuedAt) ||
448
+ (grant.issuedAt === prior.issuedAt &&
449
+ prior.status !== "active" &&
450
+ grant.status === "active")))
451
+ throw new TokenError("stale_grant");
452
+ }
453
+ state.licenseToken = token;
454
+ state.denial = null;
455
+ this.observe(state, grant);
456
+ // Persist authenticated negative status before returning it, including HTTP 200 revocations.
457
+ await this.options.storage.save(state);
458
+ }
459
+ refresh() {
460
+ return this.serial(async () => {
461
+ const state = await this.load();
462
+ if (!state.licenseToken)
463
+ throw new KeyForgeError("activation_required");
464
+ const grant = await verifySignedToken(state.licenseToken, this.context(state));
465
+ if (grant.kind !== "license")
466
+ throw new TokenError("unexpected_token_kind");
467
+ let response;
468
+ try {
469
+ response = await this.request(state, "POST", this.productPath("/refresh"), {
470
+ installationId: state.installationId,
471
+ licenseId: grant.licenseId,
472
+ });
473
+ }
474
+ catch (error) {
475
+ if (error instanceof KeyForgeError &&
476
+ [
477
+ "installation_unauthorized",
478
+ "not_activated_here",
479
+ "unknown_license",
480
+ "unknown_product",
481
+ "product_archived",
482
+ ].includes(error.code)) {
483
+ state.denial = error.code;
484
+ await this.options.storage.save(state);
485
+ }
486
+ throw error;
487
+ }
488
+ await this.saveLicense(state, response?.token, grant.licenseId);
489
+ return this.evaluate(state);
490
+ });
491
+ }
492
+ deactivate() {
493
+ return this.serial(async () => {
494
+ const state = await this.load();
495
+ if (!state.licenseToken)
496
+ return;
497
+ const grant = await verifySignedToken(state.licenseToken, this.context(state));
498
+ if (grant.kind !== "license")
499
+ throw new TokenError("unexpected_token_kind");
500
+ await this.request(state, "POST", this.productPath("/deactivate"), {
501
+ installationId: state.installationId,
502
+ licenseId: grant.licenseId,
503
+ });
504
+ state.licenseToken = null;
505
+ state.trialStarted = false;
506
+ state.denial = null;
507
+ await this.options.storage.save(state);
508
+ });
509
+ }
510
+ getNotifications() {
511
+ return this.serial(async () => {
512
+ const state = await this.load();
513
+ await this.ensureRegistered(state);
514
+ return this.request(state, "GET", this.installationPath(state, "/notifications"));
515
+ });
516
+ }
517
+ setNotificationPreferences(preferences) {
518
+ return this.serial(async () => {
519
+ const state = await this.load();
520
+ return this.request(state, "PUT", this.installationPath(state, "/notifications/preferences"), preferences);
521
+ });
522
+ }
523
+ markNotificationRead(eventId) {
524
+ return this.serial(async () => {
525
+ const state = await this.load();
526
+ return this.request(state, "POST", this.installationPath(state, "/notifications/read"), { eventId });
527
+ });
528
+ }
529
+ collectLicense(licenseId) {
530
+ return this.serial(async () => {
531
+ const state = await this.load();
532
+ // Construct locally rather than following an untrusted collectPath with our bearer credential.
533
+ return this.request(state, "POST", this.installationPath(state, `/licenses/${encodeURIComponent(licenseId)}/collect`));
534
+ });
535
+ }
536
+ listSupportThreads() {
537
+ return this.serial(async () => {
538
+ const state = await this.load();
539
+ return this.request(state, "GET", this.installationPath(state, "/support"));
540
+ });
541
+ }
542
+ getSupportThread(id) {
543
+ return this.serial(async () => {
544
+ const state = await this.load();
545
+ return this.request(state, "GET", this.installationPath(state, `/support/${encodeURIComponent(id)}`));
546
+ });
547
+ }
548
+ createSupportThread(input) {
549
+ return this.serial(async () => {
550
+ const state = await this.load();
551
+ return this.request(state, "POST", this.installationPath(state, "/support"), input, {
552
+ "idempotency-key": input.requestId,
553
+ });
554
+ });
555
+ }
556
+ replyToSupportThread(id, input) {
557
+ return this.serial(async () => {
558
+ const state = await this.load();
559
+ return this.request(state, "POST", this.installationPath(state, `/support/${encodeURIComponent(id)}/messages`), { requestId: input.requestId, revision: input.revision, message: input.message });
560
+ });
561
+ }
562
+ }
563
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { DeviceSignalKind, DeviceSignalsProvider } from "./types.js";
2
+ export declare const QUERY_TIMEOUT_MS = 8000;
3
+ export declare class DeviceSignalQueryError extends Error {
4
+ readonly status: "timeout" | "permission_denied" | "unavailable" | "query_failed";
5
+ constructor(status: "timeout" | "permission_denied" | "unavailable" | "query_failed");
6
+ }
7
+ export declare function queryError(error: unknown): DeviceSignalQueryError;
8
+ export declare function executeQuery(file: string, args: readonly string[], maxBuffer?: number): Promise<string>;
9
+ /** Fixed local files only; one bounded nonblocking read also works for size-zero sysfs files. */
10
+ export declare function readIdentifier(file: string): Promise<string>;
11
+ /** UUIDs use lowercase unbraced hyphenated hex; volume serials use eight lowercase hex digits. */
12
+ export declare function normalizeDeviceIdentifier(kind: DeviceSignalKind, input: string): string | null;
13
+ /** v1: SHA-256 of UTF-8 JSON [domain, version, canonical deployment URL, product, kind, identifier]. */
14
+ export declare function hashDeviceIdentifier(context: {
15
+ serverUrl: string;
16
+ productId: string;
17
+ }, kind: DeviceSignalKind, normalized: string): string;
18
+ export declare function boundedQuery(query: (kind: DeviceSignalKind) => Promise<string>, kind: DeviceSignalKind): Promise<string>;
19
+ export declare function createSignalProvider(platform: string, kinds: readonly DeviceSignalKind[], options: {
20
+ platform?: string;
21
+ query?: (kind: DeviceSignalKind) => Promise<string>;
22
+ }, nativeQuery: (kind: DeviceSignalKind) => Promise<string>): DeviceSignalsProvider;