@zuplo/cli 7.4.5 → 7.4.7

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 (198) hide show
  1. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwks/remote.d.ts +4 -4
  2. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jws/general/verify.d.ts +3 -3
  3. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwt/encrypt.d.ts +8 -14
  4. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwt/sign.d.ts +8 -14
  5. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/types/jwt/unsecured.d.ts +9 -15
  6. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +30 -8
  7. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +8 -4
  8. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +6 -13
  9. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/general/decrypt.js +19 -19
  10. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwe/general/encrypt.js +27 -20
  11. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwk/embedded.js +15 -1
  12. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwk/thumbprint.js +11 -5
  13. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwks/local.js +45 -53
  14. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwks/remote.js +82 -103
  15. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/compact/sign.js +10 -9
  16. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/flattened/sign.js +2 -1
  17. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/flattened/verify.js +8 -7
  18. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/general/sign.js +5 -3
  19. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jws/general/verify.js +51 -21
  20. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/decrypt.js +7 -9
  21. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/encrypt.js +21 -50
  22. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/sign.js +8 -41
  23. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/jwt/unsecured.js +21 -42
  24. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/key/generate_key_pair.js +6 -2
  25. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/key/generate_secret.js +7 -6
  26. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/key/import.js +16 -12
  27. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/asn1.js +7 -2
  28. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/content_encryption.js +7 -15
  29. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/deflate.js +8 -0
  30. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/helpers.js +1 -1
  31. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +85 -28
  32. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +40 -12
  33. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwk_metadata.js +20 -0
  34. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jws_sign.js +47 -36
  35. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jws_verify.js +77 -45
  36. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +82 -47
  37. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/key.js +24 -9
  38. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/key_management.js +10 -4
  39. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/key_options.js +6 -0
  40. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/options.js +26 -0
  41. package/node_modules/@modelcontextprotocol/client/node_modules/jose/dist/webapi/lib/type_checks.js +11 -13
  42. package/node_modules/@modelcontextprotocol/client/node_modules/jose/package.json +1 -1
  43. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwks/remote.d.ts +4 -4
  44. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jws/general/verify.d.ts +3 -3
  45. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/encrypt.d.ts +8 -14
  46. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/sign.d.ts +8 -14
  47. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/unsecured.d.ts +9 -15
  48. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +30 -8
  49. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +8 -4
  50. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +6 -13
  51. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/general/decrypt.js +19 -19
  52. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwe/general/encrypt.js +27 -20
  53. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwk/embedded.js +15 -1
  54. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwk/thumbprint.js +11 -5
  55. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/local.js +45 -53
  56. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +82 -103
  57. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/compact/sign.js +10 -9
  58. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/flattened/sign.js +2 -1
  59. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/flattened/verify.js +8 -7
  60. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/general/sign.js +5 -3
  61. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jws/general/verify.js +51 -21
  62. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/decrypt.js +7 -9
  63. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/encrypt.js +21 -50
  64. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/sign.js +8 -41
  65. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwt/unsecured.js +21 -42
  66. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/key/generate_key_pair.js +6 -2
  67. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/key/generate_secret.js +7 -6
  68. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/key/import.js +16 -12
  69. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/asn1.js +7 -2
  70. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/content_encryption.js +7 -15
  71. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/deflate.js +8 -0
  72. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/helpers.js +1 -1
  73. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +85 -28
  74. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +40 -12
  75. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwk_metadata.js +20 -0
  76. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jws_sign.js +47 -36
  77. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jws_verify.js +77 -45
  78. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +82 -47
  79. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key.js +24 -9
  80. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key_management.js +10 -4
  81. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/key_options.js +6 -0
  82. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/options.js +26 -0
  83. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/type_checks.js +11 -13
  84. package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
  85. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.d.ts +35 -0
  86. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.d.ts.map +1 -0
  87. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.js +352 -0
  88. package/node_modules/@posthog/core/dist/featureFlagLocalEvaluation.mjs +294 -0
  89. package/node_modules/@posthog/core/dist/index.d.ts +2 -0
  90. package/node_modules/@posthog/core/dist/index.d.ts.map +1 -1
  91. package/node_modules/@posthog/core/dist/index.js +164 -79
  92. package/node_modules/@posthog/core/dist/index.mjs +2 -1
  93. package/node_modules/@posthog/core/dist/posthog-core-stateless.d.ts +12 -18
  94. package/node_modules/@posthog/core/dist/posthog-core-stateless.d.ts.map +1 -1
  95. package/node_modules/@posthog/core/dist/posthog-core-stateless.js +15 -47
  96. package/node_modules/@posthog/core/dist/posthog-core-stateless.mjs +15 -47
  97. package/node_modules/@posthog/core/dist/surveys/index.d.ts +1 -0
  98. package/node_modules/@posthog/core/dist/surveys/index.d.ts.map +1 -1
  99. package/node_modules/@posthog/core/dist/surveys/index.js +13 -0
  100. package/node_modules/@posthog/core/dist/surveys/index.mjs +2 -1
  101. package/node_modules/@posthog/core/dist/surveys/property-matching.d.ts +11 -0
  102. package/node_modules/@posthog/core/dist/surveys/property-matching.d.ts.map +1 -0
  103. package/node_modules/@posthog/core/dist/surveys/property-matching.js +89 -0
  104. package/node_modules/@posthog/core/dist/surveys/property-matching.mjs +46 -0
  105. package/node_modules/@posthog/core/dist/types.d.ts +15 -4
  106. package/node_modules/@posthog/core/dist/types.d.ts.map +1 -1
  107. package/node_modules/@posthog/core/package.json +2 -2
  108. package/node_modules/@posthog/core/src/featureFlagLocalEvaluation.ts +375 -0
  109. package/node_modules/@posthog/core/src/index.ts +19 -0
  110. package/node_modules/@posthog/core/src/logs/index.spec.ts +77 -0
  111. package/node_modules/@posthog/core/src/logs/index.ts +1 -1
  112. package/node_modules/@posthog/core/src/posthog-core-stateless.ts +40 -65
  113. package/node_modules/@posthog/core/src/surveys/index.ts +1 -0
  114. package/node_modules/@posthog/core/src/surveys/property-matching.spec.ts +174 -0
  115. package/node_modules/@posthog/core/src/surveys/property-matching.ts +75 -0
  116. package/node_modules/@posthog/core/src/types.ts +20 -4
  117. package/node_modules/@posthog/types/dist/index.d.ts +1 -1
  118. package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
  119. package/node_modules/@posthog/types/dist/posthog-config.d.ts +20 -5
  120. package/node_modules/@posthog/types/dist/posthog-config.d.ts.map +1 -1
  121. package/node_modules/@posthog/types/package.json +1 -1
  122. package/node_modules/@posthog/types/src/index.ts +1 -0
  123. package/node_modules/@posthog/types/src/posthog-config.ts +21 -5
  124. package/node_modules/@zuplo/core/customer.cli.minified.js +269 -269
  125. package/node_modules/@zuplo/core/index.minified.js +276 -276
  126. package/node_modules/@zuplo/core/package.json +1 -1
  127. package/node_modules/@zuplo/graphql/package.json +1 -1
  128. package/node_modules/@zuplo/openapi-tools/package.json +1 -1
  129. package/node_modules/@zuplo/otel/package.json +1 -1
  130. package/node_modules/@zuplo/runtime/out/esm/{chunk-IZE65N7D.js → chunk-CUK3VROF.js} +2 -2
  131. package/node_modules/@zuplo/runtime/out/esm/{chunk-4CDML74A.js → chunk-K4TBJG47.js} +2 -2
  132. package/node_modules/@zuplo/runtime/out/esm/{chunk-4VE55TG3.js → chunk-S4EBLGSU.js} +2 -2
  133. package/node_modules/@zuplo/runtime/out/esm/{chunk-4POCC75H.js → chunk-XF3IIUDX.js} +4 -4
  134. package/node_modules/@zuplo/runtime/out/esm/{chunk-4POCC75H.js.map → chunk-XF3IIUDX.js.map} +1 -1
  135. package/node_modules/@zuplo/runtime/out/esm/chunk-XIFGUD6K.js +403 -0
  136. package/node_modules/@zuplo/runtime/out/esm/chunk-XIFGUD6K.js.map +1 -0
  137. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  138. package/node_modules/@zuplo/runtime/out/esm/internal/index.js +1 -1
  139. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
  140. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
  141. package/node_modules/@zuplo/runtime/out/esm/sdks/aws/index.js +1 -1
  142. package/node_modules/@zuplo/runtime/package.json +1 -1
  143. package/node_modules/fast-uri/index.js +201 -48
  144. package/node_modules/fast-uri/lib/schemes.js +9 -4
  145. package/node_modules/fast-uri/lib/utils.js +388 -91
  146. package/node_modules/fast-uri/package.json +1 -1
  147. package/node_modules/fast-uri/test/component-safe-serialization.test.js +105 -0
  148. package/node_modules/fast-uri/test/equal.test.js +31 -3
  149. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  150. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  151. package/node_modules/fast-uri/test/ipv6-validation.test.js +90 -0
  152. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  153. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  154. package/node_modules/fast-uri/test/parse.test.js +7 -3
  155. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  156. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  157. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  158. package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  159. package/node_modules/fast-uri/test/security.test.js +75 -3
  160. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  161. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  162. package/node_modules/hono/dist/cjs/client/client.js +25 -11
  163. package/node_modules/hono/dist/cjs/client/utils.js +3 -0
  164. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  165. package/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  166. package/node_modules/hono/dist/cjs/middleware/etag/index.js +1 -1
  167. package/node_modules/hono/dist/cjs/request.js +8 -4
  168. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +10 -3
  169. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +47 -83
  170. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +2 -1
  171. package/node_modules/hono/dist/cjs/router/trie-router/node.js +4 -3
  172. package/node_modules/hono/dist/cjs/router/utils.js +27 -0
  173. package/node_modules/hono/dist/cjs/utils/cookie.js +1 -1
  174. package/node_modules/hono/dist/cjs/utils/stream.js +7 -1
  175. package/node_modules/hono/dist/client/client.js +25 -11
  176. package/node_modules/hono/dist/client/utils.js +3 -0
  177. package/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  178. package/node_modules/hono/dist/jsx/dom/render.js +2 -0
  179. package/node_modules/hono/dist/middleware/etag/index.js +1 -1
  180. package/node_modules/hono/dist/request.js +8 -4
  181. package/node_modules/hono/dist/router/reg-exp-router/node.js +6 -2
  182. package/node_modules/hono/dist/router/reg-exp-router/router.js +53 -84
  183. package/node_modules/hono/dist/router/reg-exp-router/trie.js +2 -1
  184. package/node_modules/hono/dist/router/trie-router/node.js +4 -3
  185. package/node_modules/hono/dist/router/utils.js +5 -0
  186. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -0
  187. package/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  188. package/node_modules/hono/dist/utils/cookie.js +1 -1
  189. package/node_modules/hono/dist/utils/stream.js +7 -1
  190. package/node_modules/hono/package.json +1 -1
  191. package/package.json +11 -11
  192. package/node_modules/@zuplo/runtime/out/esm/chunk-4SX4HBWT.js +0 -409
  193. package/node_modules/@zuplo/runtime/out/esm/chunk-4SX4HBWT.js.map +0 -1
  194. /package/node_modules/@zuplo/runtime/out/esm/{chunk-IZE65N7D.js.map → chunk-CUK3VROF.js.map} +0 -0
  195. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4CDML74A.js.map → chunk-K4TBJG47.js.map} +0 -0
  196. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4VE55TG3.js.map → chunk-S4EBLGSU.js.map} +0 -0
  197. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4POCC75H.js.LEGAL.txt → chunk-XF3IIUDX.js.LEGAL.txt} +0 -0
  198. /package/node_modules/@zuplo/runtime/out/esm/{chunk-4SX4HBWT.js.LEGAL.txt → chunk-XIFGUD6K.js.LEGAL.txt} +0 -0
