@spinajs/authn-keys 3.0.3 → 3.0.5

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 (178) hide show
  1. package/README.md +11 -3
  2. package/lib/cjs/cli/AddKey.d.ts +2 -2
  3. package/lib/cjs/cli/AddKey.d.ts.map +1 -1
  4. package/lib/cjs/cli/AddKey.js +2 -1
  5. package/lib/cjs/cli/AddKey.js.map +1 -1
  6. package/lib/cjs/cli/KeyCliCommand.d.ts +10 -0
  7. package/lib/cjs/cli/KeyCliCommand.d.ts.map +1 -0
  8. package/lib/cjs/{models/AuthnNonce.js → cli/KeyCliCommand.js} +14 -18
  9. package/lib/cjs/cli/KeyCliCommand.js.map +1 -0
  10. package/lib/cjs/cli/ListKeys.d.ts +2 -2
  11. package/lib/cjs/cli/ListKeys.d.ts.map +1 -1
  12. package/lib/cjs/cli/ListKeys.js +2 -1
  13. package/lib/cjs/cli/ListKeys.js.map +1 -1
  14. package/lib/cjs/cli/RevokeKey.d.ts +2 -2
  15. package/lib/cjs/cli/RevokeKey.d.ts.map +1 -1
  16. package/lib/cjs/cli/RevokeKey.js +2 -1
  17. package/lib/cjs/cli/RevokeKey.js.map +1 -1
  18. package/lib/cjs/cli/index.d.ts +1 -0
  19. package/lib/cjs/cli/index.d.ts.map +1 -1
  20. package/lib/cjs/cli/index.js +1 -0
  21. package/lib/cjs/cli/index.js.map +1 -1
  22. package/lib/cjs/index.d.ts +0 -1
  23. package/lib/cjs/index.d.ts.map +1 -1
  24. package/lib/cjs/index.js +0 -1
  25. package/lib/cjs/index.js.map +1 -1
  26. package/lib/cjs/jws/index.d.ts +1 -0
  27. package/lib/cjs/jws/index.d.ts.map +1 -1
  28. package/lib/cjs/jws/index.js +1 -0
  29. package/lib/cjs/jws/index.js.map +1 -1
  30. package/lib/cjs/jws/register.d.ts +18 -0
  31. package/lib/cjs/jws/register.d.ts.map +1 -0
  32. package/lib/cjs/jws/register.js +66 -0
  33. package/lib/cjs/jws/register.js.map +1 -0
  34. package/lib/cjs/models/index.d.ts +0 -1
  35. package/lib/cjs/models/index.d.ts.map +1 -1
  36. package/lib/cjs/models/index.js +0 -1
  37. package/lib/cjs/models/index.js.map +1 -1
  38. package/lib/cjs/options/options.d.ts +10 -0
  39. package/lib/cjs/options/options.d.ts.map +1 -1
  40. package/lib/cjs/options/options.js +9 -0
  41. package/lib/cjs/options/options.js.map +1 -1
  42. package/lib/cjs/registry/cache.d.ts +26 -0
  43. package/lib/cjs/registry/cache.d.ts.map +1 -0
  44. package/lib/cjs/registry/cache.js +73 -0
  45. package/lib/cjs/registry/cache.js.map +1 -0
  46. package/lib/cjs/registry/index.d.ts +1 -0
  47. package/lib/cjs/registry/index.d.ts.map +1 -1
  48. package/lib/cjs/registry/index.js +1 -0
  49. package/lib/cjs/registry/index.js.map +1 -1
  50. package/lib/cjs/registry/registry.d.ts +15 -2
  51. package/lib/cjs/registry/registry.d.ts.map +1 -1
  52. package/lib/cjs/registry/registry.js +35 -2
  53. package/lib/cjs/registry/registry.js.map +1 -1
  54. package/lib/cjs/schema.d.ts +40 -0
  55. package/lib/cjs/schema.d.ts.map +1 -1
  56. package/lib/cjs/schema.js +19 -0
  57. package/lib/cjs/schema.js.map +1 -1
  58. package/lib/cjs/strategies/assertion.d.ts +4 -5
  59. package/lib/cjs/strategies/assertion.d.ts.map +1 -1
  60. package/lib/cjs/strategies/assertion.js +6 -5
  61. package/lib/cjs/strategies/assertion.js.map +1 -1
  62. package/lib/cjs/strategies/httpsig.d.ts +5 -4
  63. package/lib/cjs/strategies/httpsig.d.ts.map +1 -1
  64. package/lib/cjs/strategies/httpsig.js +9 -5
  65. package/lib/cjs/strategies/httpsig.js.map +1 -1
  66. package/lib/cjs/strategies/index.d.ts +1 -0
  67. package/lib/cjs/strategies/index.d.ts.map +1 -1
  68. package/lib/cjs/strategies/index.js +1 -0
  69. package/lib/cjs/strategies/index.js.map +1 -1
  70. package/lib/cjs/strategies/keys.d.ts +3 -1
  71. package/lib/cjs/strategies/keys.d.ts.map +1 -1
  72. package/lib/cjs/strategies/keys.js +9 -0
  73. package/lib/cjs/strategies/keys.js.map +1 -1
  74. package/lib/cjs/strategies/nonce-key.d.ts +3 -0
  75. package/lib/cjs/strategies/nonce-key.d.ts.map +1 -0
  76. package/lib/cjs/strategies/nonce-key.js +8 -0
  77. package/lib/cjs/strategies/nonce-key.js.map +1 -0
  78. package/lib/mjs/cli/AddKey.d.ts +2 -2
  79. package/lib/mjs/cli/AddKey.d.ts.map +1 -1
  80. package/lib/mjs/cli/AddKey.js +3 -2
  81. package/lib/mjs/cli/AddKey.js.map +1 -1
  82. package/lib/mjs/cli/KeyCliCommand.d.ts +10 -0
  83. package/lib/mjs/cli/KeyCliCommand.d.ts.map +1 -0
  84. package/lib/mjs/{models/AuthnNonce.js → cli/KeyCliCommand.js} +13 -18
  85. package/lib/mjs/cli/KeyCliCommand.js.map +1 -0
  86. package/lib/mjs/cli/ListKeys.d.ts +2 -2
  87. package/lib/mjs/cli/ListKeys.d.ts.map +1 -1
  88. package/lib/mjs/cli/ListKeys.js +3 -2
  89. package/lib/mjs/cli/ListKeys.js.map +1 -1
  90. package/lib/mjs/cli/RevokeKey.d.ts +2 -2
  91. package/lib/mjs/cli/RevokeKey.d.ts.map +1 -1
  92. package/lib/mjs/cli/RevokeKey.js +3 -2
  93. package/lib/mjs/cli/RevokeKey.js.map +1 -1
  94. package/lib/mjs/cli/index.d.ts +1 -0
  95. package/lib/mjs/cli/index.d.ts.map +1 -1
  96. package/lib/mjs/cli/index.js +1 -0
  97. package/lib/mjs/cli/index.js.map +1 -1
  98. package/lib/mjs/index.d.ts +0 -1
  99. package/lib/mjs/index.d.ts.map +1 -1
  100. package/lib/mjs/index.js +0 -1
  101. package/lib/mjs/index.js.map +1 -1
  102. package/lib/mjs/jws/index.d.ts +1 -0
  103. package/lib/mjs/jws/index.d.ts.map +1 -1
  104. package/lib/mjs/jws/index.js +1 -0
  105. package/lib/mjs/jws/index.js.map +1 -1
  106. package/lib/mjs/jws/register.d.ts +18 -0
  107. package/lib/mjs/jws/register.d.ts.map +1 -0
  108. package/lib/mjs/jws/register.js +62 -0
  109. package/lib/mjs/jws/register.js.map +1 -0
  110. package/lib/mjs/models/index.d.ts +0 -1
  111. package/lib/mjs/models/index.d.ts.map +1 -1
  112. package/lib/mjs/models/index.js +0 -1
  113. package/lib/mjs/models/index.js.map +1 -1
  114. package/lib/mjs/options/options.d.ts +10 -0
  115. package/lib/mjs/options/options.d.ts.map +1 -1
  116. package/lib/mjs/options/options.js +8 -0
  117. package/lib/mjs/options/options.js.map +1 -1
  118. package/lib/mjs/registry/cache.d.ts +26 -0
  119. package/lib/mjs/registry/cache.d.ts.map +1 -0
  120. package/lib/mjs/registry/cache.js +69 -0
  121. package/lib/mjs/registry/cache.js.map +1 -0
  122. package/lib/mjs/registry/index.d.ts +1 -0
  123. package/lib/mjs/registry/index.d.ts.map +1 -1
  124. package/lib/mjs/registry/index.js +1 -0
  125. package/lib/mjs/registry/index.js.map +1 -1
  126. package/lib/mjs/registry/registry.d.ts +15 -2
  127. package/lib/mjs/registry/registry.d.ts.map +1 -1
  128. package/lib/mjs/registry/registry.js +37 -4
  129. package/lib/mjs/registry/registry.js.map +1 -1
  130. package/lib/mjs/schema.d.ts +40 -0
  131. package/lib/mjs/schema.d.ts.map +1 -1
  132. package/lib/mjs/schema.js +19 -0
  133. package/lib/mjs/schema.js.map +1 -1
  134. package/lib/mjs/strategies/assertion.d.ts +4 -5
  135. package/lib/mjs/strategies/assertion.d.ts.map +1 -1
  136. package/lib/mjs/strategies/assertion.js +7 -6
  137. package/lib/mjs/strategies/assertion.js.map +1 -1
  138. package/lib/mjs/strategies/httpsig.d.ts +5 -4
  139. package/lib/mjs/strategies/httpsig.d.ts.map +1 -1
  140. package/lib/mjs/strategies/httpsig.js +10 -6
  141. package/lib/mjs/strategies/httpsig.js.map +1 -1
  142. package/lib/mjs/strategies/index.d.ts +1 -0
  143. package/lib/mjs/strategies/index.d.ts.map +1 -1
  144. package/lib/mjs/strategies/index.js +1 -0
  145. package/lib/mjs/strategies/index.js.map +1 -1
  146. package/lib/mjs/strategies/keys.d.ts +3 -1
  147. package/lib/mjs/strategies/keys.d.ts.map +1 -1
  148. package/lib/mjs/strategies/keys.js +8 -0
  149. package/lib/mjs/strategies/keys.js.map +1 -1
  150. package/lib/mjs/strategies/nonce-key.d.ts +3 -0
  151. package/lib/mjs/strategies/nonce-key.d.ts.map +1 -0
  152. package/lib/mjs/strategies/nonce-key.js +4 -0
  153. package/lib/mjs/strategies/nonce-key.js.map +1 -0
  154. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  155. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  156. package/package.json +20 -11
  157. package/lib/cjs/models/AuthnNonce.d.ts +0 -8
  158. package/lib/cjs/models/AuthnNonce.d.ts.map +0 -1
  159. package/lib/cjs/models/AuthnNonce.js.map +0 -1
  160. package/lib/cjs/nonce/index.d.ts +0 -2
  161. package/lib/cjs/nonce/index.d.ts.map +0 -1
  162. package/lib/cjs/nonce/index.js +0 -18
  163. package/lib/cjs/nonce/index.js.map +0 -1
  164. package/lib/cjs/nonce/store.d.ts +0 -22
  165. package/lib/cjs/nonce/store.d.ts.map +0 -1
  166. package/lib/cjs/nonce/store.js +0 -98
  167. package/lib/cjs/nonce/store.js.map +0 -1
  168. package/lib/mjs/models/AuthnNonce.d.ts +0 -8
  169. package/lib/mjs/models/AuthnNonce.d.ts.map +0 -1
  170. package/lib/mjs/models/AuthnNonce.js.map +0 -1
  171. package/lib/mjs/nonce/index.d.ts +0 -2
  172. package/lib/mjs/nonce/index.d.ts.map +0 -1
  173. package/lib/mjs/nonce/index.js +0 -2
  174. package/lib/mjs/nonce/index.js.map +0 -1
  175. package/lib/mjs/nonce/store.d.ts +0 -22
  176. package/lib/mjs/nonce/store.d.ts.map +0 -1
  177. package/lib/mjs/nonce/store.js +0 -92
  178. package/lib/mjs/nonce/store.js.map +0 -1
