@huaweidevtools/aishell-dsh-credentials-store 0.0.15 → 0.0.16
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/lib/accounts.d.ts +31 -20
- package/lib/accounts.d.ts.map +1 -1
- package/lib/accounts.js +57 -24
- package/lib/accounts.js.map +1 -1
- package/lib/{index-JlyJE1E8.d.ts → index-Cdsu1kDC.d.ts} +87 -12
- package/lib/index-Cdsu1kDC.d.ts.map +1 -0
- package/lib/index.d.ts +3 -3
- package/lib/index.js +165 -29
- package/lib/index.js.map +1 -1
- package/lib/{paths-DtFRzop6.js → paths-C0wxA5LO.js} +3 -3
- package/lib/paths-C0wxA5LO.js.map +1 -0
- package/lib/paths.d.ts +10 -9
- package/lib/paths.d.ts.map +1 -1
- package/lib/paths.js +1 -1
- package/lib/{scope-CFetnbG3.d.ts → scope-C7w2eTvE.d.ts} +12 -12
- package/lib/{scope-CFetnbG3.d.ts.map → scope-C7w2eTvE.d.ts.map} +1 -1
- package/lib/{scope-QmrHZaZt.js → scope-DJcK27Uc.js} +12 -12
- package/lib/scope-DJcK27Uc.js.map +1 -0
- package/lib/scope.d.ts +1 -1
- package/lib/scope.js +1 -1
- package/lib/signer-Bx88x7dI.d.ts +72 -0
- package/lib/signer-Bx88x7dI.d.ts.map +1 -0
- package/lib/{signer-BPR0UAF0.js → signer-CVOjpi6y.js} +39 -3
- package/lib/signer-CVOjpi6y.js.map +1 -0
- package/lib/signer.d.ts +2 -2
- package/lib/signer.js +2 -2
- package/lib/types/accounts.d.ts +61 -39
- package/lib/types/accounts.d.ts.map +1 -1
- package/lib/types/accounts.js +108 -52
- package/lib/types/accounts.js.map +1 -1
- package/lib/types/backends/fingerprint.d.ts +78 -0
- package/lib/types/backends/fingerprint.d.ts.map +1 -1
- package/lib/types/backends/fingerprint.js +155 -8
- package/lib/types/backends/fingerprint.js.map +1 -1
- package/lib/types/backends/keyring.d.ts +7 -7
- package/lib/types/backends/keyring.d.ts.map +1 -1
- package/lib/types/backends/keyring.js +15 -9
- package/lib/types/backends/keyring.js.map +1 -1
- package/lib/types/backends/memory.d.ts +4 -17
- package/lib/types/backends/memory.d.ts.map +1 -1
- package/lib/types/backends/memory.js +21 -32
- package/lib/types/backends/memory.js.map +1 -1
- package/lib/types/failover.d.ts +16 -18
- package/lib/types/failover.d.ts.map +1 -1
- package/lib/types/failover.js +19 -21
- package/lib/types/failover.js.map +1 -1
- package/lib/types/index.d.ts +4 -4
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +4 -4
- package/lib/types/index.js.map +1 -1
- package/lib/types/paths.d.ts +10 -9
- package/lib/types/paths.d.ts.map +1 -1
- package/lib/types/paths.js +10 -9
- package/lib/types/paths.js.map +1 -1
- package/lib/types/scope.d.ts +11 -11
- package/lib/types/scope.js +11 -11
- package/lib/types/signer.d.ts +32 -0
- package/lib/types/signer.d.ts.map +1 -1
- package/lib/types/signer.js +40 -5
- package/lib/types/signer.js.map +1 -1
- package/lib/types/verify.d.ts +7 -11
- package/lib/types/verify.d.ts.map +1 -1
- package/lib/types/verify.js +27 -11
- package/lib/types/verify.js.map +1 -1
- package/lib/verify.d.ts +1 -1
- package/lib/verify.d.ts.map +1 -1
- package/lib/verify.js +11 -1
- package/lib/verify.js.map +1 -1
- package/package.json +1 -1
- package/lib/index-JlyJE1E8.d.ts.map +0 -1
- package/lib/paths-DtFRzop6.js.map +0 -1
- package/lib/scope-QmrHZaZt.js.map +0 -1
- package/lib/signer-BPR0UAF0.js.map +0 -1
- package/lib/signer-Et0DIH6o.d.ts +0 -40
- package/lib/signer-Et0DIH6o.d.ts.map +0 -1
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
*
|
|
10
10
|
* On Linux the binding picks a store itself: Secret Service (gnome-keyring,
|
|
11
11
|
* KWallet, KeePassXC) first, then — silently — the kernel keyutils keyring.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* The kernel keyring is the wrong target for credentials, and the binding's own
|
|
13
|
+
* README says so: it is "completely in-memory and will not persist across
|
|
14
14
|
* reboots". A machine with no Secret Service (a container, CI, a systemd unit
|
|
15
|
-
* with no session bus) would
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* with no session bus) would accept credentials, report them stored, and lose
|
|
16
|
+
* them at the next reboot — with `credentialsStored: true` left in the profile
|
|
17
|
+
* pointing at nothing.
|
|
18
18
|
*
|
|
19
19
|
* Pinning `{ linux: { store: 'secret-service' } }` makes an unavailable
|
|
20
20
|
* service throw from the constructor probe instead, so
|
|
@@ -52,8 +52,8 @@ export declare function __setKeyringModule(mock: KeyringModule | undefined): voi
|
|
|
52
52
|
* Construction probes the keyring once — if the native module cannot be loaded
|
|
53
53
|
* (no prebuilt binding for this platform), or the Linux Secret Service is
|
|
54
54
|
* unavailable, it throws and {@link createCredentialsStore} falls back to the
|
|
55
|
-
* next backend.
|
|
56
|
-
*
|
|
55
|
+
* next backend. The pin is what makes the second case throw; see the module
|
|
56
|
+
* note.
|
|
57
57
|
*/
|
|
58
58
|
export declare class KeyringBackend implements CredentialsStore {
|
|
59
59
|
private readonly serviceName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../../../src/backends/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAO3E,KAAK,YAAY,GAAG;IAClB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,CAAA;AACD,iFAAiF;AACjF,KAAK,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAAA;KAAE,CAAA;CAAE,CAAA;AAChF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,YAAY,CAAA;CAC7F,CAAA;AAGD,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAExE;AAOD;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,YAAW,gBAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAElC,OAAO,GAAE,sBAA2B;IAWhD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASxC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../../../src/backends/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAO3E,KAAK,YAAY,GAAG;IAClB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,CAAA;AACD,iFAAiF;AACjF,KAAK,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAAA;KAAE,CAAA;CAAE,CAAA;AAChF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,YAAY,CAAA;CAC7F,CAAA;AAGD,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAExE;AAOD;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,YAAW,gBAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAElC,OAAO,GAAE,sBAA2B;IAWhD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASxC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAkB7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAO9B"}
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
*
|
|
10
10
|
* On Linux the binding picks a store itself: Secret Service (gnome-keyring,
|
|
11
11
|
* KWallet, KeePassXC) first, then — silently — the kernel keyutils keyring.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* The kernel keyring is the wrong target for credentials, and the binding's own
|
|
13
|
+
* README says so: it is "completely in-memory and will not persist across
|
|
14
14
|
* reboots". A machine with no Secret Service (a container, CI, a systemd unit
|
|
15
|
-
* with no session bus) would
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* with no session bus) would accept credentials, report them stored, and lose
|
|
16
|
+
* them at the next reboot — with `credentialsStored: true` left in the profile
|
|
17
|
+
* pointing at nothing.
|
|
18
18
|
*
|
|
19
19
|
* Pinning `{ linux: { store: 'secret-service' } }` makes an unavailable
|
|
20
20
|
* service throw from the constructor probe instead, so
|
|
@@ -52,8 +52,8 @@ function loadKeyring() {
|
|
|
52
52
|
* Construction probes the keyring once — if the native module cannot be loaded
|
|
53
53
|
* (no prebuilt binding for this platform), or the Linux Secret Service is
|
|
54
54
|
* unavailable, it throws and {@link createCredentialsStore} falls back to the
|
|
55
|
-
* next backend.
|
|
56
|
-
*
|
|
55
|
+
* next backend. The pin is what makes the second case throw; see the module
|
|
56
|
+
* note.
|
|
57
57
|
*/
|
|
58
58
|
export class KeyringBackend {
|
|
59
59
|
serviceName;
|
|
@@ -88,8 +88,14 @@ export class KeyringBackend {
|
|
|
88
88
|
new this.Entry(this.serviceName, account, this.options).deletePassword();
|
|
89
89
|
}
|
|
90
90
|
catch (error) {
|
|
91
|
-
//
|
|
92
|
-
//
|
|
91
|
+
// Deleting an absent entry is not an error, but the native binding has no
|
|
92
|
+
// stable code for it — only wording. This filter is deliberately narrow:
|
|
93
|
+
// it matches the *absent-entry* spellings and not "no result found",
|
|
94
|
+
// which a **locked** Secret Service collection reports for entries that
|
|
95
|
+
// really exist. Widening it to cover that would turn a failed clear into
|
|
96
|
+
// a silent no-op, and the credential would keep reading back after the
|
|
97
|
+
// person asked for it to be gone. `FailoverStore.delete` is what handles
|
|
98
|
+
// the locked case — it needs this error to escape from here to see it.
|
|
93
99
|
if (!String(error).includes('not found') && !String(error).includes('no entry')) {
|
|
94
100
|
throw error;
|
|
95
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../../src/backends/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAG7C,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,mEAAmE;AACnE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAW9C,IAAI,aAAwC,CAAA;AAE5C,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,IAA+B;IAChE,aAAa,GAAG,IAAI,CAAA;AACtB,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,aAAa,KAAK,SAAS;QAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAkB,CAAA;IAC7F,OAAO,aAAa,CAAA;AACtB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IACR,WAAW,CAAQ;IACnB,OAAO,CAAqB;IAC5B,KAAK,CAAwB;IAE9C,YAAY,UAAkC,EAAE;QAC9C,IAAI,CAAC,WAAW,GAAG,eAAe,CAAA;QAClC,4EAA4E;QAC5E,0EAA0E;QAC1E,yDAAyD;QACzD,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAA;QACrD,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC,KAAK,CAAA;QAChC,yEAAyE;QACzE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;IAC3E,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;YACnF,OAAO,KAAK,IAAI,SAAS,CAAA;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAe,EAAE,KAAa;QAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QAC7E,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAA;QAC1E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,
|
|
1
|
+
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../../src/backends/keyring.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,23 +6,10 @@
|
|
|
6
6
|
* `Map` and are lost when the process exits — durable enough for a single
|
|
7
7
|
* DSH session, not for persistence.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* Each plugin that stores credentials calls `createCredentialsStore()` for
|
|
15
|
-
* itself — four of them — and every call constructs a fresh backend. That is
|
|
16
|
-
* harmless for the keyring and the encrypted file, which are process-external
|
|
17
|
-
* and therefore shared by construction, but a private `Map` is not: without
|
|
18
|
-
* the sharing below, the plugin that saved a credential and the plugin that
|
|
19
|
-
* read it would be looking at different maps, and the second would report
|
|
20
|
-
* "not authenticated" on a machine where the person had just authenticated.
|
|
21
|
-
*
|
|
22
|
-
* The sharing lives in {@link sharedMemoryBackend} rather than in this class
|
|
23
|
-
* so that `new MemoryBackend()` keeps producing an independent store. Tests
|
|
24
|
-
* rely on that — a spec constructing one expects it to start empty, and a
|
|
25
|
-
* singleton class would leak state between spec files.
|
|
9
|
+
* Two exports, and the difference between them is who shares what:
|
|
10
|
+
* {@link MemoryBackend} is an independent store, and
|
|
11
|
+
* {@link sharedMemoryBackend} is the one instance every caller in the process
|
|
12
|
+
* resolves to. Its docstring carries the reasoning.
|
|
26
13
|
*/
|
|
27
14
|
import type { CredentialsStore, CredentialsStoreConfig } from '../index.ts';
|
|
28
15
|
/** Process-scoped {@link CredentialsStore}; entries vanish on exit. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/backends/memory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/backends/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAE3E,uEAAuE;AACvE,qBAAa,aAAc,YAAW,gBAAgB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAExC,OAAO,GAAE,sBAA2B;IAKhD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAG9B;AAgCD,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,sBAA2B,GAAG,aAAa,CAGtF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
|
@@ -6,23 +6,10 @@
|
|
|
6
6
|
* `Map` and are lost when the process exits — durable enough for a single
|
|
7
7
|
* DSH session, not for persistence.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* Each plugin that stores credentials calls `createCredentialsStore()` for
|
|
15
|
-
* itself — four of them — and every call constructs a fresh backend. That is
|
|
16
|
-
* harmless for the keyring and the encrypted file, which are process-external
|
|
17
|
-
* and therefore shared by construction, but a private `Map` is not: without
|
|
18
|
-
* the sharing below, the plugin that saved a credential and the plugin that
|
|
19
|
-
* read it would be looking at different maps, and the second would report
|
|
20
|
-
* "not authenticated" on a machine where the person had just authenticated.
|
|
21
|
-
*
|
|
22
|
-
* The sharing lives in {@link sharedMemoryBackend} rather than in this class
|
|
23
|
-
* so that `new MemoryBackend()` keeps producing an independent store. Tests
|
|
24
|
-
* rely on that — a spec constructing one expects it to start empty, and a
|
|
25
|
-
* singleton class would leak state between spec files.
|
|
9
|
+
* Two exports, and the difference between them is who shares what:
|
|
10
|
+
* {@link MemoryBackend} is an independent store, and
|
|
11
|
+
* {@link sharedMemoryBackend} is the one instance every caller in the process
|
|
12
|
+
* resolves to. Its docstring carries the reasoning.
|
|
26
13
|
*/
|
|
27
14
|
/** Process-scoped {@link CredentialsStore}; entries vanish on exit. */
|
|
28
15
|
export class MemoryBackend {
|
|
@@ -47,26 +34,28 @@ export class MemoryBackend {
|
|
|
47
34
|
}
|
|
48
35
|
}
|
|
49
36
|
/**
|
|
50
|
-
* The one memory backend
|
|
37
|
+
* The one memory backend every caller in this process resolves to.
|
|
51
38
|
*
|
|
52
|
-
* ## Why
|
|
39
|
+
* ## Why the factory shares an instance
|
|
53
40
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
41
|
+
* Every plugin that stores credentials calls `createCredentialsStore()` for
|
|
42
|
+
* itself — four of them — and each call resolves a backend. The keyring is a
|
|
43
|
+
* daemon and the encrypted file is a path, so two callers reaching either read
|
|
44
|
+
* the same bytes by construction. A `Map` is not: with a fresh one per call,
|
|
45
|
+
* the plugin that saved a credential and the plugin that reads it would be
|
|
46
|
+
* looking at different maps, and the second would report "not authenticated"
|
|
47
|
+
* on a machine where the person had just authenticated.
|
|
60
48
|
*
|
|
61
|
-
*
|
|
62
|
-
* independent, which
|
|
49
|
+
* The sharing lives here rather than in {@link MemoryBackend} so that
|
|
50
|
+
* `new MemoryBackend()` still produces an independent store, which is what the
|
|
51
|
+
* specs rely on: a spec that constructs one expects it to start empty, and a
|
|
52
|
+
* singleton class would leak state between spec files.
|
|
63
53
|
*
|
|
64
|
-
* ## Why
|
|
54
|
+
* ## Why it is created on first use
|
|
65
55
|
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* that
|
|
69
|
-
* behind.
|
|
56
|
+
* Creating it at module load would make importing this module mutate state a
|
|
57
|
+
* test then has to account for. Lazy creation keeps the import inert, so a spec
|
|
58
|
+
* that swaps the keyring module in and out leaves no store behind.
|
|
70
59
|
*
|
|
71
60
|
* @param config - forwarded on first construction only; later callers reuse
|
|
72
61
|
* the instance, since the memory backend keeps nothing config decides.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/backends/memory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/backends/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,uEAAuE;AACvE,MAAM,OAAO,aAAa;IACP,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEpD,YAAY,UAAkC,EAAE;QAC9C,wEAAwE;QACxE,sDAAsD;IACxD,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,GAAG,CAAC,OAAe,EAAE,KAAa;QAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QAC7E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,IAAI,MAAiC,CAAA;AAErC,MAAM,UAAU,mBAAmB,CAAC,SAAiC,EAAE;IACrE,MAAM,KAAK,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,GAAG,SAAS,CAAA;AACpB,CAAC"}
|
package/lib/types/failover.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Write-failover wrapper — covers the failure class
|
|
3
|
-
*
|
|
2
|
+
* Write-failover wrapper — covers the failure class a construction-time probe
|
|
3
|
+
* cannot see.
|
|
4
4
|
*
|
|
5
5
|
* {@link createCredentialsStore} picks a backend by probing at construction
|
|
6
6
|
* time, but the highest-priority backend (the OS keyring) can pass that probe
|
|
7
|
-
* and still reject every real write: a locked GNOME keyring collection reads
|
|
8
|
-
*
|
|
9
|
-
* Measured on an isolated D-Bus session:
|
|
7
|
+
* and still reject every real write: a locked GNOME keyring collection reads as
|
|
8
|
+
* `null` and its `setPassword` fails. Measured on an isolated D-Bus session:
|
|
10
9
|
*
|
|
11
10
|
* - locked collection, no default alias — read 5 ms → null; write 5 ms →
|
|
12
11
|
* "Couldn't access platform storage: Secret Service: no result found"
|
|
@@ -17,10 +16,9 @@
|
|
|
17
16
|
* So the write path needs its own fallback chain, and it must be sticky: a
|
|
18
17
|
* locked keyring fails every write, so retrying it per call would surface the
|
|
19
18
|
* same error (or the same prompt) once per account a save writes. Deletes trip
|
|
20
|
-
* the same failover
|
|
21
|
-
* the save route
|
|
22
|
-
* this
|
|
23
|
-
* engages.
|
|
19
|
+
* the same failover — a locked collection rejects them with the same error, and
|
|
20
|
+
* the save route deletes the old set before writing the new one, so without
|
|
21
|
+
* this a locked keyring would fail the save before the write failover engaged.
|
|
24
22
|
*
|
|
25
23
|
* ## Which copy wins
|
|
26
24
|
*
|
|
@@ -46,11 +44,11 @@
|
|
|
46
44
|
* A successful primary write or delete clears both the fallback value and the
|
|
47
45
|
* tombstone, handing authority back to the keyring.
|
|
48
46
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
47
|
+
* The alternative — marking accounts "stale" on every failover write — would
|
|
48
|
+
* spread one fact across two records: the mark would have to be cleared in
|
|
49
|
+
* lockstep with the value, and a mark left behind after its value was gone
|
|
50
|
+
* would make a perfect keyring credential read as *absent* rather than merely
|
|
51
|
+
* stale. Keeping the shadow in one place avoids that state entirely.
|
|
54
52
|
*
|
|
55
53
|
* ## Why the record is persisted, not held in memory
|
|
56
54
|
*
|
|
@@ -67,8 +65,8 @@
|
|
|
67
65
|
* tombstone). On a machine whose keyring has never failed the fallback has
|
|
68
66
|
* written nothing, so its file does not exist and both lookups are
|
|
69
67
|
* sub-millisecond `existsSync` misses (measured 0.02-0.4 ms). Where a fallback
|
|
70
|
-
* file does exist, each lookup decrypts it —
|
|
71
|
-
*
|
|
68
|
+
* file does exist, each lookup decrypts it — one decrypt per miss, which is what
|
|
69
|
+
* a read-through cache would cost anyway.
|
|
72
70
|
*
|
|
73
71
|
* The fallback is built on the first read rather than the first failed write,
|
|
74
72
|
* which a machine with a working keyring pays once per store: ~97 ms, almost
|
|
@@ -95,9 +93,9 @@ export interface FailoverStoreOptions {
|
|
|
95
93
|
*
|
|
96
94
|
* Stickiness is per instance, not per process: each plugin that consumes
|
|
97
95
|
* credentials builds its own store, so one instance failing over does not stop
|
|
98
|
-
* another from trying the primary. That is
|
|
96
|
+
* another from trying the primary. That is intentional — the flag exists to
|
|
99
97
|
* avoid re-hitting a primary already known to be unwritable from *this* store,
|
|
100
|
-
*
|
|
98
|
+
* so a second instance's attempt is one probe rather than a policy decision.
|
|
101
99
|
* Correctness across instances comes from the persisted record, not the flag.
|
|
102
100
|
*
|
|
103
101
|
* Constructed by {@link createCredentialsStore} around a KeyringBackend whose
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover.d.ts","sourceRoot":"","sources":["../../src/failover.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"failover.d.ts","sourceRoot":"","sources":["../../src/failover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAmBlD,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,gBAAgB,CAAA;CAChD;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,uEAAuE;IACvE,OAAO,CAAC,UAAU,CAAQ;gBAEd,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,oBAAoB;IAKpE,qEAAqE;IACrE,OAAO,KAAK,aAAa,GAGxB;IAED;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAQtB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUxC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAM7B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAyCzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA8B7B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;CAGvB"}
|
package/lib/types/failover.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Write-failover wrapper — covers the failure class
|
|
3
|
-
*
|
|
2
|
+
* Write-failover wrapper — covers the failure class a construction-time probe
|
|
3
|
+
* cannot see.
|
|
4
4
|
*
|
|
5
5
|
* {@link createCredentialsStore} picks a backend by probing at construction
|
|
6
6
|
* time, but the highest-priority backend (the OS keyring) can pass that probe
|
|
7
|
-
* and still reject every real write: a locked GNOME keyring collection reads
|
|
8
|
-
*
|
|
9
|
-
* Measured on an isolated D-Bus session:
|
|
7
|
+
* and still reject every real write: a locked GNOME keyring collection reads as
|
|
8
|
+
* `null` and its `setPassword` fails. Measured on an isolated D-Bus session:
|
|
10
9
|
*
|
|
11
10
|
* - locked collection, no default alias — read 5 ms → null; write 5 ms →
|
|
12
11
|
* "Couldn't access platform storage: Secret Service: no result found"
|
|
@@ -17,10 +16,9 @@
|
|
|
17
16
|
* So the write path needs its own fallback chain, and it must be sticky: a
|
|
18
17
|
* locked keyring fails every write, so retrying it per call would surface the
|
|
19
18
|
* same error (or the same prompt) once per account a save writes. Deletes trip
|
|
20
|
-
* the same failover
|
|
21
|
-
* the save route
|
|
22
|
-
* this
|
|
23
|
-
* engages.
|
|
19
|
+
* the same failover — a locked collection rejects them with the same error, and
|
|
20
|
+
* the save route deletes the old set before writing the new one, so without
|
|
21
|
+
* this a locked keyring would fail the save before the write failover engaged.
|
|
24
22
|
*
|
|
25
23
|
* ## Which copy wins
|
|
26
24
|
*
|
|
@@ -46,11 +44,11 @@
|
|
|
46
44
|
* A successful primary write or delete clears both the fallback value and the
|
|
47
45
|
* tombstone, handing authority back to the keyring.
|
|
48
46
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
47
|
+
* The alternative — marking accounts "stale" on every failover write — would
|
|
48
|
+
* spread one fact across two records: the mark would have to be cleared in
|
|
49
|
+
* lockstep with the value, and a mark left behind after its value was gone
|
|
50
|
+
* would make a perfect keyring credential read as *absent* rather than merely
|
|
51
|
+
* stale. Keeping the shadow in one place avoids that state entirely.
|
|
54
52
|
*
|
|
55
53
|
* ## Why the record is persisted, not held in memory
|
|
56
54
|
*
|
|
@@ -67,8 +65,8 @@
|
|
|
67
65
|
* tombstone). On a machine whose keyring has never failed the fallback has
|
|
68
66
|
* written nothing, so its file does not exist and both lookups are
|
|
69
67
|
* sub-millisecond `existsSync` misses (measured 0.02-0.4 ms). Where a fallback
|
|
70
|
-
* file does exist, each lookup decrypts it —
|
|
71
|
-
*
|
|
68
|
+
* file does exist, each lookup decrypts it — one decrypt per miss, which is what
|
|
69
|
+
* a read-through cache would cost anyway.
|
|
72
70
|
*
|
|
73
71
|
* The fallback is built on the first read rather than the first failed write,
|
|
74
72
|
* which a machine with a working keyring pays once per store: ~97 ms, almost
|
|
@@ -98,9 +96,9 @@ const TOMBSTONE_VALUE = '1';
|
|
|
98
96
|
*
|
|
99
97
|
* Stickiness is per instance, not per process: each plugin that consumes
|
|
100
98
|
* credentials builds its own store, so one instance failing over does not stop
|
|
101
|
-
* another from trying the primary. That is
|
|
99
|
+
* another from trying the primary. That is intentional — the flag exists to
|
|
102
100
|
* avoid re-hitting a primary already known to be unwritable from *this* store,
|
|
103
|
-
*
|
|
101
|
+
* so a second instance's attempt is one probe rather than a policy decision.
|
|
104
102
|
* Correctness across instances comes from the persisted record, not the flag.
|
|
105
103
|
*
|
|
106
104
|
* Constructed by {@link createCredentialsStore} around a KeyringBackend whose
|
|
@@ -185,9 +183,9 @@ export class FailoverStore {
|
|
|
185
183
|
return;
|
|
186
184
|
}
|
|
187
185
|
// The keyring took the write, so it is authoritative for this account
|
|
188
|
-
// again: drop whatever
|
|
189
|
-
//
|
|
190
|
-
//
|
|
186
|
+
// again: drop whatever a failed-over session left in the fallback — a
|
|
187
|
+
// value, which would otherwise be read in preference to this write, or a
|
|
188
|
+
// tombstone, which would hide it. Best-effort: failing this cleanup must
|
|
191
189
|
// not fail a save that already succeeded.
|
|
192
190
|
try {
|
|
193
191
|
this.fallbackStore.delete(account);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover.js","sourceRoot":"","sources":["../../src/failover.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"failover.js","sourceRoot":"","sources":["../../src/failover.ts"],"names":[],"mappings":"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"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* call {@link createCredentialsStore} and get a {@link CredentialsStore} —
|
|
6
6
|
* they never learn which backend is serving. The factory probes backends in
|
|
7
7
|
* priority order (OS keyring first, process memory last) and returns the
|
|
8
|
-
* first that answers
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* first that answers, so a backend can be added to the chain without any
|
|
9
|
+
* caller changing. A keyring that answers the probe but later rejects writes
|
|
10
|
+
* fails over to the next backend on first failure.
|
|
11
11
|
*
|
|
12
12
|
* This is a tool library, not a DSH plugin — no `dsh.client`, no
|
|
13
13
|
* `cordis.patch.yml`, no `apply`. DSH's own `ctx.credentials` is untouched;
|
|
@@ -64,7 +64,7 @@ export interface CredentialsStore {
|
|
|
64
64
|
export declare function createCredentialsStore(config?: CredentialsStoreConfig): CredentialsStore;
|
|
65
65
|
export { CREDENTIAL_SCOPE, CREDENTIALS_FILE_NAME, DEFAULT_SCOPE, KEYRING_SERVICE } from './scope.ts';
|
|
66
66
|
export { KeyringBackend, __setKeyringModule } from './backends/keyring.ts';
|
|
67
|
-
export { FingerprintBackend } from './backends/fingerprint.ts';
|
|
67
|
+
export { FingerprintBackend, UnreadableCredentialsFile } from './backends/fingerprint.ts';
|
|
68
68
|
export { MemoryBackend, __resetSharedMemoryBackend, sharedMemoryBackend } from './backends/memory.ts';
|
|
69
69
|
export { FailoverStore } from './failover.ts';
|
|
70
70
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACxC,8EAA8E;IAC9E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,0EAA0E;IAC1E,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,4FAA4F;IAC5F,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,sBAA2B,GAAG,gBAAgB,CAe5F;AAiBD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACxC,8EAA8E;IAC9E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,0EAA0E;IAC1E,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,4FAA4F;IAC5F,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,sBAA2B,GAAG,gBAAgB,CAe5F;AAiBD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
package/lib/types/index.js
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* call {@link createCredentialsStore} and get a {@link CredentialsStore} —
|
|
6
6
|
* they never learn which backend is serving. The factory probes backends in
|
|
7
7
|
* priority order (OS keyring first, process memory last) and returns the
|
|
8
|
-
* first that answers
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* first that answers, so a backend can be added to the chain without any
|
|
9
|
+
* caller changing. A keyring that answers the probe but later rejects writes
|
|
10
|
+
* fails over to the next backend on first failure.
|
|
11
11
|
*
|
|
12
12
|
* This is a tool library, not a DSH plugin — no `dsh.client`, no
|
|
13
13
|
* `cordis.patch.yml`, no `apply`. DSH's own `ctx.credentials` is untouched;
|
|
@@ -72,7 +72,7 @@ function createFallbackStore(config) {
|
|
|
72
72
|
}
|
|
73
73
|
export { CREDENTIAL_SCOPE, CREDENTIALS_FILE_NAME, DEFAULT_SCOPE, KEYRING_SERVICE } from "./scope.js";
|
|
74
74
|
export { KeyringBackend, __setKeyringModule } from "./backends/keyring.js";
|
|
75
|
-
export { FingerprintBackend } from "./backends/fingerprint.js";
|
|
75
|
+
export { FingerprintBackend, UnreadableCredentialsFile } from "./backends/fingerprint.js";
|
|
76
76
|
export { MemoryBackend, __resetSharedMemoryBackend, sharedMemoryBackend } from "./backends/memory.js";
|
|
77
77
|
export { FailoverStore } from "./failover.js";
|
|
78
78
|
//# sourceMappingURL=index.js.map
|
package/lib/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AA+B7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiC,EAAE;IACxE,MAAM,OAAO,GAAiC,CAAC,GAAG,EAAE;QAClD,IAAI,CAAC;YACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;YAC7D,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IACJ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,yEAAyE;QACzE,uEAAuE;QACvE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,qEAAqE;AACrE,SAAS,mBAAmB,CAAC,MAA8B;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,2EAA2E;IAC3E,4DAA4D;IAC5D,0BAA0B;IAC1B,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AA+B7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiC,EAAE;IACxE,MAAM,OAAO,GAAiC,CAAC,GAAG,EAAE;QAClD,IAAI,CAAC;YACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;YAC7D,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IACJ,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,yEAAyE;QACzE,uEAAuE;QACvE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1F,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,qEAAqE;AACrE,SAAS,mBAAmB,CAAC,MAA8B;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,2EAA2E;IAC3E,4DAA4D;IAC5D,0BAA0B;IAC1B,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
package/lib/types/paths.d.ts
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where per-host state lives. One definition, shared.
|
|
3
3
|
*
|
|
4
|
-
* ## Why
|
|
4
|
+
* ## Why one definition
|
|
5
5
|
*
|
|
6
6
|
* `DSH_HOME` is the host's data directory, and two things in this repo derive
|
|
7
7
|
* from it: the encrypted credentials file here, and the terraform cache in
|
|
8
|
-
* `aishell-deploy`.
|
|
9
|
-
*
|
|
8
|
+
* `aishell-deploy`. Two resolutions of the same variable can disagree — a
|
|
9
|
+
* trailing-slash difference, a different fallback — and the result is state
|
|
10
|
+
* written to one directory and looked for in another. One definition makes that
|
|
11
|
+
* impossible.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
* depends on this
|
|
13
|
-
* the reverse would be a cycle.
|
|
14
|
-
* where the definition belongs.
|
|
13
|
+
* It sits in the lower of the two packages because the dependency graph runs
|
|
14
|
+
* that way: `aishell-deploy` already depends on this one, so a definition here
|
|
15
|
+
* is reachable from there, while the reverse would be a cycle.
|
|
15
16
|
*
|
|
16
17
|
* @module @huaweidevtools/aishell-dsh-credentials-store/paths
|
|
17
18
|
*/
|
|
@@ -19,8 +20,8 @@
|
|
|
19
20
|
* The fallback data directory when the host sets no `DSH_HOME`.
|
|
20
21
|
*
|
|
21
22
|
* `~/.aishell` — the same directory the desktop app uses, so a library or
|
|
22
|
-
* headless run
|
|
23
|
-
* second home directory.
|
|
23
|
+
* headless run lands where a real install keeps its state rather than creating
|
|
24
|
+
* a second home directory.
|
|
24
25
|
*/
|
|
25
26
|
export declare const FALLBACK_HOME_NAME = ".aishell";
|
|
26
27
|
/**
|
package/lib/types/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAIhC;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
package/lib/types/paths.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where per-host state lives. One definition, shared.
|
|
3
3
|
*
|
|
4
|
-
* ## Why
|
|
4
|
+
* ## Why one definition
|
|
5
5
|
*
|
|
6
6
|
* `DSH_HOME` is the host's data directory, and two things in this repo derive
|
|
7
7
|
* from it: the encrypted credentials file here, and the terraform cache in
|
|
8
|
-
* `aishell-deploy`.
|
|
9
|
-
*
|
|
8
|
+
* `aishell-deploy`. Two resolutions of the same variable can disagree — a
|
|
9
|
+
* trailing-slash difference, a different fallback — and the result is state
|
|
10
|
+
* written to one directory and looked for in another. One definition makes that
|
|
11
|
+
* impossible.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
* depends on this
|
|
13
|
-
* the reverse would be a cycle.
|
|
14
|
-
* where the definition belongs.
|
|
13
|
+
* It sits in the lower of the two packages because the dependency graph runs
|
|
14
|
+
* that way: `aishell-deploy` already depends on this one, so a definition here
|
|
15
|
+
* is reachable from there, while the reverse would be a cycle.
|
|
15
16
|
*
|
|
16
17
|
* @module @huaweidevtools/aishell-dsh-credentials-store/paths
|
|
17
18
|
*/
|
|
@@ -21,8 +22,8 @@ import { join } from 'node:path';
|
|
|
21
22
|
* The fallback data directory when the host sets no `DSH_HOME`.
|
|
22
23
|
*
|
|
23
24
|
* `~/.aishell` — the same directory the desktop app uses, so a library or
|
|
24
|
-
* headless run
|
|
25
|
-
* second home directory.
|
|
25
|
+
* headless run lands where a real install keeps its state rather than creating
|
|
26
|
+
* a second home directory.
|
|
26
27
|
*/
|
|
27
28
|
export const FALLBACK_HOME_NAME = '.aishell';
|
|
28
29
|
/**
|
package/lib/types/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAA;AAE5C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAA;IACvC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,UAAU,CAAA;IAC3E,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAA;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAA;AACvC,CAAC"}
|
package/lib/types/scope.d.ts
CHANGED
|
@@ -17,25 +17,25 @@
|
|
|
17
17
|
* | keyring service name | `aishell-dsh-plugins` |
|
|
18
18
|
* | encrypted file name | `plugins.credentials.enc` |
|
|
19
19
|
*
|
|
20
|
-
* ## Why it is
|
|
20
|
+
* ## Why it is a build-time constant
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
22
|
+
* The value has to be the same on both sides of a credential: the writer that
|
|
23
|
+
* stores it and the reader that looks it up. A runtime setting can be applied
|
|
24
|
+
* to one plugin and not another, and the result is a form that says "saved"
|
|
25
|
+
* beside tools that say "not authenticated" — a failure whose only symptom is
|
|
26
|
+
* the one thing the setting exists to control.
|
|
27
27
|
*
|
|
28
28
|
* A constant cannot be set on one side only. Two deployments that must not see
|
|
29
29
|
* each other's credentials (a staging profile beside a production one) differ
|
|
30
30
|
* by *building* differently, which is the honest place for a persistence
|
|
31
31
|
* boundary.
|
|
32
32
|
*
|
|
33
|
-
* ## Why
|
|
33
|
+
* ## Why the default namespace carries no migration path
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* a
|
|
35
|
+
* `plugins` is the first and only scope, so a build that sets nothing lands on
|
|
36
|
+
* it and a build that sets something has deliberately moved to a namespace of
|
|
37
|
+
* its own. There are no two names to reconcile, so there is no migration path
|
|
38
|
+
* to write — and none is needed until a release renames this default.
|
|
39
39
|
*
|
|
40
40
|
* @module @huaweidevtools/aishell-dsh-credentials-store/scope
|
|
41
41
|
*/
|