@@ -36,17 +36,17 @@ export declare const jwksCache: unique symbol;
36
36
  export interface RemoteJWKSetOptions {
37
37
  /**
38
38
  * Timeout (in milliseconds) for the HTTP request. When reached the request will be aborted and
39
- * the verification will fail. Default is 5000 (5 seconds).
39
+ * the verification will fail. Must be a non-negative integer. Default is 5000 (5 seconds).
40
40
  */
41
41
  timeoutDuration?: number;
42
42
  /**
43
43
  * Duration (in milliseconds) for which no more HTTP requests will be triggered after a previous
44
- * successful fetch. Default is 30000 (30 seconds).
44
+ * successful fetch. Must not be `NaN`. Default is 30000 (30 seconds).
45
45
  */
46
46
  cooldownDuration?: number;
47
47
  /**
48
48
  * Maximum time (in milliseconds) between successful HTTP requests. Default is 600000 (10
49
- * minutes).
49
+ * minutes). Must not be `NaN`.
50
50
  */
51
51
  cacheMaxAge?: number | typeof Infinity;
52
52
  /** Headers to be sent with the HTTP request. */
@@ -60,7 +60,7 @@ export interface RemoteJWKSetOptions {
60
60
  export interface ExportedJWKSCache {
61
61
  /** Current cached JSON Web Key Set */
62
62
  jwks: types.JSONWebKeySet;
63
- /** Last updated at timestamp (seconds since epoch) */
63
+ /** Last updated at timestamp (milliseconds since epoch) */
64
64
  uat: number;
65
65
  }
66
66
  /** See {@link jwksCache}. */
@@ -11,9 +11,9 @@ export interface GeneralVerifyGetKey<KeyType extends types.CryptoKey | Uint8Arra
11
11
  * > Note: The function iterates over the `signatures` array in the General JWS and returns the verification
12
12
  * > result of the first signature entry that can be successfully verified. The result only contains
13
13
  * > the payload, protected header, and unprotected header of that successfully verified signature
14
- * > entry. Other signature entries in the General JWS are not validated, and their headers are not
15
- * > included in the returned result. Recipients of a General JWS should only rely on the returned
16
- * > (verified) data.
14
+ * > entry. Other signature entries' headers may be inspected solely to reject inconsistent use of the
15
+ * > JWS Unencoded Payload Option, and their headers are not included in the returned result.
16
+ * > Recipients of a General JWS should only rely on the returned (verified) data.
17
17
  *
18
18
  * @param jws General JWS.
19
19
  * @param key Key to verify the JWS with. See
@@ -1,20 +1,13 @@
1
1
  import type * as types from '../types.d.ts';
2
+ /**
3
+ * EncryptJWT constructor
4
+ *
5
+ * @param payload The JWT Claims Set object. Defaults to an empty object.
6
+ */
7
+ declare const EncryptJWT_base: new (payload?: types.JWTPayload) => types.ProduceJWT;
2
8
  /** The EncryptJWT class is used to build and encrypt Compact JWE formatted JSON Web Tokens. */
3
- export declare class EncryptJWT implements types.ProduceJWT {
9
+ export declare class EncryptJWT extends EncryptJWT_base {
4
10
  #private;
5
- /**
6
- * {@link EncryptJWT} constructor
7
- *
8
- * @param payload The JWT Claims Set object. Defaults to an empty object.
9
- */
10
- constructor(payload?: types.JWTPayload);
11
- setIssuer(issuer: string): this;
12
- setSubject(subject: string): this;
13
- setAudience(audience: string | string[]): this;
14
- setJti(jwtId: string): this;
15
- setNotBefore(input: number | string | Date): this;
16
- setExpirationTime(input: number | string | Date): this;
17
- setIssuedAt(input?: number | string | Date): this;
18
11
  /**
19
12
  * Sets the JWE Protected Header on the EncryptJWT object.
20
13
  *
@@ -66,3 +59,4 @@ export declare class EncryptJWT implements types.ProduceJWT {
66
59
  */
67
60
  encrypt(key: types.KeyInput, options?: types.EncryptOptions): Promise<string>;
68
61
  }
62
+ export {};
@@ -1,20 +1,13 @@
1
1
  import type * as types from '../types.d.ts';
2
+ /**
3
+ * SignJWT constructor
4
+ *
5
+ * @param payload The JWT Claims Set object. Defaults to an empty object.
6
+ */
7
+ declare const SignJWT_base: new (payload?: types.JWTPayload) => types.ProduceJWT;
2
8
  /** The SignJWT class is used to build and sign Compact JWS formatted JSON Web Tokens. */
3
- export declare class SignJWT implements types.ProduceJWT {
9
+ export declare class SignJWT extends SignJWT_base {
4
10
  #private;
5
- /**
6
- * {@link SignJWT} constructor
7
- *
8
- * @param payload The JWT Claims Set object. Defaults to an empty object.
9
- */
10
- constructor(payload?: types.JWTPayload);
11
- setIssuer(issuer: string): this;
12
- setSubject(subject: string): this;
13
- setAudience(audience: string | string[]): this;
14
- setJti(jwtId: string): this;
15
- setNotBefore(input: number | string | Date): this;
16
- setExpirationTime(input: number | string | Date): this;
17
- setIssuedAt(input?: number | string | Date): this;
18
11
  /**
19
12
  * Sets the JWS Protected Header on the SignJWT object.
20
13
  *
@@ -30,3 +23,4 @@ export declare class SignJWT implements types.ProduceJWT {
30
23
  */
31
24
  sign(key: types.KeyInput, options?: types.SignOptions): Promise<string>;
32
25
  }
26
+ export {};
@@ -6,24 +6,17 @@ export interface UnsecuredResult<PayloadType = types.JWTPayload> {
6
6
  /** The decoded JOSE Header; always `{ "alg": "none" }` for an Unsecured JWT. */
7
7
  header: types.JWSHeaderParameters;
8
8
  }
9
+ /**
10
+ * UnsecuredJWT constructor
11
+ *
12
+ * @param payload The JWT Claims Set object. Defaults to an empty object.
13
+ */
14
+ declare const UnsecuredJWT_base: new (payload?: types.JWTPayload) => types.ProduceJWT;
9
15
  /** The UnsecuredJWT class is a utility for dealing with `{ "alg": "none" }` Unsecured JWTs. */
10
- export declare class UnsecuredJWT implements types.ProduceJWT {
11
- #private;
12
- /**
13
- * {@link UnsecuredJWT} constructor
14
- *
15
- * @param payload The JWT Claims Set object. Defaults to an empty object.
16
- */
17
- constructor(payload?: types.JWTPayload);
16
+ export declare class UnsecuredJWT extends UnsecuredJWT_base {
17
+ private jwt;
18
18
  /** Encodes the Unsecured JWT. */
19
19
  encode(): string;
20
- setIssuer(issuer: string): this;
21
- setSubject(subject: string): this;
22
- setAudience(audience: string | string[]): this;
23
- setJti(jwtId: string): this;
24
- setNotBefore(input: number | string | Date): this;
25
- setExpirationTime(input: number | string | Date): this;
26
- setIssuedAt(input?: number | string | Date): this;
27
20
  /**
28
21
  * Decodes an unsecured JWT.
29
22
  *
@@ -32,3 +25,4 @@ export declare class UnsecuredJWT implements types.ProduceJWT {
32
25
  */
33
26
  static decode<PayloadType = types.JWTPayload>(jwt: string, options?: types.JWTClaimVerificationOptions): UnsecuredResult<PayloadType>;
34
27
  }
28
+ export {};
@@ -1,27 +1,49 @@
1
- import { FlattenedEncrypt } from '../flattened/encrypt.js';
1
+ import { assertNotSet } from '../../lib/helpers.js';
2
+ import { assertUint8Array } from '../../lib/type_checks.js';
3
+ import { createJWE } from '../../lib/jwe_encrypt.js';
2
4
  export class CompactEncrypt {
3
- #flattened;
5
+ #plaintext;
6
+ #protectedHeader;
7
+ #cek;
8
+ #iv;
9
+ #keyManagementParameters;
4
10
  constructor(plaintext) {
5
- this.#flattened = new FlattenedEncrypt(plaintext);
11
+ assertUint8Array(plaintext, 'plaintext');
12
+ this.#plaintext = plaintext;
6
13
  }
7
14
  setContentEncryptionKey(cek) {
8
- this.#flattened.setContentEncryptionKey(cek);
15
+ assertNotSet(this.#cek, 'setContentEncryptionKey');
16
+ this.#cek = cek;
9
17
  return this;
10
18
  }
11
19
  setInitializationVector(iv) {
12
- this.#flattened.setInitializationVector(iv);
20
+ assertNotSet(this.#iv, 'setInitializationVector');
21
+ this.#iv = iv;
13
22
  return this;
14
23
  }
15
24
  setProtectedHeader(protectedHeader) {
16
- this.#flattened.setProtectedHeader(protectedHeader);
25
+ assertNotSet(this.#protectedHeader, 'setProtectedHeader');
26
+ this.#protectedHeader = protectedHeader;
17
27
  return this;
18
28
  }
19
29
  setKeyManagementParameters(parameters) {
20
- this.#flattened.setKeyManagementParameters(parameters);
30
+ assertNotSet(this.#keyManagementParameters, 'setKeyManagementParameters');
31
+ this.#keyManagementParameters = parameters;
21
32
  return this;
22
33
  }
23
34
  async encrypt(key, options) {
24
- const jwe = await this.#flattened.encrypt(key, options);
35
+ const jwe = await createJWE([
36
+ this.#plaintext,
37
+ this.#protectedHeader,
38
+ undefined,
39
+ undefined,
40
+ undefined,
41
+ this.#cek,
42
+ this.#iv,
43
+ this.#keyManagementParameters,
44
+ undefined,
45
+ false,
46
+ ], key, options);
25
47
  return [jwe.protected, jwe.encrypted_key, jwe.iv, jwe.ciphertext, jwe.tag].join('.');
26
48
  }
27
49
  }
@@ -1,11 +1,15 @@
1
1
  import { JWEInvalid } from '../../util/errors.js';
2
2
  import { isObject } from '../../lib/type_checks.js';
3
- import { prepareDecrypt, decryptJWE, decryptResult, checkShared, checkRecipient, } from '../../lib/jwe_decrypt.js';
3
+ import { prepareDecrypt, decryptJWE, decryptResult, checkRecipient, snapshotSharedJWE, snapshotRecipientJWE, } from '../../lib/jwe_decrypt.js';
4
4
  export async function flattenedDecrypt(jwe, key, options) {
5
5
  if (!isObject(jwe)) {
6
6
  throw new JWEInvalid('Flattened JWE must be an object');
7
7
  }
8
- checkShared(jwe);
9
- checkRecipient(jwe);
10
- return decryptResult(jwe, await decryptJWE(jwe, prepareDecrypt(options), key));
8
+ const shared = snapshotSharedJWE(jwe);
9
+ const [recipient, , error] = snapshotRecipientJWE(jwe);
10
+ if (!recipient)
11
+ throw error;
12
+ const snapshot = { ...shared, ...recipient };
13
+ checkRecipient(snapshot);
14
+ return decryptResult(snapshot, await decryptJWE(snapshot, prepareDecrypt(options), key));
11
15
  }
@@ -1,7 +1,6 @@
1
- import { unprotected, assertNotSet } from '../../lib/helpers.js';
2
- import { JWEInvalid } from '../../util/errors.js';
1
+ import { assertNotSet } from '../../lib/helpers.js';
3
2
  import { createJWE } from '../../lib/jwe_encrypt.js';
4
- import { validateCritDuplicates } from '../../lib/options.js';
3
+ import { assertUint8Array } from '../../lib/type_checks.js';
5
4
  export class FlattenedEncrypt {
6
5
  #plaintext;
7
6
  #protectedHeader;
@@ -12,9 +11,7 @@ export class FlattenedEncrypt {
12
11
  #iv;
13
12
  #keyManagementParameters;
14
13
  constructor(plaintext) {
15
- if (!(plaintext instanceof Uint8Array)) {
16
- throw new TypeError('plaintext must be an instance of Uint8Array');
17
- }
14
+ assertUint8Array(plaintext, 'plaintext');
18
15
  this.#plaintext = plaintext;
19
16
  }
20
17
  setKeyManagementParameters(parameters) {
@@ -52,10 +49,6 @@ export class FlattenedEncrypt {
52
49
  return this;
53
50
  }
54
51
  async encrypt(key, options) {
55
- if (!this.#protectedHeader && !this.#unprotectedHeader && !this.#sharedUnprotectedHeader) {
56
- throw new JWEInvalid('either setProtectedHeader, setUnprotectedHeader, or sharedUnprotectedHeader must be called before #encrypt()');
57
- }
58
- validateCritDuplicates(JWEInvalid, this.#protectedHeader);
59
52
  return createJWE([
60
53
  this.#plaintext,
61
54
  this.#protectedHeader,
@@ -65,8 +58,8 @@ export class FlattenedEncrypt {
65
58
  this.#cek,
66
59
  this.#iv,
67
60
  this.#keyManagementParameters,
68
- options?.crit,
69
- options ? unprotected in options : false,
70
- ], key);
61
+ undefined,
62
+ false,
63
+ ], key, options);
71
64
  }
72
65
  }
@@ -1,46 +1,46 @@
1
- import { prepareDecrypt, shareJWE, decryptRecipient, decryptResult, checkShared, checkRecipient, } from '../../lib/jwe_decrypt.js';
1
+ import { prepareDecrypt, shareJWE, decryptRecipient, decryptResult, checkRecipient, snapshotSharedJWE, snapshotRecipientJWE, } from '../../lib/jwe_decrypt.js';
2
2
  import { JWEDecryptionFailed, JWEInvalid } from '../../util/errors.js';
3
3
  import { isObject } from '../../lib/type_checks.js';
4
4
  export async function generalDecrypt(jwe, key, options) {
5
5
  if (!isObject(jwe)) {
6
6
  throw new JWEInvalid('General JWE must be an object');
7
7
  }
8
- if (!Array.isArray(jwe.recipients) || !jwe.recipients.every(isObject)) {
8
+ const inputRecipients = jwe.recipients;
9
+ if (!Array.isArray(inputRecipients)) {
9
10
  throw new JWEInvalid('JWE Recipients missing or incorrect type');
10
11
  }
11
- if (!jwe.recipients.length) {
12
+ const recipients = Array.from(inputRecipients);
13
+ if (!recipients.every(isObject)) {
14
+ throw new JWEInvalid('JWE Recipients missing or incorrect type');
15
+ }
16
+ if (!recipients.length) {
12
17
  throw new JWEInvalid('JWE Recipients has no members');
13
18
  }
14
19
  let shared;
20
+ let sharedJwe;
15
21
  let token;
16
22
  try {
17
- checkShared(jwe);
18
23
  shared = prepareDecrypt(options);
19
- token = shareJWE(jwe);
24
+ sharedJwe = snapshotSharedJWE(jwe);
25
+ token = shareJWE(sharedJwe);
20
26
  }
21
27
  catch {
22
28
  throw new JWEDecryptionFailed();
23
29
  }
24
- if (jwe.recipients.length > 1) {
25
- for (const { header } of jwe.recipients) {
26
- const alg = token[0]?.alg ?? header?.alg ?? jwe.unprotected?.alg;
30
+ const recipientSnapshots = recipients.map((recipient) => snapshotRecipientJWE(recipient));
31
+ if (recipients.length > 1) {
32
+ for (const [, headerAlg] of recipientSnapshots) {
33
+ const alg = token[0]?.alg ?? headerAlg ?? sharedJwe.unprotected?.alg;
27
34
  if (alg === 'dir' || alg === 'ECDH-ES') {
28
35
  throw new JWEInvalid(`"${alg}" alg may only have a single recipient`);
29
36
  }
30
37
  }
31
38
  }
32
- for (const recipient of jwe.recipients) {
39
+ for (const [recipient] of recipientSnapshots) {
40
+ if (!recipient)
41
+ continue;
33
42
  try {
34
- const flattened = {
35
- aad: jwe.aad,
36
- ciphertext: jwe.ciphertext,
37
- encrypted_key: recipient.encrypted_key,
38
- header: recipient.header,
39
- iv: jwe.iv,
40
- protected: jwe.protected,
41
- tag: jwe.tag,
42
- unprotected: jwe.unprotected,
43
- };
43
+ const flattened = { ...sharedJwe, ...recipient };
44
44
  checkRecipient(flattened);
45
45
  return decryptResult(flattened, await decryptRecipient(flattened, token, shared, key));
46
46
  }
@@ -1,13 +1,12 @@
1
- import { FlattenedEncrypt } from '../flattened/encrypt.js';
2
1
  import { assertNotSet } from '../../lib/helpers.js';
3
2
  import { JWEInvalid } from '../../util/errors.js';
4
3
  import { generateCek } from '../../lib/content_encryption.js';
5
4
  import { encryptKeyManagement } from '../../lib/key_management.js';
6
5
  import { encode as b64u } from '../../util/base64url.js';
7
- import { validateCritDuplicates } from '../../lib/options.js';
8
- import { checkDisjoint, checkEncryptHeaders, encryptJWE } from '../../lib/jwe_encrypt.js';
6
+ import { checkDisjoint, checkEncryptHeaders, createJWE, encryptJWE } from '../../lib/jwe_encrypt.js';
9
7
  import { prepareKey } from '../../lib/key.js';
10
8
  import { jweAlgorithm } from '../../lib/jwe_algorithms.js';
9
+ import { assertUint8Array } from '../../lib/type_checks.js';
11
10
  class IndividualRecipient {
12
11
  #parent;
13
12
  state;
@@ -78,19 +77,21 @@ export class GeneralEncrypt {
78
77
  if (!this.#recipients.length) {
79
78
  throw new JWEInvalid('at least one recipient must be added');
80
79
  }
81
- if (!(this.#plaintext instanceof Uint8Array)) {
82
- throw new TypeError('plaintext must be an instance of Uint8Array');
83
- }
80
+ assertUint8Array(this.#plaintext, 'plaintext');
84
81
  if (this.#recipients.length === 1) {
85
- const [recipient] = this.#recipients;
86
- const [unprotectedHeader, keyManagementParameters, key, crit] = recipient.state;
87
- const flattened = await new FlattenedEncrypt(this.#plaintext)
88
- .setAdditionalAuthenticatedData(this.#aad)
89
- .setProtectedHeader(this.#protectedHeader)
90
- .setSharedUnprotectedHeader(this.#unprotectedHeader)
91
- .setUnprotectedHeader(unprotectedHeader)
92
- .setKeyManagementParameters(keyManagementParameters)
93
- .encrypt(key, { crit });
82
+ const [unprotectedHeader, keyManagementParameters, key, crit] = this.#recipients[0].state;
83
+ const flattened = await createJWE([
84
+ this.#plaintext,
85
+ this.#protectedHeader,
86
+ unprotectedHeader,
87
+ this.#unprotectedHeader,
88
+ this.#aad,
89
+ undefined,
90
+ undefined,
91
+ keyManagementParameters,
92
+ crit,
93
+ false,
94
+ ], key);
94
95
  const jwe = {
95
96
  ciphertext: flattened.ciphertext,
96
97
  iv: flattened.iv,
@@ -102,8 +103,9 @@ export class GeneralEncrypt {
102
103
  copyOptionalMembers(flattened, jwe, jwe.recipients[0]);
103
104
  return jwe;
104
105
  }
105
- validateCritDuplicates(JWEInvalid, this.#protectedHeader);
106
106
  let enc;
107
+ let protectedHeader = this.#protectedHeader;
108
+ let sharedUnprotectedHeader = this.#unprotectedHeader;
107
109
  const inputs = [];
108
110
  const checked = [];
109
111
  for (let i = 0; i < this.#recipients.length; i++) {
@@ -111,9 +113,9 @@ export class GeneralEncrypt {
111
113
  const [unprotectedHeader, keyManagementParameters, , crit] = recipient.state;
112
114
  const input = [
113
115
  this.#plaintext,
114
- this.#protectedHeader,
116
+ protectedHeader,
115
117
  unprotectedHeader,
116
- this.#unprotectedHeader,
118
+ sharedUnprotectedHeader,
117
119
  this.#aad,
118
120
  undefined,
119
121
  undefined,
@@ -124,6 +126,10 @@ export class GeneralEncrypt {
124
126
  const headers = checkEncryptHeaders(input);
125
127
  inputs.push(input);
126
128
  checked.push(headers);
129
+ if (i === 0) {
130
+ protectedHeader = input[1];
131
+ sharedUnprotectedHeader = input[3];
132
+ }
127
133
  if (headers[1] === 'dir' || headers[1] === 'ECDH-ES') {
128
134
  throw new JWEInvalid(`"${headers[1]}" alg may only have a single recipient`);
129
135
  }
@@ -141,7 +147,7 @@ export class GeneralEncrypt {
141
147
  };
142
148
  for (let i = 0; i < this.#recipients.length; i++) {
143
149
  const recipient = this.#recipients[i];
144
- const [unprotectedHeader, keyManagementParameters, key] = recipient.state;
150
+ const [, keyManagementParameters, key] = recipient.state;
145
151
  const target = {};
146
152
  jwe.recipients.push(target);
147
153
  if (i === 0) {
@@ -155,13 +161,14 @@ export class GeneralEncrypt {
155
161
  continue;
156
162
  }
157
163
  const [, alg, , encEntry] = checked[i];
164
+ const unprotectedHeader = inputs[i][2];
158
165
  const k = await prepareKey(jweAlgorithm(alg), key, 'encrypt');
159
166
  const [, encryptedKey, parameters] = await encryptKeyManagement(alg, encEntry, k, cek, keyManagementParameters);
160
167
  target.encrypted_key = b64u(encryptedKey);
161
168
  if (unprotectedHeader || parameters) {
162
169
  const header = { ...unprotectedHeader, ...parameters };
163
170
  if (parameters)
164
- checkDisjoint(this.#protectedHeader, header, this.#unprotectedHeader);
171
+ checkDisjoint(inputs[i][1], header, inputs[i][3]);
165
172
  target.header = header;
166
173
  }
167
174
  }
@@ -2,6 +2,7 @@ import { jwkToKey } from '../lib/jwk_to_key.js';
2
2
  import { jwsAlgorithm } from '../lib/jws_algorithms.js';
3
3
  import { isObject } from '../lib/type_checks.js';
4
4
  import { JWSInvalid } from '../util/errors.js';
5
+ import { normalizeJwk } from '../lib/jwk_metadata.js';
5
6
  export async function EmbeddedJWK(protectedHeader, token) {
6
7
  const joseHeader = {
7
8
  ...protectedHeader,
@@ -10,8 +11,21 @@ export async function EmbeddedJWK(protectedHeader, token) {
10
11
  if (!isObject(joseHeader.jwk)) {
11
12
  throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a JSON object');
12
13
  }
14
+ let jwk;
15
+ try {
16
+ jwk = normalizeJwk(joseHeader.jwk);
17
+ }
18
+ catch (cause) {
19
+ throw new JWSInvalid('Invalid Embedded JWK', { cause });
20
+ }
13
21
  const entry = jwsAlgorithm(joseHeader.alg);
14
- const key = await jwkToKey(entry, { ...joseHeader.jwk, ext: true });
22
+ if (jwk.use !== undefined && jwk.use !== 'sig') {
23
+ throw new JWSInvalid('Invalid Embedded JWK, its "use" must be "sig" when present');
24
+ }
25
+ if (jwk.alg !== undefined && jwk.alg !== entry.alg) {
26
+ throw new JWSInvalid(`Invalid Embedded JWK, its "alg" must be "${entry.alg}" when present`);
27
+ }
28
+ const key = await jwkToKey(entry, { ...jwk, ext: true });
15
29
  if (key.type !== 'public') {
16
30
  throw new JWSInvalid('"jwk" (JSON Web Key) Header Parameter must be a public key');
17
31
  }
@@ -3,9 +3,10 @@ import { encode as b64u } from '../util/base64url.js';
3
3
  import { JOSENotSupported, JWKInvalid } from '../util/errors.js';
4
4
  import { encode } from '../lib/buffer_utils.js';
5
5
  import { isKeyLike } from '../lib/is_key_like.js';
6
- import { isJWK } from '../lib/type_checks.js';
6
+ import { isObject } from '../lib/type_checks.js';
7
7
  import { exportJWK } from '../key/export.js';
8
8
  import { invalidKeyInput } from '../lib/invalid_key_input.js';
9
+ import { snapshotJwk } from '../lib/jwk_metadata.js';
9
10
  const check = (value, description) => {
10
11
  if (typeof value !== 'string' || !value) {
11
12
  throw new JWKInvalid(`${description} missing or invalid`);
@@ -13,11 +14,14 @@ const check = (value, description) => {
13
14
  };
14
15
  export async function calculateJwkThumbprint(key, digestAlgorithm) {
15
16
  let jwk;
16
- if (isJWK(key)) {
17
- jwk = key;
17
+ if (isObject(key)) {
18
+ jwk = snapshotJwk(key);
19
+ if (typeof jwk.kty !== 'string') {
20
+ throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
21
+ }
18
22
  }
19
23
  else if (isKeyLike(key)) {
20
- jwk = await exportJWK(key);
24
+ jwk = snapshotJwk(await exportJWK(key));
21
25
  }
22
26
  else {
23
27
  throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));
@@ -52,7 +56,9 @@ export async function calculateJwkThumbprint(key, digestAlgorithm) {
52
56
  components = { e: jwk.e, kty: jwk.kty, n: jwk.n };
53
57
  break;
54
58
  case 'oct':
55
- check(jwk.k, '"k" (Key Value) Parameter');
59
+ if (typeof jwk.k !== 'string') {
60
+ throw new JWKInvalid('"k" (Key Value) Parameter missing or invalid');
61
+ }
56
62
  components = { k: jwk.k, kty: jwk.kty };
57
63
  break;
58
64
  default:
@@ -1,78 +1,70 @@
1
1
  import { jwkToKey } from '../lib/jwk_to_key.js';
2
2
  import { JWS } from '../lib/jws_algorithms.js';
3
3
  import { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';
4
- import { isObject } from '../lib/type_checks.js';
5
- function signatureAlgorithm(alg) {
6
- const entry = typeof alg === 'string' ? JWS[alg] : undefined;
7
- if (!entry || entry.secret) {
8
- throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
9
- }
10
- return entry;
4
+ import { isJwkSet } from '../lib/type_checks.js';
5
+ import { snapshotJwk } from '../lib/jwk_metadata.js';
6
+ function isUsableJWK(jwk, entry, alg, kid) {
7
+ const { kty, key_ops, ext, kid: jwkKid, alg: jwkAlg, use, crv } = snapshotJwk(jwk);
8
+ const keyOps = Array.isArray(key_ops) ? [...key_ops] : key_ops;
9
+ return ((ext === undefined || typeof ext === 'boolean') &&
10
+ (keyOps === undefined ||
11
+ (Array.isArray(keyOps) &&
12
+ keyOps.every((operation, index) => typeof operation === 'string' && keyOps.indexOf(operation) === index) &&
13
+ keyOps.includes('verify'))) &&
14
+ entry.kty.includes(kty) &&
15
+ (kid === undefined || (typeof kid === 'string' && kid === jwkKid)) &&
16
+ (jwkAlg === undefined ? kty !== 'AKP' : alg === jwkAlg) &&
17
+ (use === undefined || use === 'sig') &&
18
+ (!entry.crv || crv === entry.crv));
11
19
  }
12
- function isJWKSLike(jwks) {
13
- if (!jwks || typeof jwks !== 'object') {
14
- return false;
20
+ async function importWithAlgCache(cache, jwk, entry) {
21
+ const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);
22
+ const { alg } = entry;
23
+ if (cached[alg] === undefined) {
24
+ const key = await jwkToKey(entry, { ...jwk, alg, ext: true });
25
+ if (key.type !== 'public') {
26
+ throw new JWKSInvalid('JSON Web Key Set members must be public keys');
27
+ }
28
+ cached[alg] = key;
15
29
  }
16
- const { keys } = jwks;
17
- return Array.isArray(keys) && keys.every((isObject));
30
+ return cached[alg];
18
31
  }
19
- class LocalJWKSetImpl {
20
- #jwks;
21
- #cached = new WeakMap();
22
- constructor(jwks) {
23
- if (!isJWKSLike(jwks)) {
24
- throw new JWKSInvalid('JSON Web Key Set malformed');
25
- }
26
- this.#jwks = structuredClone(jwks);
32
+ export function createLocalJWKSet(jwks) {
33
+ let snapshot;
34
+ try {
35
+ snapshot = structuredClone(jwks);
27
36
  }
28
- jwks() {
29
- return this.#jwks;
37
+ catch { }
38
+ if (!isJwkSet(snapshot)) {
39
+ throw new JWKSInvalid('JSON Web Key Set malformed');
30
40
  }
31
- async getKey(protectedHeader, token) {
41
+ const cached = new WeakMap();
42
+ const localJWKSet = async (protectedHeader, token) => {
32
43
  const { alg, kid } = { ...protectedHeader, ...token?.header };
33
- const entry = signatureAlgorithm(alg);
34
- const candidates = this.#jwks.keys.filter((jwk) => entry.kty.includes(jwk.kty) &&
35
- (typeof kid !== 'string' || kid === jwk.kid) &&
36
- (!(typeof jwk.alg === 'string' || jwk.kty === 'AKP') || alg === jwk.alg) &&
37
- (typeof jwk.use !== 'string' || jwk.use === 'sig') &&
38
- (!Array.isArray(jwk.key_ops) || jwk.key_ops.includes('verify')) &&
39
- (!entry.crv || jwk.crv === entry.crv));
44
+ const entry = typeof alg === 'string' ? JWS[alg] : undefined;
45
+ if (!entry || entry.secret) {
46
+ throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
47
+ }
48
+ const candidates = snapshot.keys.filter((jwk) => isUsableJWK(jwk, entry, alg, kid));
40
49
  const { 0: jwk, length } = candidates;
41
- if (length === 0) {
50
+ if (!length) {
42
51
  throw new JWKSNoMatchingKey();
43
52
  }
44
53
  if (length !== 1) {
45
54
  const error = new JWKSMultipleMatchingKeys();
46
- const _cached = this.#cached;
47
55
  error[Symbol.asyncIterator] = async function* () {
48
56
  for (const jwk of candidates) {
49
57
  try {
50
- yield await importWithAlgCache(_cached, jwk, entry);
58
+ yield await importWithAlgCache(cached, jwk, entry);
51
59
  }
52
60
  catch { }
53
61
  }
54
62
  };
55
63
  throw error;
56
64
  }
57
- return importWithAlgCache(this.#cached, jwk, entry);
58
- }
59
- }
60
- async function importWithAlgCache(cache, jwk, entry) {
61
- const cached = cache.get(jwk) || cache.set(jwk, { __proto__: null }).get(jwk);
62
- if (cached[entry.alg] === undefined) {
63
- const key = await jwkToKey(entry, { ...jwk, alg: entry.alg, ext: true });
64
- if (key.type !== 'public') {
65
- throw new JWKSInvalid('JSON Web Key Set members must be public keys');
66
- }
67
- cached[entry.alg] = key;
68
- }
69
- return cached[entry.alg];
70
- }
71
- export function createLocalJWKSet(jwks) {
72
- const set = new LocalJWKSetImpl(jwks);
73
- const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);
74
- Object.defineProperty(localJWKSet, 'jwks', {
75
- value: () => structuredClone(set.jwks()),
65
+ return importWithAlgCache(cached, jwk, entry);
66
+ };
67
+ return Object.defineProperty(localJWKSet, 'jwks', {
68
+ value: () => structuredClone(snapshot),
76
69
  });
77
- return localJWKSet;
78
70
  }