@skrr-ai/auth-core 0.1.2

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 (147) hide show
  1. package/README.md +21 -0
  2. package/dist/cjs/aead.d.ts +24 -0
  3. package/dist/cjs/aead.js +65 -0
  4. package/dist/cjs/authExpiredDetector.d.ts +65 -0
  5. package/dist/cjs/authExpiredDetector.js +89 -0
  6. package/dist/cjs/authHelper.d.ts +51 -0
  7. package/dist/cjs/authHelper.js +321 -0
  8. package/dist/cjs/credentialEnvelope.d.ts +85 -0
  9. package/dist/cjs/credentialEnvelope.js +230 -0
  10. package/dist/cjs/credentialEnvelopeBridge.d.ts +116 -0
  11. package/dist/cjs/credentialEnvelopeBridge.js +637 -0
  12. package/dist/cjs/credentialResolver.d.ts +278 -0
  13. package/dist/cjs/credentialResolver.js +423 -0
  14. package/dist/cjs/daemonPair.d.ts +172 -0
  15. package/dist/cjs/daemonPair.js +495 -0
  16. package/dist/cjs/daemonScopes.d.ts +74 -0
  17. package/dist/cjs/daemonScopes.js +84 -0
  18. package/dist/cjs/deviceIdentityBridge.d.ts +113 -0
  19. package/dist/cjs/deviceIdentityBridge.js +591 -0
  20. package/dist/cjs/deviceKey.d.ts +167 -0
  21. package/dist/cjs/deviceKey.js +332 -0
  22. package/dist/cjs/fdToken.d.ts +17 -0
  23. package/dist/cjs/fdToken.js +238 -0
  24. package/dist/cjs/harnessTrust.d.ts +72 -0
  25. package/dist/cjs/harnessTrust.js +103 -0
  26. package/dist/cjs/headers-helper.d.ts +25 -0
  27. package/dist/cjs/headers-helper.js +323 -0
  28. package/dist/cjs/index.d.ts +37 -0
  29. package/dist/cjs/index.js +305 -0
  30. package/dist/cjs/jwtUtils.d.ts +35 -0
  31. package/dist/cjs/jwtUtils.js +61 -0
  32. package/dist/cjs/kek/index.d.ts +89 -0
  33. package/dist/cjs/kek/index.js +208 -0
  34. package/dist/cjs/kek/linux.d.ts +92 -0
  35. package/dist/cjs/kek/linux.js +596 -0
  36. package/dist/cjs/kek/macos.d.ts +112 -0
  37. package/dist/cjs/kek/macos.js +599 -0
  38. package/dist/cjs/kek/types.d.ts +111 -0
  39. package/dist/cjs/kek/types.js +43 -0
  40. package/dist/cjs/kek/windows.d.ts +71 -0
  41. package/dist/cjs/kek/windows.js +350 -0
  42. package/dist/cjs/kek/zeroize-registry.d.ts +44 -0
  43. package/dist/cjs/kek/zeroize-registry.js +63 -0
  44. package/dist/cjs/legacyStatePreflight.d.ts +67 -0
  45. package/dist/cjs/legacyStatePreflight.js +78 -0
  46. package/dist/cjs/localIdentity.d.ts +54 -0
  47. package/dist/cjs/localIdentity.js +57 -0
  48. package/dist/cjs/loginLocalhost.d.ts +115 -0
  49. package/dist/cjs/loginLocalhost.js +368 -0
  50. package/dist/cjs/loginWithLocalhost.d.ts +131 -0
  51. package/dist/cjs/loginWithLocalhost.js +359 -0
  52. package/dist/cjs/machineId.d.ts +35 -0
  53. package/dist/cjs/machineId.js +239 -0
  54. package/dist/cjs/messages.d.ts +9 -0
  55. package/dist/cjs/messages.js +44 -0
  56. package/dist/cjs/package.json +3 -0
  57. package/dist/cjs/pkce.d.ts +62 -0
  58. package/dist/cjs/pkce.js +158 -0
  59. package/dist/cjs/recoveryCode.d.ts +61 -0
  60. package/dist/cjs/recoveryCode.js +213 -0
  61. package/dist/cjs/refresh.d.ts +215 -0
  62. package/dist/cjs/refresh.js +877 -0
  63. package/dist/cjs/refreshClassification.d.ts +53 -0
  64. package/dist/cjs/refreshClassification.js +105 -0
  65. package/dist/cjs/refreshScheduler.d.ts +53 -0
  66. package/dist/cjs/refreshScheduler.js +332 -0
  67. package/dist/cjs/runtime.d.ts +149 -0
  68. package/dist/cjs/runtime.js +136 -0
  69. package/dist/cjs/spawnEnv.d.ts +76 -0
  70. package/dist/cjs/spawnEnv.js +153 -0
  71. package/dist/cjs/ttlParser.d.ts +54 -0
  72. package/dist/cjs/ttlParser.js +87 -0
  73. package/dist/cjs/types.d.ts +91 -0
  74. package/dist/cjs/types.js +26 -0
  75. package/dist/esm/aead.d.ts +24 -0
  76. package/dist/esm/aead.js +57 -0
  77. package/dist/esm/authExpiredDetector.d.ts +65 -0
  78. package/dist/esm/authExpiredDetector.js +85 -0
  79. package/dist/esm/authHelper.d.ts +51 -0
  80. package/dist/esm/authHelper.js +311 -0
  81. package/dist/esm/credentialEnvelope.d.ts +85 -0
  82. package/dist/esm/credentialEnvelope.js +213 -0
  83. package/dist/esm/credentialEnvelopeBridge.d.ts +116 -0
  84. package/dist/esm/credentialEnvelopeBridge.js +620 -0
  85. package/dist/esm/credentialResolver.d.ts +278 -0
  86. package/dist/esm/credentialResolver.js +414 -0
  87. package/dist/esm/daemonPair.d.ts +172 -0
  88. package/dist/esm/daemonPair.js +476 -0
  89. package/dist/esm/daemonScopes.d.ts +74 -0
  90. package/dist/esm/daemonScopes.js +80 -0
  91. package/dist/esm/deviceIdentityBridge.d.ts +113 -0
  92. package/dist/esm/deviceIdentityBridge.js +572 -0
  93. package/dist/esm/deviceKey.d.ts +167 -0
  94. package/dist/esm/deviceKey.js +320 -0
  95. package/dist/esm/fdToken.d.ts +17 -0
  96. package/dist/esm/fdToken.js +231 -0
  97. package/dist/esm/harnessTrust.d.ts +72 -0
  98. package/dist/esm/harnessTrust.js +97 -0
  99. package/dist/esm/headers-helper.d.ts +25 -0
  100. package/dist/esm/headers-helper.js +316 -0
  101. package/dist/esm/index.d.ts +37 -0
  102. package/dist/esm/index.js +144 -0
  103. package/dist/esm/jwtUtils.d.ts +35 -0
  104. package/dist/esm/jwtUtils.js +57 -0
  105. package/dist/esm/kek/index.d.ts +89 -0
  106. package/dist/esm/kek/index.js +162 -0
  107. package/dist/esm/kek/linux.d.ts +92 -0
  108. package/dist/esm/kek/linux.js +585 -0
  109. package/dist/esm/kek/macos.d.ts +112 -0
  110. package/dist/esm/kek/macos.js +586 -0
  111. package/dist/esm/kek/types.d.ts +111 -0
  112. package/dist/esm/kek/types.js +39 -0
  113. package/dist/esm/kek/windows.d.ts +71 -0
  114. package/dist/esm/kek/windows.js +344 -0
  115. package/dist/esm/kek/zeroize-registry.d.ts +44 -0
  116. package/dist/esm/kek/zeroize-registry.js +58 -0
  117. package/dist/esm/legacyStatePreflight.d.ts +67 -0
  118. package/dist/esm/legacyStatePreflight.js +71 -0
  119. package/dist/esm/localIdentity.d.ts +54 -0
  120. package/dist/esm/localIdentity.js +54 -0
  121. package/dist/esm/loginLocalhost.d.ts +115 -0
  122. package/dist/esm/loginLocalhost.js +355 -0
  123. package/dist/esm/loginWithLocalhost.d.ts +131 -0
  124. package/dist/esm/loginWithLocalhost.js +353 -0
  125. package/dist/esm/machineId.d.ts +35 -0
  126. package/dist/esm/machineId.js +231 -0
  127. package/dist/esm/messages.d.ts +9 -0
  128. package/dist/esm/messages.js +40 -0
  129. package/dist/esm/pkce.d.ts +62 -0
  130. package/dist/esm/pkce.js +148 -0
  131. package/dist/esm/recoveryCode.d.ts +61 -0
  132. package/dist/esm/recoveryCode.js +207 -0
  133. package/dist/esm/refresh.d.ts +215 -0
  134. package/dist/esm/refresh.js +863 -0
  135. package/dist/esm/refreshClassification.d.ts +53 -0
  136. package/dist/esm/refreshClassification.js +106 -0
  137. package/dist/esm/refreshScheduler.d.ts +53 -0
  138. package/dist/esm/refreshScheduler.js +329 -0
  139. package/dist/esm/runtime.d.ts +149 -0
  140. package/dist/esm/runtime.js +121 -0
  141. package/dist/esm/spawnEnv.d.ts +76 -0
  142. package/dist/esm/spawnEnv.js +149 -0
  143. package/dist/esm/ttlParser.d.ts +54 -0
  144. package/dist/esm/ttlParser.js +83 -0
  145. package/dist/esm/types.d.ts +91 -0
  146. package/dist/esm/types.js +21 -0
  147. package/package.json +82 -0
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.UnavailableKek = exports.InMemoryKek = exports.registerZeroizeHook = exports.zeroizeKekCaches = exports.WindowsKek = exports.LinuxKek = exports.MacosKek = exports.KekUnavailableError = void 0;
37
+ exports.__setKekStrategyForTest = __setKekStrategyForTest;
38
+ exports.getKekStrategy = getKekStrategy;
39
+ const types_js_1 = require("./types.js");
40
+ const macos_js_1 = require("./macos.js");
41
+ const linux_js_1 = require("./linux.js");
42
+ const windows_js_1 = require("./windows.js");
43
+ var types_js_2 = require("./types.js");
44
+ Object.defineProperty(exports, "KekUnavailableError", { enumerable: true, get: function () { return types_js_2.KekUnavailableError; } });
45
+ var macos_js_2 = require("./macos.js");
46
+ Object.defineProperty(exports, "MacosKek", { enumerable: true, get: function () { return macos_js_2.MacosKek; } });
47
+ var linux_js_2 = require("./linux.js");
48
+ Object.defineProperty(exports, "LinuxKek", { enumerable: true, get: function () { return linux_js_2.LinuxKek; } });
49
+ var windows_js_2 = require("./windows.js");
50
+ Object.defineProperty(exports, "WindowsKek", { enumerable: true, get: function () { return windows_js_2.WindowsKek; } });
51
+ var zeroize_registry_js_1 = require("./zeroize-registry.js");
52
+ Object.defineProperty(exports, "zeroizeKekCaches", { enumerable: true, get: function () { return zeroize_registry_js_1.zeroizeKekCaches; } });
53
+ Object.defineProperty(exports, "registerZeroizeHook", { enumerable: true, get: function () { return zeroize_registry_js_1.registerZeroizeHook; } });
54
+ /**
55
+ * Strategy used when the current platform has no implementation. Always
56
+ * unavailable; never throws on probe. Provides an honest `id` so fleet
57
+ * telemetry can distinguish "we have no KEK on this platform" from
58
+ * "the platform's KEK probe failed."
59
+ */
60
+ class UnsupportedPlatformKek {
61
+ id;
62
+ platform;
63
+ constructor(platform) {
64
+ this.platform = platform;
65
+ this.id = `unsupported-${platform}`;
66
+ }
67
+ async available() {
68
+ return false;
69
+ }
70
+ async wrap() {
71
+ throw new types_js_1.KekUnavailableError(this.id, `KEK unsupported on platform ${this.platform}`);
72
+ }
73
+ async unwrap() {
74
+ throw new types_js_1.KekUnavailableError(this.id, `KEK unsupported on platform ${this.platform}`);
75
+ }
76
+ describe() {
77
+ return `unsupported platform: ${this.platform}`;
78
+ }
79
+ }
80
+ let _override = null;
81
+ /**
82
+ * @internal Test-only seam — inject a synthetic KEK strategy that wraps
83
+ * with a fixed in-memory key. Resets to platform default when called
84
+ * with `null`.
85
+ */
86
+ function __setKekStrategyForTest(strategy) {
87
+ _override = strategy;
88
+ }
89
+ /**
90
+ * Resolve the KEK strategy for the current process. Returns the test
91
+ * override when set; otherwise selects by `process.platform`.
92
+ *
93
+ * Idempotent and side-effect-free — the strategy is constructed fresh
94
+ * on each call. Implementations must keep their own caches if probing
95
+ * is expensive (none of the current stubs do).
96
+ */
97
+ function getKekStrategy() {
98
+ if (_override)
99
+ return _override;
100
+ switch (process.platform) {
101
+ case 'darwin':
102
+ // C5 (shipped): macOS uses the `security(1)` shellout backend with
103
+ // a Secure Enclave NAPI binding preferred when present. Backend
104
+ // selection happens inside MacosKek; no dispatch change required.
105
+ return new macos_js_1.MacosKek();
106
+ case 'linux':
107
+ // TODO(L12): Linux libsecret + machine-id-derived KEK is still a
108
+ // stub. Planned approach: shellout to `secret-tool`, modeled after
109
+ // the macOS shellout pattern shipped in C5. See
110
+ // `docs/daemon-auth-l12-kek-platform-bindings.md` §5.
111
+ return new linux_js_1.LinuxKek();
112
+ case 'win32':
113
+ // TODO(L12): Windows DPAPI KEK is still a stub. Planned approach:
114
+ // PowerShell shellout invoking ProtectedData.Protect (or a future
115
+ // dpapi NAPI binding). See
116
+ // `docs/daemon-auth-l12-kek-platform-bindings.md` §5.
117
+ return new windows_js_1.WindowsKek();
118
+ default:
119
+ return new UnsupportedPlatformKek(process.platform);
120
+ }
121
+ }
122
+ /**
123
+ * In-memory KEK strategy backed by a fixed buffer. Useful for tests and
124
+ * for a future `--kek=file:<path>` opt-in for users who explicitly
125
+ * waive platform-native protection (e.g., headless CI on a hardened
126
+ * VM where DPAPI isn't reachable). Do NOT default to this in production
127
+ * paths — it provides no protection beyond filesystem permissions on
128
+ * whatever holds the buffer.
129
+ */
130
+ class InMemoryKek {
131
+ id = 'in-memory-test';
132
+ key;
133
+ constructor(key) {
134
+ if (!Buffer.isBuffer(key) || key.length !== 32) {
135
+ throw new TypeError('InMemoryKek: key must be a 32-byte Buffer');
136
+ }
137
+ this.key = Buffer.from(key);
138
+ }
139
+ /**
140
+ * Stable backend identifier surfaced via `KekStrategy.kind`. Distinct
141
+ * from the MacosKek shellout / NAPI kinds so telemetry filters can
142
+ * exclude in-memory test traffic from fleet dashboards.
143
+ */
144
+ get kind() {
145
+ return 'in-memory-test';
146
+ }
147
+ async available() {
148
+ return true;
149
+ }
150
+ async wrap(dek, aad) {
151
+ const { sealBuffer, serialize } = await Promise.resolve().then(() => __importStar(require('../credentialEnvelope.js')));
152
+ return Buffer.from(serialize(sealBuffer(dek, this.key, aad)), 'utf-8');
153
+ }
154
+ async unwrap(wrapped, aad) {
155
+ const { deserialize, openBuffer } = await Promise.resolve().then(() => __importStar(require('../credentialEnvelope.js')));
156
+ const sealed = deserialize(wrapped.toString('utf-8'));
157
+ if (!sealed)
158
+ throw new types_js_1.KekUnavailableError(this.id, 'InMemoryKek: malformed wrapped blob');
159
+ return openBuffer(sealed, this.key, aad);
160
+ }
161
+ async unwrapExisting(wrapped, aad) {
162
+ return this.unwrap(wrapped, aad);
163
+ }
164
+ describe() {
165
+ return 'in-memory test KEK (NOT FOR PRODUCTION)';
166
+ }
167
+ }
168
+ exports.InMemoryKek = InMemoryKek;
169
+ /**
170
+ * Test double for the KEK-UNAVAILABLE branch — the twin of `InMemoryKek`.
171
+ *
172
+ * It exists because "no KEK on this platform" cannot be expressed by passing
173
+ * `null` to `__setKekStrategyForTest`. `null` means "use the platform
174
+ * default", and the platform defaults do not agree: `LinuxKek` essentially
175
+ * always resolves (tier-3 derives a KEK from machine identity when libsecret
176
+ * is absent), `MacosKek` resolves only when a login keychain can be found —
177
+ * which a test that sandboxes `HOME` accidentally prevents — and `WindowsKek`
178
+ * is still a stub. A suite that wants the unavailable branch and passes `null`
179
+ * is therefore not testing that branch; it is testing which machine it landed
180
+ * on, and it flips from green to red when the machine changes.
181
+ *
182
+ * That is not hypothetical: four daemon suites asserting fail-closed behaviour
183
+ * passed on macOS purely because their temp `HOME` hid the keychain, and went
184
+ * red the first time CI ever executed them on Linux.
185
+ *
186
+ * `wrap`/`unwrap` throw rather than returning junk, matching the contract in
187
+ * `types.ts`: a strategy that reports unavailable must never silently produce
188
+ * ciphertext a caller could mistake for protected material.
189
+ */
190
+ class UnavailableKek {
191
+ id = 'unavailable-test';
192
+ get kind() {
193
+ return 'unavailable-test';
194
+ }
195
+ async available() {
196
+ return false;
197
+ }
198
+ async wrap() {
199
+ throw new types_js_1.KekUnavailableError(this.id, 'UnavailableKek: wrap called while unavailable');
200
+ }
201
+ async unwrap() {
202
+ throw new types_js_1.KekUnavailableError(this.id, 'UnavailableKek: unwrap called while unavailable');
203
+ }
204
+ describe() {
205
+ return 'unavailable test KEK (forces the kek_unavailable branch)';
206
+ }
207
+ }
208
+ exports.UnavailableKek = UnavailableKek;
@@ -0,0 +1,92 @@
1
+ import type { KekStrategy } from './types.js';
2
+ /** Stable telemetry kind strings — one per backend tier. */
3
+ declare const KIND_LIBSECRET = "linux-libsecret-shellout";
4
+ declare const KIND_HKDF = "linux-machineid-hkdf";
5
+ /**
6
+ * Type for the execFile mock. Accepts an optional `input` in options so
7
+ * tests can assert the stdin payload passed to `secret-tool store`.
8
+ */
9
+ type ExecFileLike = (file: string, args: readonly string[], options?: {
10
+ encoding?: BufferEncoding;
11
+ input?: string;
12
+ }) => Promise<{
13
+ stdout: string;
14
+ stderr: string;
15
+ }>;
16
+ /**
17
+ * @internal Test seam — inject a mock execFile for hermetic tests so the
18
+ * suite never touches the real Secret Service. Reset to `null` to restore
19
+ * the real `child_process.execFile`.
20
+ */
21
+ export declare function __setExecFileForTest(fn: ExecFileLike | null): void;
22
+ type ReadFileSyncLike = (path: string, encoding: BufferEncoding) => string;
23
+ /**
24
+ * @internal Test seam — inject a mock readFileSync so Tier-3 derivation
25
+ * tests can drive deterministic IKM without writing to /proc or /etc.
26
+ * Reset to `null` to restore the real `fs.readFileSync`. Pass `null` to
27
+ * also clear the tier selection + KEK cache so the next call re-probes.
28
+ */
29
+ export declare function __setFsForTest(fn: ReadFileSyncLike | null): void;
30
+ /**
31
+ * Zero out and drop every in-process master-KEK cache buffer (both the
32
+ * Tier-2 by-service map and the Tier-3 single buffer).
33
+ *
34
+ * Must be called on:
35
+ * - Daemon shutdown (SIGTERM / SIGINT) so the KEK does not linger in
36
+ * memory across the process exit window where coredumps could land.
37
+ * - KEK rotation, after the new KEK has been resolved.
38
+ * - Logout flows that wipe at-rest credentials.
39
+ *
40
+ * Idempotent — safe to call when the caches are already empty.
41
+ */
42
+ export declare function zeroizeLinuxKekCache(): void;
43
+ /** @internal Test seam — clear the in-process master-KEK cache + tier
44
+ * selection. Routes through the production zeroize helper so the
45
+ * test-reset path exercises the same buffer-fill that ships in
46
+ * production, and additionally clears `_tierSelection` so a subsequent
47
+ * test re-probes (otherwise Tier-3 caching across tests poisons later
48
+ * cases). */
49
+ export declare function __resetKekCacheForTest(): void;
50
+ export declare class LinuxKek implements KekStrategy {
51
+ readonly id = "linux-libsecret-machineid";
52
+ private _lastKind;
53
+ private readonly service;
54
+ private readonly account;
55
+ /**
56
+ * Construct a Linux KEK strategy.
57
+ *
58
+ * @param opts.service Optional Secret Service `service` attribute used
59
+ * by Tier-2 `secret-tool lookup`/`store`. Defaults to
60
+ * `'ai.skrr.daemon.kek'`. Override only for test isolation /
61
+ * smoke tests; production callers should use the default so different
62
+ * daemon processes on the same host share the same KEK and can unwrap
63
+ * each other's persisted credentials. Ignored on the Tier-3 (HKDF)
64
+ * path. Callers that override are responsible for cleaning up the
65
+ * corresponding Secret Service entry when done.
66
+ * @param opts.account Optional Secret Service `account` attribute.
67
+ * Defaults to `'master-kek-v1'`. Same scoping rules as `service`.
68
+ */
69
+ constructor(opts?: {
70
+ service?: string;
71
+ account?: string;
72
+ });
73
+ /**
74
+ * Telemetry kind of the most recent successful wrap/unwrap. `null` before
75
+ * any call. After the first successful wrap or unwrap, one of:
76
+ * - `'linux-libsecret-shellout'` (Tier-2)
77
+ * - `'linux-machineid-hkdf'` (Tier-3)
78
+ */
79
+ get kind(): typeof KIND_LIBSECRET | typeof KIND_HKDF | null;
80
+ /**
81
+ * `available()` is true on Linux when EITHER backend can satisfy a
82
+ * wrap: libsecret is reachable, or `/etc/machine-id` exists so Tier-3
83
+ * derivation can succeed. Probe results are cached for the process
84
+ * lifetime.
85
+ */
86
+ available(): Promise<boolean>;
87
+ wrap(dek: Buffer, aad?: Buffer): Promise<Buffer>;
88
+ unwrap(wrapped: Buffer, aad?: Buffer): Promise<Buffer>;
89
+ unwrapExisting(wrapped: Buffer, aad?: Buffer): Promise<Buffer>;
90
+ describe(): string;
91
+ }
92
+ export {};