package/README.md CHANGED
@@ -24,8 +24,15 @@ The registry and the strategies get their dependencies through DI. Tests
24
24
  build them with `new`, passing the dependencies in one object, e.g.
25
25
  `new DefaultKeyRegistry({ store, secrets, throttle, options })` or
26
26
  `new HttpSignatureStrategy({ registry, nonces, options })`. `OrmKeyStore`
27
- and `DbKeyNonceStore` inject the `Orm`, so the `authn:key-*` commands bring
28
- the database up on their own.
27
+ injects the `Orm`, so the `authn:key-*` commands bring the database up on
28
+ their own.
29
+
30
+ `JwsAssertionStrategy` and `HttpSignatureStrategy` claim each `jti` and
31
+ signature nonce in the core `NonceStore` (`@spinajs/authn/contracts`). Only
32
+ `@spinajs/authn-orm` registers one (`DbNonceStore`), so import it, or register
33
+ your own `NonceStore`; without one the strategies fail at boot with an error
34
+ naming `@spinajs/authn-orm`. `MemoryNonceStore` from `@spinajs/authn/nonces`
35
+ is for tests and single-process apps, and is not registered for you.
29
36
 
30
37
  ## Challenges
31
38
 
@@ -146,7 +153,8 @@ unknown key with the same work and result as a bad signature, throttles by
146
153
  | `httpSignature.skewSeconds` | `30` |
