@push.rocks/smartsecret 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,424 @@
1
+ import * as plugins from './smartsecret.plugins.js';
2
+ import { SmartSecretKernelStoreError, createSmartSecretKernelStoreError, } from './smartsecret.kernel.error.js';
3
+ export const smartSecretKernelDefaultTimeoutMs = 5_000;
4
+ export const smartSecretKernelMaximumTimeoutMs = 60_000;
5
+ export const smartSecretKernelMaximumEntryBytes = 1_024;
6
+ export const smartSecretKernelMaximumLegacyBytes = 16 * 1_024;
7
+ export const smartSecretKernelMaximumMessageBytes = 32 * 1_024;
8
+ export const smartSecretKernelLegacyService = 'global.idp.devidp';
9
+ const serviceDomain = Buffer.from('@push.rocks/smartsecret/kernel-service/v1\u0000', 'utf8');
10
+ const entryDomain = Buffer.from('@push.rocks/smartsecret/kernel-entry/v1\u0000', 'utf8');
11
+ const mutexDomain = Buffer.from('@push.rocks/smartsecret/kernel-mutex/v1\u0000', 'utf8');
12
+ const canonicalDigestPattern = /^[A-Za-z0-9_-]{43}$/;
13
+ const legacyAccountPattern = /^v1:[a-f0-9]{64}$/;
14
+ const domainErrorCodes = new Set([
15
+ 'ENTRY_CORRUPT',
16
+ 'INVALID_REQUEST',
17
+ 'KERNEL_UNAVAILABLE',
18
+ 'MUTATION_OUTCOME_UNKNOWN',
19
+ 'ROOT_CONFLICT',
20
+ 'SOURCE_CHANGED',
21
+ ]);
22
+ const isSmartSecretKernelDomainErrorCode = (valueArg) => domainErrorCodes.has(valueArg);
23
+ const requireExactObject = (valueArg, keysArg, inputArg) => {
24
+ const fail = () => {
25
+ throw createSmartSecretKernelStoreError(inputArg ? 'INVALID_ARGUMENT' : 'WORKER_INTEGRITY_FAILED');
26
+ };
27
+ try {
28
+ if (valueArg === null || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
29
+ return fail();
30
+ }
31
+ const prototype = Object.getPrototypeOf(valueArg);
32
+ if (prototype !== Object.prototype && prototype !== null) {
33
+ return fail();
34
+ }
35
+ const ownKeys = Reflect.ownKeys(valueArg);
36
+ if (ownKeys.length !== keysArg.length
37
+ || ownKeys.some((keyArg) => typeof keyArg !== 'string' || !keysArg.includes(keyArg))
38
+ || keysArg.some((keyArg) => !ownKeys.includes(keyArg))) {
39
+ return fail();
40
+ }
41
+ const result = Object.create(null);
42
+ for (const key of keysArg) {
43
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
44
+ if (!descriptor?.enumerable || !('value' in descriptor)) {
45
+ return fail();
46
+ }
47
+ result[key] = descriptor.value;
48
+ }
49
+ return result;
50
+ }
51
+ catch {
52
+ return fail();
53
+ }
54
+ };
55
+ const requireAllowedInputObject = (valueArg, allowedKeysArg) => {
56
+ const fail = () => {
57
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
58
+ };
59
+ try {
60
+ if (valueArg === null || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
61
+ return fail();
62
+ }
63
+ const prototype = Object.getPrototypeOf(valueArg);
64
+ if (prototype !== Object.prototype && prototype !== null) {
65
+ return fail();
66
+ }
67
+ const ownKeys = Reflect.ownKeys(valueArg);
68
+ if (ownKeys.some((keyArg) => typeof keyArg !== 'string' || !allowedKeysArg.includes(keyArg))) {
69
+ return fail();
70
+ }
71
+ const result = Object.create(null);
72
+ for (const key of ownKeys) {
73
+ if (typeof key !== 'string')
74
+ return fail();
75
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
76
+ if (!descriptor?.enumerable || !('value' in descriptor)) {
77
+ return fail();
78
+ }
79
+ result[key] = descriptor.value;
80
+ }
81
+ return result;
82
+ }
83
+ catch (error) {
84
+ if (error instanceof SmartSecretKernelStoreError)
85
+ throw error;
86
+ return fail();
87
+ }
88
+ };
89
+ const requireValidScalarString = (valueArg) => {
90
+ if (typeof valueArg !== 'string') {
91
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
92
+ }
93
+ for (let index = 0; index < valueArg.length; index++) {
94
+ const codeUnit = valueArg.charCodeAt(index);
95
+ if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
96
+ const next = valueArg.charCodeAt(index + 1);
97
+ if (index + 1 >= valueArg.length || next < 0xdc00 || next > 0xdfff) {
98
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
99
+ }
100
+ index++;
101
+ }
102
+ else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {
103
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
104
+ }
105
+ }
106
+ const byteLength = Buffer.byteLength(valueArg, 'utf8');
107
+ if (byteLength < 1 || byteLength > 1_024) {
108
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
109
+ }
110
+ return valueArg;
111
+ };
112
+ const lengthPrefix = (lengthArg) => {
113
+ const prefix = Buffer.alloc(4);
114
+ prefix.writeUInt32BE(lengthArg, 0);
115
+ return prefix;
116
+ };
117
+ const digestDescription = (prefixArg, partsArg) => {
118
+ const hash = plugins.crypto.createHash('sha256');
119
+ for (const part of partsArg)
120
+ hash.update(part);
121
+ return `${prefixArg}${hash.digest('base64url')}`;
122
+ };
123
+ export const normalizeSmartSecretKernelService = (valueArg) => requireValidScalarString(valueArg);
124
+ export const normalizeSmartSecretKernelStoreOptions = (valueArg) => {
125
+ const value = requireExactObject(valueArg, ['service'], true);
126
+ return { service: normalizeSmartSecretKernelService(value.service) };
127
+ };
128
+ export const normalizeSmartSecretKernelAccount = (valueArg) => requireValidScalarString(valueArg);
129
+ export const normalizeDevIdpV1LegacyAccount = (valueArg) => {
130
+ const account = requireValidScalarString(valueArg);
131
+ if (!legacyAccountPattern.test(account)) {
132
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
133
+ }
134
+ return account;
135
+ };
136
+ export const deriveSmartSecretKernelServiceDescription = (serviceArg) => {
137
+ const service = Buffer.from(normalizeSmartSecretKernelService(serviceArg), 'utf8');
138
+ return digestDescription('smartsecret-service:v1:', [
139
+ serviceDomain,
140
+ lengthPrefix(service.byteLength),
141
+ service,
142
+ ]);
143
+ };
144
+ export const deriveSmartSecretKernelEntryDescription = (serviceArg, accountArg) => {
145
+ const service = Buffer.from(normalizeSmartSecretKernelService(serviceArg), 'utf8');
146
+ const account = Buffer.from(normalizeSmartSecretKernelAccount(accountArg), 'utf8');
147
+ return digestDescription('smartsecret-entry:v1:', [
148
+ entryDomain,
149
+ lengthPrefix(service.byteLength),
150
+ service,
151
+ lengthPrefix(account.byteLength),
152
+ account,
153
+ ]);
154
+ };
155
+ export const deriveSmartSecretKernelMutexNamespace = (serviceArg) => {
156
+ const service = Buffer.from(normalizeSmartSecretKernelService(serviceArg), 'utf8');
157
+ return digestDescription('smartsecret-kernel:v1:', [
158
+ mutexDomain,
159
+ lengthPrefix(service.byteLength),
160
+ service,
161
+ ]);
162
+ };
163
+ export const deriveDevIdpV1LegacyDescription = (accountArg) => `keyring:${normalizeDevIdpV1LegacyAccount(accountArg)}@${smartSecretKernelLegacyService}`;
164
+ export const normalizeSmartSecretKernelValue = (valueArg) => {
165
+ try {
166
+ if (!(valueArg instanceof Uint8Array)
167
+ || valueArg.byteLength > smartSecretKernelMaximumEntryBytes) {
168
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
169
+ }
170
+ return new Uint8Array(valueArg);
171
+ }
172
+ catch (error) {
173
+ if (error instanceof SmartSecretKernelStoreError)
174
+ throw error;
175
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
176
+ }
177
+ };
178
+ export const encodeCanonicalBase64Url = (valueArg) => {
179
+ const value = Buffer.from(valueArg);
180
+ try {
181
+ return value.toString('base64url');
182
+ }
183
+ finally {
184
+ value.fill(0);
185
+ }
186
+ };
187
+ const decodeCanonicalBase64Url = (valueArg, maximumBytesArg, minimumBytesArg = 0) => {
188
+ const maximumEncodedLength = Math.ceil(maximumBytesArg * 4 / 3);
189
+ if (typeof valueArg !== 'string'
190
+ || valueArg.length > maximumEncodedLength
191
+ || valueArg.length % 4 === 1
192
+ || !/^[A-Za-z0-9_-]*$/.test(valueArg)) {
193
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
194
+ }
195
+ const decoded = Buffer.from(valueArg, 'base64url');
196
+ if (decoded.byteLength < minimumBytesArg
197
+ || decoded.byteLength > maximumBytesArg
198
+ || decoded.toString('base64url') !== valueArg) {
199
+ decoded.fill(0);
200
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
201
+ }
202
+ const result = new Uint8Array(decoded);
203
+ decoded.fill(0);
204
+ return result;
205
+ };
206
+ export const normalizeSmartSecretKernelOperationOptions = (valueArg) => {
207
+ if (valueArg === undefined)
208
+ return { timeoutMs: smartSecretKernelDefaultTimeoutMs };
209
+ const options = requireAllowedInputObject(valueArg, ['timeoutMs', 'signal']);
210
+ const timeoutMs = Object.hasOwn(options, 'timeoutMs')
211
+ ? options.timeoutMs
212
+ : smartSecretKernelDefaultTimeoutMs;
213
+ if (typeof timeoutMs !== 'number'
214
+ || !Number.isSafeInteger(timeoutMs)
215
+ || timeoutMs < 1
216
+ || timeoutMs > smartSecretKernelMaximumTimeoutMs) {
217
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
218
+ }
219
+ if (!Object.hasOwn(options, 'signal'))
220
+ return { timeoutMs };
221
+ let signal;
222
+ try {
223
+ if (!(options.signal instanceof AbortSignal)
224
+ || Object.getPrototypeOf(options.signal) !== AbortSignal.prototype) {
225
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
226
+ }
227
+ signal = options.signal;
228
+ void signal.aborted;
229
+ }
230
+ catch (error) {
231
+ if (error instanceof SmartSecretKernelStoreError)
232
+ throw error;
233
+ throw createSmartSecretKernelStoreError('INVALID_ARGUMENT');
234
+ }
235
+ return { timeoutMs, signal };
236
+ };
237
+ const parseDomainError = (valueArg) => {
238
+ if (valueArg.outcome !== 'domainError')
239
+ return undefined;
240
+ const result = requireExactObject(valueArg, ['outcome', 'code'], false);
241
+ if (typeof result.code !== 'string'
242
+ || !isSmartSecretKernelDomainErrorCode(result.code)) {
243
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
244
+ }
245
+ return {
246
+ outcome: 'domainError',
247
+ code: result.code,
248
+ };
249
+ };
250
+ const requireResultObject = (valueArg) => {
251
+ try {
252
+ if (valueArg === null || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
253
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
254
+ }
255
+ const prototype = Object.getPrototypeOf(valueArg);
256
+ if (prototype !== Object.prototype && prototype !== null) {
257
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
258
+ }
259
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, 'outcome');
260
+ if (!descriptor?.enumerable || !('value' in descriptor)) {
261
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
262
+ }
263
+ const result = Object.create(null);
264
+ for (const key of Reflect.ownKeys(valueArg)) {
265
+ if (typeof key !== 'string') {
266
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
267
+ }
268
+ const property = Object.getOwnPropertyDescriptor(valueArg, key);
269
+ if (!property?.enumerable || !('value' in property)) {
270
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
271
+ }
272
+ result[key] = property.value;
273
+ }
274
+ return result;
275
+ }
276
+ catch (error) {
277
+ if (error instanceof SmartSecretKernelStoreError)
278
+ throw error;
279
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
280
+ }
281
+ };
282
+ const requirePositiveSerial = (valueArg) => {
283
+ if (typeof valueArg !== 'number'
284
+ || !Number.isSafeInteger(valueArg)
285
+ || valueArg < 1
286
+ || valueArg > 2_147_483_647) {
287
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
288
+ }
289
+ return valueArg;
290
+ };
291
+ export const parseSmartSecretKernelGetResult = (valueArg) => {
292
+ const value = requireResultObject(valueArg);
293
+ const domainError = parseDomainError(value);
294
+ if (domainError)
295
+ return { kind: 'domainError', domainError };
296
+ if (value.outcome !== 'success' || typeof value.found !== 'boolean') {
297
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
298
+ }
299
+ if (!value.found) {
300
+ requireExactObject(value, ['outcome', 'found'], false);
301
+ return { kind: 'success', found: false };
302
+ }
303
+ const result = requireExactObject(value, ['outcome', 'found', 'value'], false);
304
+ return {
305
+ kind: 'success',
306
+ found: true,
307
+ value: decodeCanonicalBase64Url(result.value, smartSecretKernelMaximumEntryBytes),
308
+ };
309
+ };
310
+ export const parseSmartSecretKernelSetResult = (valueArg) => {
311
+ const value = requireResultObject(valueArg);
312
+ const domainError = parseDomainError(value);
313
+ if (domainError)
314
+ return { kind: 'domainError', domainError };
315
+ const result = requireExactObject(value, ['outcome'], false);
316
+ if (result.outcome !== 'success') {
317
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
318
+ }
319
+ return { kind: 'success' };
320
+ };
321
+ export const parseSmartSecretKernelDeleteResult = (valueArg) => {
322
+ const value = requireResultObject(valueArg);
323
+ const domainError = parseDomainError(value);
324
+ if (domainError)
325
+ return { kind: 'domainError', domainError };
326
+ const result = requireExactObject(value, ['outcome', 'deleted'], false);
327
+ if (result.outcome !== 'success' || typeof result.deleted !== 'boolean') {
328
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
329
+ }
330
+ return { kind: 'success', deleted: result.deleted };
331
+ };
332
+ export const parseSmartSecretKernelLegacyReadResult = (valueArg, accountArg) => {
333
+ const account = normalizeDevIdpV1LegacyAccount(accountArg);
334
+ const value = requireResultObject(valueArg);
335
+ const domainError = parseDomainError(value);
336
+ if (domainError)
337
+ return { kind: 'domainError', domainError };
338
+ if (value.outcome !== 'success' || typeof value.found !== 'boolean') {
339
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
340
+ }
341
+ if (!value.found) {
342
+ requireExactObject(value, ['outcome', 'found'], false);
343
+ return { kind: 'success', found: false };
344
+ }
345
+ const result = requireExactObject(value, [
346
+ 'outcome',
347
+ 'found',
348
+ 'value',
349
+ 'sourceSerial',
350
+ 'sessionRootSerial',
351
+ 'persistentRootSerial',
352
+ 'foundInSession',
353
+ 'foundInPersistent',
354
+ 'byteLength',
355
+ 'sha256',
356
+ ], false);
357
+ const decoded = decodeCanonicalBase64Url(result.value, smartSecretKernelMaximumLegacyBytes, 1);
358
+ let actualDigest;
359
+ let claimedDigest;
360
+ let didSucceed = false;
361
+ try {
362
+ if (typeof result.byteLength !== 'number'
363
+ || !Number.isSafeInteger(result.byteLength)
364
+ || result.byteLength !== decoded.byteLength
365
+ || typeof result.foundInSession !== 'boolean'
366
+ || typeof result.foundInPersistent !== 'boolean'
367
+ || (!result.foundInSession && !result.foundInPersistent)
368
+ || typeof result.sha256 !== 'string'
369
+ || !canonicalDigestPattern.test(result.sha256)) {
370
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
371
+ }
372
+ const sourceSerial = requirePositiveSerial(result.sourceSerial);
373
+ const persistentRootSerial = requirePositiveSerial(result.persistentRootSerial);
374
+ const sessionRootSerial = result.sessionRootSerial === null
375
+ ? null
376
+ : requirePositiveSerial(result.sessionRootSerial);
377
+ if (result.foundInSession && sessionRootSerial === null) {
378
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
379
+ }
380
+ actualDigest = plugins.crypto.createHash('sha256').update(decoded).digest();
381
+ claimedDigest = Buffer.from(result.sha256, 'base64url');
382
+ if (claimedDigest.byteLength !== 32
383
+ || claimedDigest.toString('base64url') !== result.sha256
384
+ || !plugins.crypto.timingSafeEqual(actualDigest, claimedDigest)) {
385
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
386
+ }
387
+ const parsed = {
388
+ kind: 'success',
389
+ found: true,
390
+ value: decoded,
391
+ receiptParams: {
392
+ account,
393
+ sourceSerial,
394
+ sessionRootSerial,
395
+ persistentRootSerial,
396
+ foundInSession: result.foundInSession,
397
+ foundInPersistent: result.foundInPersistent,
398
+ byteLength: result.byteLength,
399
+ sha256: result.sha256,
400
+ },
401
+ };
402
+ didSucceed = true;
403
+ return parsed;
404
+ }
405
+ finally {
406
+ actualDigest?.fill(0);
407
+ claimedDigest?.fill(0);
408
+ if (!didSucceed)
409
+ decoded.fill(0);
410
+ }
411
+ };
412
+ export const parseSmartSecretKernelLegacyDeleteResult = (valueArg) => {
413
+ const value = requireResultObject(valueArg);
414
+ const domainError = parseDomainError(value);
415
+ if (domainError)
416
+ return { kind: 'domainError', domainError };
417
+ const result = requireExactObject(value, ['outcome', 'status'], false);
418
+ if (result.outcome !== 'success'
419
+ || (result.status !== 'deleted' && result.status !== 'alreadyAbsent')) {
420
+ throw createSmartSecretKernelStoreError('WORKER_INTEGRITY_FAILED');
421
+ }
422
+ return { kind: 'success', status: result.status };
423
+ };
424
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzZWNyZXQua2VybmVsLnByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzZWNyZXQua2VybmVsLnByb3RvY29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixpQ0FBaUMsR0FDbEMsTUFBTSwrQkFBK0IsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxLQUFLLENBQUM7QUFDdkQsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsTUFBTSxDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEtBQUssQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsbUJBQW1CLENBQUM7QUFFbEUsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDL0IsaURBQWlELEVBQ2pELE1BQU0sQ0FDUCxDQUFDO0FBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDN0IsK0NBQStDLEVBQy9DLE1BQU0sQ0FDUCxDQUFDO0FBQ0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDN0IsK0NBQStDLEVBQy9DLE1BQU0sQ0FDUCxDQUFDO0FBQ0YsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNyRCxNQUFNLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDO0FBZ0lqRCxNQUFNLGdCQUFnQixHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNwRCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIsZUFBZTtJQUNm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
@@ -0,0 +1,49 @@
1
+ import { type ISmartSecretKernelOperationOptions, type ISmartSecretKernelStoreOptions } from './smartsecret.kernel.protocol.js';
2
+ export type { ISmartSecretKernelOperationOptions, ISmartSecretKernelStoreOptions, } from './smartsecret.kernel.protocol.js';
3
+ declare const legacyReceiptBrand: unique symbol;
4
+ export type TDevIdpV1LegacyReceipt = {
5
+ readonly [legacyReceiptBrand]: true;
6
+ };
7
+ export interface IDevIdpV1LegacyRead {
8
+ readonly value: Uint8Array;
9
+ readonly receipt: TDevIdpV1LegacyReceipt;
10
+ }
11
+ /**
12
+ * Strict Linux kernel-keyring storage for small same-UID process secrets.
13
+ *
14
+ * This class deliberately has no filesystem, Secret Service, or executable
15
+ * discovery fallback. Use create() so the Rust worker is ready before access.
16
+ */
17
+ export declare class SmartSecretKernelStore {
18
+ readonly service: string;
19
+ private readonly mutex;
20
+ private readonly bridge;
21
+ private readonly generation;
22
+ private readonly receiptRecords;
23
+ private lifecycleState;
24
+ private poisoned;
25
+ private operationTail;
26
+ private closePromise;
27
+ private terminationPromise;
28
+ private constructor();
29
+ static create(optionsArg: ISmartSecretKernelStoreOptions): Promise<SmartSecretKernelStore>;
30
+ getEntry(accountArg: string, optionsArg?: ISmartSecretKernelOperationOptions): Promise<Uint8Array | null>;
31
+ setEntry(accountArg: string, valueArg: Uint8Array, optionsArg?: ISmartSecretKernelOperationOptions): Promise<void>;
32
+ deleteEntry(accountArg: string, optionsArg?: ISmartSecretKernelOperationOptions): Promise<boolean>;
33
+ readDevIdpV1Legacy(accountArg: string, optionsArg?: ISmartSecretKernelOperationOptions): Promise<IDevIdpV1LegacyRead | null>;
34
+ deleteDevIdpV1Legacy(receiptArg: TDevIdpV1LegacyReceipt, optionsArg?: ISmartSecretKernelOperationOptions): Promise<'deleted' | 'alreadyAbsent'>;
35
+ close(): Promise<void>;
36
+ private assertCanReserve;
37
+ private reserveOperation;
38
+ private requireLegacyService;
39
+ private requireReceiptRecord;
40
+ private remainingMilliseconds;
41
+ private createBridgeRequestOptions;
42
+ private acquireKernelLease;
43
+ private withKernelLease;
44
+ private dispatchRead;
45
+ private dispatchMutation;
46
+ private throwDomainError;
47
+ private terminateBridgeConfirmed;
48
+ private poisonAndTerminate;
49
+ }