147
154
  | `httpSignature.requiredComponents` | `['@method', '@target-uri', 'content-digest']` |
148
155
 
149
- `authn_nonce` comes with `@spinajs/authn-orm`'s `AuthnInitial` migration.
156
+ `authn_nonce` and the `NonceStore` that fills it (`DbNonceStore`) come with
157
+ `@spinajs/authn-orm`; this package has no nonce table or model of its own.
150
158
 
151
159
  List the strategies an app uses in `authn.strategies`; `service` is the
152
160
  class name:
@@ -1,6 +1,6 @@
1
- import { CliCommand } from '@spinajs/cli';
2
1
  import { Log } from '@spinajs/log';
3
2
  import { KeyRegistry } from '@spinajs/authn/contracts';
3
+ import { KeyCliCommand } from './KeyCliCommand.js';
4
4
  interface AddKeyOptions {
5
5
  jwk?: string;
6
6
  file?: string;
@@ -9,7 +9,7 @@ interface AddKeyOptions {
9
9
  expires?: string;
10
10
  }
11
11
  /** Services and agents only: a user registers a key with a proof of possession, which the CLI cannot give. */
12
- export declare class AddKey extends CliCommand {
12
+ export declare class AddKey extends KeyCliCommand {
13
13
  protected Log: Log;
14
14
  protected Registry: KeyRegistry;
15
15
  execute(ownerType: string, ownerId: string, options: AddKeyOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"AddKey.d.ts","sourceRoot":"","sources":["../../../src/cli/AddKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,UAAU,EAAmB,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,WAAW,EAAc,MAAM,0BAA0B,CAAC;AAK9E,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8GAA8G;AAC9G,qBAQa,MAAO,SAAQ,UAAU;IAEpC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9F;CACF"}
1
+ {"version":3,"file":"AddKey.d.ts","sourceRoot":"","sources":["../../../src/cli/AddKey.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,WAAW,EAAc,MAAM,0BAA0B,CAAC;AAI9E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8GAA8G;AAC9G,qBAQa,MAAO,SAAQ,aAAa;IAEvC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9F;CACF"}
@@ -16,8 +16,9 @@ const log_1 = require("@spinajs/log");
16
16
  const contracts_1 = require("@spinajs/authn/contracts");
17
17
  const exceptions_1 = require("@spinajs/exceptions");
18
18
  const common_js_1 = require("./common.js");
19
+ const KeyCliCommand_js_1 = require("./KeyCliCommand.js");
19
20
  /** Services and agents only: a user registers a key with a proof of possession, which the CLI cannot give. */
20
- let AddKey = class AddKey extends cli_1.CliCommand {
21
+ let AddKey = class AddKey extends KeyCliCommand_js_1.KeyCliCommand {
21
22
  async execute(ownerType, ownerId, options) {
22
23
  const owner = (0, common_js_1.ownerArg)(ownerType, ownerId);
23
24
  if (owner.type === 'user') {
@@ -1 +1 @@
1
- {"version":3,"file":"AddKey.js","sourceRoot":"","sources":["../../../src/cli/AddKey.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AddKey.js","sourceRoot":"","sources":["../../../src/cli/AddKey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { CliCommand } from '@spinajs/cli';
2
+ import { OrmMigrator } from '@spinajs/orm';
3
+ /**
4
+ * The cli resolves only the command it runs, so the command boots the Orm and the `Migration.OnStartup` pass that
5
+ * creates the key tables, as an app process does; model queries on such a connection throw until that pass ran.
6
+ */
7
+ export declare abstract class KeyCliCommand extends CliCommand {
8
+ protected Migrator: OrmMigrator;
9
+ }
10
+ //# sourceMappingURL=KeyCliCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyCliCommand.d.ts","sourceRoot":"","sources":["../../../src/cli/KeyCliCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,8BAAsB,aAAc,SAAQ,UAAU;IAEpD,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;CACjC"}
@@ -9,23 +9,19 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AuthnNonce = void 0;
12
+ exports.KeyCliCommand = void 0;
13
+ const cli_1 = require("@spinajs/cli");
14
+ const di_1 = require("@spinajs/di");
13
15
  const orm_1 = require("@spinajs/orm");
14
- const luxon_1 = require("luxon");
15
- /** A row of authn_nonce (design §22.16; the table comes with authn-orm's AuthnInitial migration). */
16
- let AuthnNonce = class AuthnNonce extends orm_1.ModelBase {
17
- };
18
- exports.AuthnNonce = AuthnNonce;
19
- __decorate([
20
- (0, orm_1.Primary)(),
21
- __metadata("design:type", String)
22
- ], AuthnNonce.prototype, "k", void 0);
16
+ /**
17
+ * The cli resolves only the command it runs, so the command boots the Orm and the `Migration.OnStartup` pass that
18
+ * creates the key tables, as an app process does; model queries on such a connection throw until that pass ran.
19
+ */
20
+ class KeyCliCommand extends cli_1.CliCommand {
21
+ }
22
+ exports.KeyCliCommand = KeyCliCommand;
23
23
  __decorate([
24
- (0, orm_1.DateTime)(),
25
- __metadata("design:type", luxon_1.DateTime)
26
- ], AuthnNonce.prototype, "expires_at", void 0);
27
- exports.AuthnNonce = AuthnNonce = __decorate([
28
- (0, orm_1.Connection)('default'),
29
- (0, orm_1.Model)('authn_nonce')
30
- ], AuthnNonce);
31
- //# sourceMappingURL=AuthnNonce.js.map
24
+ (0, di_1.Autoinject)(orm_1.OrmMigrator),
25
+ __metadata("design:type", orm_1.OrmMigrator)
26
+ ], KeyCliCommand.prototype, "Migrator", void 0);
27
+ //# sourceMappingURL=KeyCliCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyCliCommand.js","sourceRoot":"","sources":["../../../src/cli/KeyCliCommand.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAA0C;AAC1C,oCAAyC;AACzC,sCAA2C;AAE3C;;;GAGG;AACH,mBAAoC,SAAQ,gBAAU;CAGrD;;AADW;IADT,IAAA,eAAU,EAAC,iBAAW,CAAC;8BACJ,iBAAW;+CAAC"}
@@ -1,9 +1,9 @@
1
- import { CliCommand } from '@spinajs/cli';
2
1
  import { Log } from '@spinajs/log';
3
2
  import { KeyRegistry } from '@spinajs/authn/contracts';
4
3
  import type { KeyRecord } from '@spinajs/authn/contracts';
4
+ import { KeyCliCommand } from './KeyCliCommand.js';
5
5
  export declare function keyLine(k: KeyRecord): string;
6
- export declare class ListKeys extends CliCommand {
6
+ export declare class ListKeys extends KeyCliCommand {
7
7
  protected Log: Log;
8
8
  protected Registry: KeyRegistry;
9
9
  execute(ownerType: string, ownerId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"ListKeys.d.ts","sourceRoot":"","sources":["../../../src/cli/ListKeys.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,UAAU,EAAW,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAK1D,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAE5C;AAED,qBAGa,QAAS,SAAQ,UAAU;IAEtC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtE;CACF"}
1
+ {"version":3,"file":"ListKeys.d.ts","sourceRoot":"","sources":["../../../src/cli/ListKeys.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAE5C;AAED,qBAGa,QAAS,SAAQ,aAAa;IAEzC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtE;CACF"}
@@ -16,11 +16,12 @@ const cli_1 = require("@spinajs/cli");
16
16
  const log_1 = require("@spinajs/log");
17
17
  const contracts_1 = require("@spinajs/authn/contracts");
18
18
  const common_js_1 = require("./common.js");
19
+ const KeyCliCommand_js_1 = require("./KeyCliCommand.js");
19
20
  const iso = (d) => (d ? d.toISOString() : '-');
20
21
  function keyLine(k) {
21
22
  return [k.kid, k.alg, k.name ?? '-', `created ${iso(k.createdAt)}`, `expires ${iso(k.expiresAt)}`, `revoked ${iso(k.revokedAt)}`, `last used ${iso(k.lastUsedAt)}`].join(' ');
22
23
  }
23
- let ListKeys = class ListKeys extends cli_1.CliCommand {
24
+ let ListKeys = class ListKeys extends KeyCliCommand_js_1.KeyCliCommand {
24
25
  async execute(ownerType, ownerId) {
25
26
  const keys = await this.Registry.list((0, common_js_1.ownerArg)(ownerType, ownerId));
26
27
  if (keys.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"ListKeys.js","sourceRoot":"","sources":["../../../src/cli/ListKeys.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAA6D;AAC7D,sCAA2C;AAC3C,wDAAuD;AAEvD,2CAAoD;AAEpD,MAAM,GAAG,GAAG,CAAC,CAAQ,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE9D,iBAAwB,CAAY;IAClC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjL,CAAC;AAKM,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,gBAAU;IAO/B,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAA,oBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;CACF,CAAA;;AAdW;IADT,IAAA,YAAM,EAAC,YAAY,CAAC;8BACN,SAAG;qCAAC;AAGT;IADT,IAAA,eAAU,EAAC,uBAAW,CAAC;8BACJ,uBAAW;0CAAC;mBALrB,QAAQ;IAHpB,IAAA,aAAO,EAAC,gBAAgB,EAAE,2FAA2F,CAAC;IACtH,IAAA,cAAQ,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAW,EAAE,CAAC;IAC1G,IAAA,cAAQ,EAAC,SAAS,EAAE,IAAI,EAAE,wCAAwC,CAAC;GACvD,QAAQ,CAgBpB"}
1
+ {"version":3,"file":"ListKeys.js","sourceRoot":"","sources":["../../../src/cli/ListKeys.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAAiD;AACjD,sCAA2C;AAC3C,wDAAuD;AAEvD,2CAAoD;AACpD,yDAAmD;AAEnD,MAAM,GAAG,GAAG,CAAC,CAAQ,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE9D,iBAAwB,CAAY;IAClC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjL,CAAC;AAKM,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,gCAAa;IAOlC,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAA,oBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;CACF,CAAA;;AAdW;IADT,IAAA,YAAM,EAAC,YAAY,CAAC;8BACN,SAAG;qCAAC;AAGT;IADT,IAAA,eAAU,EAAC,uBAAW,CAAC;8BACJ,uBAAW;0CAAC;mBALrB,QAAQ;IAHpB,IAAA,aAAO,EAAC,gBAAgB,EAAE,2FAA2F,CAAC;IACtH,IAAA,cAAQ,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAW,EAAE,CAAC;IAC1G,IAAA,cAAQ,EAAC,SAAS,EAAE,IAAI,EAAE,wCAAwC,CAAC;GACvD,QAAQ,CAgBpB"}
@@ -1,7 +1,7 @@
1
- import { CliCommand } from '@spinajs/cli';
2
1
  import { Log } from '@spinajs/log';
3
2
  import { KeyRegistry } from '@spinajs/authn/contracts';
4
- export declare class RevokeKey extends CliCommand {
3
+ import { KeyCliCommand } from './KeyCliCommand.js';
4
+ export declare class RevokeKey extends KeyCliCommand {
5
5
  protected Log: Log;
6
6
  protected Registry: KeyRegistry;
7
7
  execute(ownerType: string, ownerId: string, kid: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"RevokeKey.d.ts","sourceRoot":"","sources":["../../../src/cli/RevokeKey.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,UAAU,EAAW,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,WAAW,EAAc,MAAM,0BAA0B,CAAC;AAI9E,qBAIa,SAAU,SAAQ,UAAU;IAEvC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;CACF"}
1
+ {"version":3,"file":"RevokeKey.d.ts","sourceRoot":"","sources":["../../../src/cli/RevokeKey.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,WAAW,EAAc,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAIa,SAAU,SAAQ,aAAa;IAE1C,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAEnB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;CACF"}
@@ -16,7 +16,8 @@ const log_1 = require("@spinajs/log");
16
16
  const contracts_1 = require("@spinajs/authn/contracts");
17
17
  const exceptions_1 = require("@spinajs/exceptions");
18
18
  const common_js_1 = require("./common.js");
19
- let RevokeKey = class RevokeKey extends cli_1.CliCommand {
19
+ const KeyCliCommand_js_1 = require("./KeyCliCommand.js");
20
+ let RevokeKey = class RevokeKey extends KeyCliCommand_js_1.KeyCliCommand {
20
21
  async execute(ownerType, ownerId, kid) {
21
22
  if (!(await this.Registry.revoke((0, common_js_1.ownerArg)(ownerType, ownerId), kid, (0, contracts_1.cliContext)(), { actor: contracts_1.CLI_ACTOR }))) {
22
23
  throw new exceptions_1.InvalidArgument(`no key ${kid} of ${ownerType} ${ownerId}`);
@@ -1 +1 @@
1
- {"version":3,"file":"RevokeKey.js","sourceRoot":"","sources":["../../../src/cli/RevokeKey.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAA6D;AAC7D,sCAA2C;AAC3C,wDAA8E;AAC9E,oDAAsD;AACtD,2CAAoD;AAM7C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,gBAAU;IAOhC,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe,EAAE,GAAW;QAClE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAA,oBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,IAAA,sBAAU,GAAE,EAAE,EAAE,KAAK,EAAE,qBAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACzG,MAAM,IAAI,4BAAe,CAAC,UAAU,GAAG,OAAO,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;;AAXW;IADT,IAAA,YAAM,EAAC,YAAY,CAAC;8BACN,SAAG;sCAAC;AAGT;IADT,IAAA,eAAU,EAAC,uBAAW,CAAC;8BACJ,uBAAW;2CAAC;oBALrB,SAAS;IAJrB,IAAA,aAAO,EAAC,kBAAkB,EAAE,oDAAoD,CAAC;IACjF,IAAA,cAAQ,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAW,EAAE,CAAC;IAC1G,IAAA,cAAQ,EAAC,SAAS,EAAE,IAAI,EAAE,wCAAwC,CAAC;IACnE,IAAA,cAAQ,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;GACnB,SAAS,CAarB"}
1
+ {"version":3,"file":"RevokeKey.js","sourceRoot":"","sources":["../../../src/cli/RevokeKey.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAAiD;AACjD,sCAA2C;AAC3C,wDAA8E;AAC9E,oDAAsD;AACtD,2CAAoD;AACpD,yDAAmD;AAM5C,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,gCAAa;IAOnC,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAe,EAAE,GAAW;QAClE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAA,oBAAQ,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,IAAA,sBAAU,GAAE,EAAE,EAAE,KAAK,EAAE,qBAAS,EAAE,CAAC,CAAC,EAAE,CAAC;YACzG,MAAM,IAAI,4BAAe,CAAC,UAAU,GAAG,OAAO,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;;AAXW;IADT,IAAA,YAAM,EAAC,YAAY,CAAC;8BACN,SAAG;sCAAC;AAGT;IADT,IAAA,eAAU,EAAC,uBAAW,CAAC;8BACJ,uBAAW;2CAAC;oBALrB,SAAS;IAJrB,IAAA,aAAO,EAAC,kBAAkB,EAAE,oDAAoD,CAAC;IACjF,IAAA,cAAQ,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,uBAAW,EAAE,CAAC;IAC1G,IAAA,cAAQ,EAAC,SAAS,EAAE,IAAI,EAAE,wCAAwC,CAAC;IACnE,IAAA,cAAQ,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;GACnB,SAAS,CAarB"}
@@ -1,4 +1,5 @@
1
1
  export * from './common.js';
2
+ export * from './KeyCliCommand.js';
2
3
  export * from './AddKey.js';
3
4
  export * from './ListKeys.js';
4
5
  export * from './RevokeKey.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./common.js"), exports);
18
+ __exportStar(require("./KeyCliCommand.js"), exports);
18
19
  __exportStar(require("./AddKey.js"), exports);
19
20
  __exportStar(require("./ListKeys.js"), exports);
20
21
  __exportStar(require("./RevokeKey.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,8CAA4B;AAC5B,gDAA8B;AAC9B,iDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,qDAAmC;AACnC,8CAA4B;AAC5B,gDAA8B;AAC9B,iDAA+B"}
@@ -5,7 +5,6 @@ export * from './models/index.js';
5
5
  export * from './migrations/index.js';
6
6
  export * from './registry/index.js';
7
7
  export * from './jws/index.js';
8
- export * from './nonce/index.js';
9
8
  export * from './strategies/index.js';
10
9
  export * from './httpsig/index.js';
11
10
  export * from './schema.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
package/lib/cjs/index.js CHANGED
@@ -21,7 +21,6 @@ __exportStar(require("./models/index.js"), exports);
21
21
  __exportStar(require("./migrations/index.js"), exports);
22
22
  __exportStar(require("./registry/index.js"), exports);
23
23
  __exportStar(require("./jws/index.js"), exports);
24
- __exportStar(require("./nonce/index.js"), exports);
25
24
  __exportStar(require("./strategies/index.js"), exports);
26
25
  __exportStar(require("./httpsig/index.js"), exports);
27
26
  __exportStar(require("./schema.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,uDAAqC;AACrC,qDAAmC;AACnC,oDAAkC;AAClC,wDAAsC;AACtC,sDAAoC;AACpC,iDAA+B;AAC/B,mDAAiC;AACjC,wDAAsC;AACtC,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,uDAAqC;AACrC,qDAAmC;AACnC,oDAAkC;AAClC,wDAAsC;AACtC,sDAAoC;AACpC,iDAA+B;AAC/B,wDAAsC;AACtC,qDAAmC;AACnC,8CAA4B;AAC5B,iDAA+B"}
@@ -1,4 +1,5 @@
1
1
  export * from './json.js';
2
2
  export * from './verifier.js';
3
3
  export * from './signer.js';
4
+ export * from './register.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jws/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jws/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./json.js"), exports);
18
18
  __exportStar(require("./verifier.js"), exports);
19
19
  __exportStar(require("./signer.js"), exports);
20
+ __exportStar(require("./register.js"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,gDAA8B;AAC9B,8CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/jws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,gDAA8B;AAC9B,8CAA4B;AAC5B,gDAA8B"}
@@ -0,0 +1,18 @@
1
+ import { Bootstrapper } from '@spinajs/di';
2
+ import type { IContainer } from '@spinajs/di';
3
+ import '../register-schema.js';
4
+ import { LocalJwsSigner } from './signer.js';
5
+ /** `authn.keys.signer`. */
6
+ export interface SignerConfig {
7
+ readonly current: string;
8
+ /** Secret references the configuration resolves to private JWKs as JSON text. */
9
+ readonly keys: readonly string[];
10
+ }
11
+ /** Registers a JwsSigner built from `authn.keys.signer` in `container`; null, and nothing registered, when it is null. */
12
+ export declare function registerJwsSigner(container: IContainer): Promise<LocalJwsSigner | null>;
13
+ /** Registers the configured JwsSigner at boot, so the JWKS route and the verifiers' key lookup find it. */
14
+ export declare class AuthnKeysSignerBootstrapper extends Bootstrapper {
15
+ protected Container: IContainer;
16
+ bootstrap(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/jws/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAyB,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,2BAA2B;AAC3B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAgBD,0HAA0H;AAC1H,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAe7F;AAED,2GAA2G;AAC3G,qBACa,2BAA4B,SAAQ,YAAY;IAE3D,SAAS,CAAC,SAAS,EAAG,UAAU,CAAC;IAEpB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;CACF"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AuthnKeysSignerBootstrapper = void 0;
13
+ exports.registerJwsSigner = registerJwsSigner;
14
+ const di_1 = require("@spinajs/di");
15
+ const configuration_1 = require("@spinajs/configuration");
16
+ const contracts_1 = require("@spinajs/authn/contracts");
17
+ const exceptions_1 = require("@spinajs/exceptions");
18
+ const util_1 = require("@spinajs/util");
19
+ require("../register-schema.js");
20
+ const signer_js_1 = require("./signer.js");
21
+ // The error names the position only: the text is a private key.
22
+ function privateJwkOf(secret, index) {
23
+ let jwk;
24
+ try {
25
+ jwk = JSON.parse(secret);
26
+ }
27
+ catch {
28
+ jwk = undefined;
29
+ }
30
+ if (!(0, util_1.isPlainObject)(jwk)) {
31
+ throw new exceptions_1.InvalidOption(`authn.keys.signer.keys.${index} does not resolve to a private JWK as a JSON object`);
32
+ }
33
+ return jwk;
34
+ }
35
+ /** Registers a JwsSigner built from `authn.keys.signer` in `container`; null, and nothing registered, when it is null. */
36
+ async function registerJwsSigner(container) {
37
+ const configuration = await container.resolve(configuration_1.Configuration);
38
+ const config = configuration.get('authn.keys.signer', null);
39
+ if (!config) {
40
+ return null;
41
+ }
42
+ let signer;
43
+ try {
44
+ signer = new signer_js_1.LocalJwsSigner(config.keys.map(privateJwkOf), { current: config.current });
45
+ }
46
+ catch (e) {
47
+ throw e instanceof exceptions_1.InvalidArgument ? new exceptions_1.InvalidOption(`authn.keys.signer: ${e.message}`) : e;
48
+ }
49
+ container.register({ ConfiguredJwsSigner: () => signer }.ConfiguredJwsSigner).as(contracts_1.JwsSigner);
50
+ return signer;
51
+ }
52
+ /** Registers the configured JwsSigner at boot, so the JWKS route and the verifiers' key lookup find it. */
53
+ let AuthnKeysSignerBootstrapper = class AuthnKeysSignerBootstrapper extends di_1.Bootstrapper {
54
+ async bootstrap() {
55
+ await registerJwsSigner(this.Container);
56
+ }
57
+ };
58
+ exports.AuthnKeysSignerBootstrapper = AuthnKeysSignerBootstrapper;
59
+ __decorate([
60
+ (0, di_1.Autoinject)(di_1.Container),
61
+ __metadata("design:type", Object)
62
+ ], AuthnKeysSignerBootstrapper.prototype, "Container", void 0);
63
+ exports.AuthnKeysSignerBootstrapper = AuthnKeysSignerBootstrapper = __decorate([
64
+ (0, di_1.Injectable)(di_1.Bootstrapper)
65
+ ], AuthnKeysSignerBootstrapper);
66
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/jws/register.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,oCAA8E;AAE9E,0DAAuD;AACvD,wDAAqD;AACrD,oDAAqE;AACrE,wCAA8C;AAE9C,iCAA+B;AAC/B,2CAA6C;AAU7C,gEAAgE;AAChE,SAAS,YAAY,CAAC,MAAc,EAAE,KAAa;IACjD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,IAAA,oBAAa,EAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,0BAAa,CAAC,0BAA0B,KAAK,qDAAqD,CAAC,CAAC;IAChH,CAAC;IACD,OAAO,GAA4B,CAAC;AACtC,CAAC;AAED,0HAA0H;AACnH,KAAK,4BAA4B,SAAqB;IAC3D,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,6BAAa,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAsB,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,0BAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,YAAY,4BAAe,CAAC,CAAC,CAAC,IAAI,0BAAa,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,SAAS,CAAC,QAAQ,CAAC,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,qBAAS,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2GAA2G;AAEpG,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,iBAAY;IAIpD,KAAK,CAAC,SAAS;QACpB,MAAM,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;CACF,CAAA;;AALW;IADT,IAAA,eAAU,EAAC,cAAS,CAAC;;8DACW;sCAFtB,2BAA2B;IADvC,IAAA,eAAU,EAAC,iBAAY,CAAC;GACZ,2BAA2B,CAOvC"}
@@ -1,3 +1,2 @@
1
1
  export * from './AuthnKey.js';
2
- export * from './AuthnNonce.js';
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -15,5 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./AuthnKey.js"), exports);
18
- __exportStar(require("./AuthnNonce.js"), exports);
19
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B"}
@@ -17,7 +17,16 @@ export interface KeysConfig {
17
17
  readonly skewSeconds: number;
18
18
  readonly requiredComponents: readonly string[];
19
19
  };
20
+ /** Absent: {@link DEFAULT_KEY_CACHE}. */
21
+ readonly cache?: KeyCacheOptions;
20
22
  }
23
+ /** `authn.keys.cache`: how long `KeyRegistry.byId` serves a key from memory. */
24
+ export interface KeyCacheOptions {
25
+ /** 0 turns the cache off. */
26
+ readonly ttlSeconds: number;
27
+ readonly maxEntries: number;
28
+ }
29
+ export declare const DEFAULT_KEY_CACHE: KeyCacheOptions;
21
30
  /** `authn.keys` (design §22.5) after defaults. */
22
31
  export interface KeysOptions {
23
32
  readonly algorithms: readonly KeyAlgorithm[];
@@ -38,6 +47,7 @@ export interface KeysOptions {
38
47
  readonly skewSeconds: number;
39
48
  readonly requiredComponents: readonly string[];
40
49
  };
50
+ readonly cache: KeyCacheOptions;
41
51
  }
42
52
  /**
43
53
  * The options of a validated `authn.keys`: frozen, with the challenge audience falling back to the assertion audience.
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/options/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACtF,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClJ,QAAQ,CAAC,aAAa,EAAE;QAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC1I;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,iHAAiH;QACjH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,gEAAgE;QAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;KAChD,CAAC;CACH;AAuBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAc7D"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/options/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACtF,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClJ,QAAQ,CAAC,aAAa,EAAE;QAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IACzI,yCAAyC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAuE,CAAC;AAExG,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,iHAAiH;QACjH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,gEAAgE;QAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;KAChD,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;CACjC;AA6BD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAe7D"}
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_KEY_CACHE = void 0;
3
4
  exports.keysOptionsOf = keysOptionsOf;
4
5
  const exceptions_1 = require("@spinajs/exceptions");
6
+ exports.DEFAULT_KEY_CACHE = Object.freeze({ ttlSeconds: 10, maxEntries: 10_000 });
5
7
  const derived = new WeakMap();
6
8
  const RANGES = [
7
9
  ['challenge', 'ttlSeconds', 1, 3600],
@@ -19,6 +21,12 @@ function checkRanges(config) {
19
21
  throw new exceptions_1.InvalidOption(`authn.keys.${block}.${key} must be an integer from ${min} to ${max}`);
20
22
  }
21
23
  }
24
+ if (config.cache !== undefined) {
25
+ const { ttlSeconds, maxEntries } = config.cache;
26
+ if (!(Number.isInteger(ttlSeconds) && ttlSeconds >= 0 && Number.isInteger(maxEntries) && maxEntries >= 1)) {
27
+ throw new exceptions_1.InvalidOption('authn.keys.cache needs an integer ttlSeconds >= 0 and an integer maxEntries >= 1');
28
+ }
29
+ }
22
30
  }
23
31
  /**
24
32
  * The options of a validated `authn.keys`: frozen, with the challenge audience falling back to the assertion audience.
@@ -33,6 +41,7 @@ function keysOptionsOf(config) {
33
41
  challenge: Object.freeze({ ttlSeconds: config.challenge.ttlSeconds, audience: config.challenge.audience ?? config.assertion.audience }),
34
42
  assertion: Object.freeze({ ...config.assertion }),
35
43
  httpSignature: Object.freeze({ ...config.httpSignature, requiredComponents: Object.freeze([...config.httpSignature.requiredComponents]) }),
44
+ cache: Object.freeze({ ...exports.DEFAULT_KEY_CACHE, ...config.cache }),
36
45
  });
37
46
  derived.set(config, options);
38
47
  derived.set(options, options);
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/options/options.ts"],"names":[],"mappings":";;;AACA,oDAAoD;AAgCpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAuB,CAAC;AAEnD,MAAM,MAAM,GAAsH;IAChI,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC;IACpC,CAAC,WAAW,EAAE,oBAAoB,EAAE,CAAC,EAAE,GAAG,CAAC;IAC3C,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC;IACpC,CAAC,eAAe,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,CAAC;IAC1C,CAAC,eAAe,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC;CACzC,CAAC;AAEF,4GAA4G;AAC5G,wFAAwF;AACxF,SAAS,WAAW,CAAC,MAAkB;IACrC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAa,MAAM,CAAC,KAAK,CAAoD,EAAE,CAAC,GAAG,CAAC,CAAC;QAChG,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,GAAG,IAAK,KAAgB,IAAI,GAAG,CAAC,EAAE,CAAC;YACvF,MAAM,IAAI,0BAAa,CAAC,cAAc,KAAK,IAAI,GAAG,4BAA4B,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,uBAA8B,MAAkB;IAC9C,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YACjD,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACvI,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACjD,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;SAC3I,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/options/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { CredentialChangeBus, IdentityRef, KeyRecord } from '@spinajs/authn/contracts';
2
+ import type { KeyCacheOptions } from '../options/options.js';
3
+ import { KeyStore } from './store.js';
4
+ /**
5
+ * A KeyStore whose `get` is served from memory for `ttlSeconds`. Every write through it and every change the bus
6
+ * delivers evicts; a key revoked in another process is seen within the ttl. Unknown kids are never cached.
7
+ */
8
+ export declare class CachedKeyStore extends KeyStore {
9
+ protected readonly inner: KeyStore;
10
+ protected readonly options: KeyCacheOptions;
11
+ protected readonly bus?: CredentialChangeBus | undefined;
12
+ private readonly keys;
13
+ /** Bumped by every eviction: a read that started before it must not store what it read. */
14
+ private epoch;
15
+ private readonly unsubscribe;
16
+ constructor(inner: KeyStore, options: KeyCacheOptions, bus?: CredentialChangeBus | undefined);
17
+ insert(key: KeyRecord): Promise<'inserted' | 'duplicate'>;
18
+ get(kid: string): Promise<KeyRecord | null>;
19
+ listByOwner(owner: IdentityRef): Promise<readonly KeyRecord[]>;
20
+ revoke(owner: IdentityRef, kid: string, at: Date): Promise<'revoked' | 'already' | 'none'>;
21
+ touch(kid: string, at: Date): Promise<void>;
22
+ /** Stops listening to the bus. */
23
+ dispose(): Promise<void>;
24
+ private evict;
25
+ }
26
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/registry/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAG5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;GAGG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAOxC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAClC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe;IAC3C,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,mBAAmB;IAR9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAC7D,2FAA2F;IAC3F,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IAEvD,YACqB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,eAAe,EACxB,GAAG,CAAC,EAAE,mBAAmB,YAAA,EAK7C;IAEY,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAMrE;IAEY,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAWvD;IAEM,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAEpE;IAEY,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,CAMtG;IAEY,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvD;IAED,kCAAkC;IAC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI9B;IAED,OAAO,CAAC,KAAK;CAId"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CachedKeyStore = void 0;
4
+ const bus_1 = require("@spinajs/authn/bus");
5
+ const util_1 = require("@spinajs/util");
6
+ const store_js_1 = require("./store.js");
7
+ /**
8
+ * A KeyStore whose `get` is served from memory for `ttlSeconds`. Every write through it and every change the bus
9
+ * delivers evicts; a key revoked in another process is seen within the ttl. Unknown kids are never cached.
10
+ */
11
+ class CachedKeyStore extends store_js_1.KeyStore {
12
+ constructor(inner, options, bus) {
13
+ super();
14
+ this.inner = inner;
15
+ this.options = options;
16
+ this.bus = bus;
17
+ /** Bumped by every eviction: a read that started before it must not store what it read. */
18
+ this.epoch = 0;
19
+ this.keys = options.ttlSeconds > 0 ? new util_1.LruTtlCache({ maxEntries: options.maxEntries, ttlMs: options.ttlSeconds * 1000, expireOnClockRewind: true }) : null;
20
+ this.unsubscribe = this.keys && bus ? bus.subscribe((change) => this.evict((0, bus_1.credentialChangeTags)(change))) : undefined;
21
+ }
22
+ async insert(key) {
23
+ try {
24
+ return await this.inner.insert(key);
25
+ }
26
+ finally {
27
+ this.evict([(0, bus_1.credentialTag)('key', key.kid)]);
28
+ }
29
+ }
30
+ async get(kid) {
31
+ const cached = this.keys?.get(kid);
32
+ if (cached !== undefined) {
33
+ return cached;
34
+ }
35
+ const since = this.epoch;
36
+ const key = await this.inner.get(kid);
37
+ if (key !== null && this.keys !== null && since === this.epoch) {
38
+ this.keys.set(kid, key, { tags: [(0, bus_1.credentialTag)('key', kid), (0, bus_1.identityTag)(key.owner)] });
39
+ }
40
+ return key;
41
+ }
42
+ listByOwner(owner) {
43
+ return this.inner.listByOwner(owner);
44
+ }
45
+ async revoke(owner, kid, at) {
46
+ try {
47
+ return await this.inner.revoke(owner, kid, at);
48
+ }
49
+ finally {
50
+ this.evict([(0, bus_1.credentialTag)('key', kid)]);
51
+ }
52
+ }
53
+ async touch(kid, at) {
54
+ try {
55
+ await this.inner.touch(kid, at);
56
+ }
57
+ finally {
58
+ this.evict([(0, bus_1.credentialTag)('key', kid)]);
59
+ }
60
+ }
61
+ /** Stops listening to the bus. */
62
+ dispose() {
63
+ this.unsubscribe?.();
64
+ this.keys?.clear();
65
+ return Promise.resolve();
66
+ }
67
+ evict(tags) {
68
+ this.epoch++;
69
+ this.keys?.invalidate(tags);
70
+ }
71
+ }
72
+ exports.CachedKeyStore = CachedKeyStore;
73
+ //# sourceMappingURL=cache.js.map