@cedarjs/api 0.0.4

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 (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/auth/index.d.ts +51 -0
  4. package/dist/auth/index.d.ts.map +1 -0
  5. package/dist/auth/index.js +89 -0
  6. package/dist/auth/parseJWT.d.ts +6 -0
  7. package/dist/auth/parseJWT.d.ts.map +1 -0
  8. package/dist/auth/parseJWT.js +33 -0
  9. package/dist/auth/verifiers/base64Sha1Verifier.d.ts +19 -0
  10. package/dist/auth/verifiers/base64Sha1Verifier.d.ts.map +1 -0
  11. package/dist/auth/verifiers/base64Sha1Verifier.js +57 -0
  12. package/dist/auth/verifiers/base64Sha256Verifier.d.ts +19 -0
  13. package/dist/auth/verifiers/base64Sha256Verifier.d.ts.map +1 -0
  14. package/dist/auth/verifiers/base64Sha256Verifier.js +57 -0
  15. package/dist/auth/verifiers/common.d.ts +104 -0
  16. package/dist/auth/verifiers/common.d.ts.map +1 -0
  17. package/dist/auth/verifiers/common.js +59 -0
  18. package/dist/auth/verifiers/index.d.ts +8 -0
  19. package/dist/auth/verifiers/index.d.ts.map +1 -0
  20. package/dist/auth/verifiers/index.js +12 -0
  21. package/dist/auth/verifiers/jwtVerifier.d.ts +26 -0
  22. package/dist/auth/verifiers/jwtVerifier.d.ts.map +1 -0
  23. package/dist/auth/verifiers/jwtVerifier.js +55 -0
  24. package/dist/auth/verifiers/secretKeyVerifier.d.ts +14 -0
  25. package/dist/auth/verifiers/secretKeyVerifier.d.ts.map +1 -0
  26. package/dist/auth/verifiers/secretKeyVerifier.js +20 -0
  27. package/dist/auth/verifiers/sha1Verifier.d.ts +25 -0
  28. package/dist/auth/verifiers/sha1Verifier.d.ts.map +1 -0
  29. package/dist/auth/verifiers/sha1Verifier.js +65 -0
  30. package/dist/auth/verifiers/sha256Verifier.d.ts +25 -0
  31. package/dist/auth/verifiers/sha256Verifier.d.ts.map +1 -0
  32. package/dist/auth/verifiers/sha256Verifier.js +65 -0
  33. package/dist/auth/verifiers/skipVerifier.d.ts +13 -0
  34. package/dist/auth/verifiers/skipVerifier.d.ts.map +1 -0
  35. package/dist/auth/verifiers/skipVerifier.js +17 -0
  36. package/dist/auth/verifiers/timestampSchemeVerifier.d.ts +16 -0
  37. package/dist/auth/verifiers/timestampSchemeVerifier.d.ts.map +1 -0
  38. package/dist/auth/verifiers/timestampSchemeVerifier.js +65 -0
  39. package/dist/bins/redwood.d.ts +9 -0
  40. package/dist/bins/redwood.d.ts.map +1 -0
  41. package/dist/bins/rwfw.d.ts +3 -0
  42. package/dist/bins/rwfw.d.ts.map +1 -0
  43. package/dist/bins/tsc.d.ts +3 -0
  44. package/dist/bins/tsc.d.ts.map +1 -0
  45. package/dist/cache/clients/BaseClient.d.ts +11 -0
  46. package/dist/cache/clients/BaseClient.d.ts.map +1 -0
  47. package/dist/cache/clients/BaseClient.js +7 -0
  48. package/dist/cache/clients/InMemoryClient.d.ts +31 -0
  49. package/dist/cache/clients/InMemoryClient.d.ts.map +1 -0
  50. package/dist/cache/clients/InMemoryClient.js +70 -0
  51. package/dist/cache/clients/MemcachedClient.d.ts +16 -0
  52. package/dist/cache/clients/MemcachedClient.d.ts.map +1 -0
  53. package/dist/cache/clients/MemcachedClient.js +45 -0
  54. package/dist/cache/clients/RedisClient.d.ts +20 -0
  55. package/dist/cache/clients/RedisClient.d.ts.map +1 -0
  56. package/dist/cache/clients/RedisClient.js +49 -0
  57. package/dist/cache/errors.d.ts +4 -0
  58. package/dist/cache/errors.d.ts.map +1 -0
  59. package/dist/cache/errors.js +9 -0
  60. package/dist/cache/index.d.ts +35 -0
  61. package/dist/cache/index.d.ts.map +1 -0
  62. package/dist/cache/index.js +132 -0
  63. package/dist/cjs/auth/index.d.ts +51 -0
  64. package/dist/cjs/auth/index.d.ts.map +1 -0
  65. package/dist/cjs/auth/index.js +129 -0
  66. package/dist/cjs/auth/parseJWT.d.ts +6 -0
  67. package/dist/cjs/auth/parseJWT.d.ts.map +1 -0
  68. package/dist/cjs/auth/parseJWT.js +57 -0
  69. package/dist/cjs/auth/verifiers/base64Sha1Verifier.d.ts +19 -0
  70. package/dist/cjs/auth/verifiers/base64Sha1Verifier.d.ts.map +1 -0
  71. package/dist/cjs/auth/verifiers/base64Sha1Verifier.js +77 -0
  72. package/dist/cjs/auth/verifiers/base64Sha256Verifier.d.ts +19 -0
  73. package/dist/cjs/auth/verifiers/base64Sha256Verifier.d.ts.map +1 -0
  74. package/dist/cjs/auth/verifiers/base64Sha256Verifier.js +77 -0
  75. package/dist/cjs/auth/verifiers/common.d.ts +104 -0
  76. package/dist/cjs/auth/verifiers/common.d.ts.map +1 -0
  77. package/dist/cjs/auth/verifiers/common.js +99 -0
  78. package/dist/cjs/auth/verifiers/index.d.ts +8 -0
  79. package/dist/cjs/auth/verifiers/index.d.ts.map +1 -0
  80. package/dist/cjs/auth/verifiers/index.js +38 -0
  81. package/dist/cjs/auth/verifiers/jwtVerifier.d.ts +26 -0
  82. package/dist/cjs/auth/verifiers/jwtVerifier.d.ts.map +1 -0
  83. package/dist/cjs/auth/verifiers/jwtVerifier.js +86 -0
  84. package/dist/cjs/auth/verifiers/secretKeyVerifier.d.ts +14 -0
  85. package/dist/cjs/auth/verifiers/secretKeyVerifier.d.ts.map +1 -0
  86. package/dist/cjs/auth/verifiers/secretKeyVerifier.js +40 -0
  87. package/dist/cjs/auth/verifiers/sha1Verifier.d.ts +25 -0
  88. package/dist/cjs/auth/verifiers/sha1Verifier.d.ts.map +1 -0
  89. package/dist/cjs/auth/verifiers/sha1Verifier.js +85 -0
  90. package/dist/cjs/auth/verifiers/sha256Verifier.d.ts +25 -0
  91. package/dist/cjs/auth/verifiers/sha256Verifier.d.ts.map +1 -0
  92. package/dist/cjs/auth/verifiers/sha256Verifier.js +85 -0
  93. package/dist/cjs/auth/verifiers/skipVerifier.d.ts +13 -0
  94. package/dist/cjs/auth/verifiers/skipVerifier.d.ts.map +1 -0
  95. package/dist/cjs/auth/verifiers/skipVerifier.js +37 -0
  96. package/dist/cjs/auth/verifiers/timestampSchemeVerifier.d.ts +16 -0
  97. package/dist/cjs/auth/verifiers/timestampSchemeVerifier.d.ts.map +1 -0
  98. package/dist/cjs/auth/verifiers/timestampSchemeVerifier.js +81 -0
  99. package/dist/cjs/bins/redwood.d.ts +9 -0
  100. package/dist/cjs/bins/redwood.d.ts.map +1 -0
  101. package/dist/cjs/bins/redwood.js +36 -0
  102. package/dist/cjs/bins/rwfw.d.ts +3 -0
  103. package/dist/cjs/bins/rwfw.d.ts.map +1 -0
  104. package/dist/cjs/bins/rwfw.js +36 -0
  105. package/dist/cjs/bins/tsc.d.ts +3 -0
  106. package/dist/cjs/bins/tsc.d.ts.map +1 -0
  107. package/dist/cjs/bins/tsc.js +30 -0
  108. package/dist/cjs/cache/clients/BaseClient.d.ts +11 -0
  109. package/dist/cjs/cache/clients/BaseClient.d.ts.map +1 -0
  110. package/dist/cjs/cache/clients/BaseClient.js +27 -0
  111. package/dist/cjs/cache/clients/InMemoryClient.d.ts +31 -0
  112. package/dist/cjs/cache/clients/InMemoryClient.d.ts.map +1 -0
  113. package/dist/cjs/cache/clients/InMemoryClient.js +100 -0
  114. package/dist/cjs/cache/clients/MemcachedClient.d.ts +16 -0
  115. package/dist/cjs/cache/clients/MemcachedClient.d.ts.map +1 -0
  116. package/dist/cjs/cache/clients/MemcachedClient.js +75 -0
  117. package/dist/cjs/cache/clients/RedisClient.d.ts +20 -0
  118. package/dist/cjs/cache/clients/RedisClient.d.ts.map +1 -0
  119. package/dist/cjs/cache/clients/RedisClient.js +79 -0
  120. package/dist/cjs/cache/errors.d.ts +4 -0
  121. package/dist/cjs/cache/errors.d.ts.map +1 -0
  122. package/dist/cjs/cache/errors.js +33 -0
  123. package/dist/cjs/cache/index.d.ts +35 -0
  124. package/dist/cjs/cache/index.d.ts.map +1 -0
  125. package/dist/cjs/cache/index.js +171 -0
  126. package/dist/cjs/cors.d.ts +16 -0
  127. package/dist/cjs/cors.d.ts.map +1 -0
  128. package/dist/cjs/cors.js +93 -0
  129. package/dist/cjs/errors.d.ts +5 -0
  130. package/dist/cjs/errors.d.ts.map +1 -0
  131. package/dist/cjs/errors.js +38 -0
  132. package/dist/cjs/event.d.ts +3 -0
  133. package/dist/cjs/event.d.ts.map +1 -0
  134. package/dist/cjs/event.js +34 -0
  135. package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts +4 -0
  136. package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts.map +1 -0
  137. package/dist/cjs/functions/fixtures/apiGatewayProxyEvent.fixture.js +72 -0
  138. package/dist/cjs/index.d.ts +11 -0
  139. package/dist/cjs/index.d.ts.map +1 -0
  140. package/dist/cjs/index.js +82 -0
  141. package/dist/cjs/logger/index.d.ts +179 -0
  142. package/dist/cjs/logger/index.d.ts.map +1 -0
  143. package/dist/cjs/logger/index.js +195 -0
  144. package/dist/cjs/package.json +1 -0
  145. package/dist/cjs/transforms.d.ts +35 -0
  146. package/dist/cjs/transforms.d.ts.map +1 -0
  147. package/dist/cjs/transforms.js +98 -0
  148. package/dist/cjs/types.d.ts +25 -0
  149. package/dist/cjs/types.d.ts.map +1 -0
  150. package/dist/cjs/types.js +16 -0
  151. package/dist/cjs/validations/errors.d.ts +101 -0
  152. package/dist/cjs/validations/errors.d.ts.map +1 -0
  153. package/dist/cjs/validations/errors.js +298 -0
  154. package/dist/cjs/validations/validations.d.ts +222 -0
  155. package/dist/cjs/validations/validations.d.ts.map +1 -0
  156. package/dist/cjs/validations/validations.js +351 -0
  157. package/dist/cjs/webhooks/index.d.ts +76 -0
  158. package/dist/cjs/webhooks/index.d.ts.map +1 -0
  159. package/dist/cjs/webhooks/index.js +107 -0
  160. package/dist/cors.d.ts +16 -0
  161. package/dist/cors.d.ts.map +1 -0
  162. package/dist/cors.js +69 -0
  163. package/dist/errors.d.ts +5 -0
  164. package/dist/errors.d.ts.map +1 -0
  165. package/dist/errors.js +14 -0
  166. package/dist/event.d.ts +3 -0
  167. package/dist/event.d.ts.map +1 -0
  168. package/dist/event.js +10 -0
  169. package/dist/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts +4 -0
  170. package/dist/functions/fixtures/apiGatewayProxyEvent.fixture.d.ts.map +1 -0
  171. package/dist/functions/fixtures/apiGatewayProxyEvent.fixture.js +48 -0
  172. package/dist/index.d.ts +11 -0
  173. package/dist/index.d.ts.map +1 -0
  174. package/dist/index.js +38 -0
  175. package/dist/logger/index.d.ts +179 -0
  176. package/dist/logger/index.d.ts.map +1 -0
  177. package/dist/logger/index.js +152 -0
  178. package/dist/package.json +1 -0
  179. package/dist/transforms.d.ts +35 -0
  180. package/dist/transforms.d.ts.map +1 -0
  181. package/dist/transforms.js +70 -0
  182. package/dist/types.d.ts +25 -0
  183. package/dist/types.d.ts.map +1 -0
  184. package/dist/types.js +0 -0
  185. package/dist/validations/errors.d.ts +101 -0
  186. package/dist/validations/errors.d.ts.map +1 -0
  187. package/dist/validations/errors.js +239 -0
  188. package/dist/validations/validations.d.ts +222 -0
  189. package/dist/validations/validations.d.ts.map +1 -0
  190. package/dist/validations/validations.js +314 -0
  191. package/dist/webhooks/index.d.ts +76 -0
  192. package/dist/webhooks/index.d.ts.map +1 -0
  193. package/dist/webhooks/index.js +85 -0
  194. package/package.json +130 -0
@@ -0,0 +1,55 @@
1
+ import jwt from "jsonwebtoken";
2
+ import {
3
+ WebhookSignError,
4
+ WebhookVerificationError,
5
+ DEFAULT_WEBHOOK_SECRET
6
+ } from "./common.js";
7
+ const createSignature = ({
8
+ payload,
9
+ secret = DEFAULT_WEBHOOK_SECRET,
10
+ options
11
+ }) => {
12
+ try {
13
+ const signOptions = options?.issuer ? { issuer: options?.issuer } : void 0;
14
+ return jwt.sign(payload, secret, { ...signOptions });
15
+ } catch (error) {
16
+ throw new WebhookSignError(error.message);
17
+ }
18
+ };
19
+ const verifySignature = ({
20
+ payload,
21
+ secret = DEFAULT_WEBHOOK_SECRET,
22
+ signature,
23
+ options
24
+ }) => {
25
+ try {
26
+ if (payload === void 0 || payload?.length === 0) {
27
+ console.warn("Missing payload");
28
+ }
29
+ if (options?.issuer) {
30
+ jwt.verify(signature, secret, { issuer: options?.issuer });
31
+ } else {
32
+ jwt.verify(signature, secret);
33
+ }
34
+ return true;
35
+ } catch {
36
+ throw new WebhookVerificationError();
37
+ }
38
+ };
39
+ const jwtVerifier = (options) => {
40
+ return {
41
+ sign: ({ payload, secret }) => {
42
+ return createSignature({ payload, secret, options });
43
+ },
44
+ verify: ({ payload, secret, signature }) => {
45
+ return verifySignature({ payload, secret, signature, options });
46
+ },
47
+ type: "jwtVerifier"
48
+ };
49
+ };
50
+ var jwtVerifier_default = jwtVerifier;
51
+ export {
52
+ jwtVerifier_default as default,
53
+ jwtVerifier,
54
+ verifySignature
55
+ };
@@ -0,0 +1,14 @@
1
+ import type { WebhookVerifier, VerifyOptions } from './common.js';
2
+ export interface SecretKeyVerifier extends WebhookVerifier {
3
+ type: 'secretKeyVerifier';
4
+ }
5
+ /**
6
+ *
7
+ * Secret Key Verifier
8
+ *
9
+ * Use when the payload is not signed, but rather authorized via a known secret key
10
+ *
11
+ */
12
+ declare const secretKeyVerifier: (_options?: VerifyOptions) => SecretKeyVerifier;
13
+ export default secretKeyVerifier;
14
+ //# sourceMappingURL=secretKeyVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretKeyVerifier.d.ts","sourceRoot":"","sources":["../../../src/auth/verifiers/secretKeyVerifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEjE,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,IAAI,EAAE,mBAAmB,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,QAAA,MAAM,iBAAiB,cAAe,aAAa,KAAG,iBAgBrD,CAAA;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { WebhookVerificationError, DEFAULT_WEBHOOK_SECRET } from "./common.js";
2
+ const secretKeyVerifier = (_options) => {
3
+ return {
4
+ sign: ({ secret }) => {
5
+ return secret;
6
+ },
7
+ verify: ({ signature, secret = DEFAULT_WEBHOOK_SECRET }) => {
8
+ const verified = signature === secret;
9
+ if (!verified) {
10
+ throw new WebhookVerificationError();
11
+ }
12
+ return verified;
13
+ },
14
+ type: "secretKeyVerifier"
15
+ };
16
+ };
17
+ var secretKeyVerifier_default = secretKeyVerifier;
18
+ export {
19
+ secretKeyVerifier_default as default
20
+ };
@@ -0,0 +1,25 @@
1
+ import type { WebhookVerifier, VerifyOptions } from './common.js';
2
+ export interface Sha1Verifier extends WebhookVerifier {
3
+ type: 'sha1Verifier';
4
+ }
5
+ /**
6
+ *
7
+ * verifySignature
8
+ *
9
+ */
10
+ export declare const verifySignature: ({ payload, secret, signature, }: {
11
+ payload: string | Record<string, unknown>;
12
+ secret: string;
13
+ signature: string;
14
+ }) => boolean;
15
+ /**
16
+ *
17
+ * SHA1 HMAC Payload Verifier
18
+ *
19
+ * Based on Vercel's webhook payload verification
20
+ * @see https://vercel.com/docs/api#integrations/webhooks/securing-webhooks
21
+ *
22
+ */
23
+ declare const sha1Verifier: (_options?: VerifyOptions) => Sha1Verifier;
24
+ export default sha1Verifier;
25
+ //# sourceMappingURL=sha1Verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha1Verifier.d.ts","sourceRoot":"","sources":["../../../src/auth/verifiers/sha1Verifier.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEjE,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,IAAI,EAAE,cAAc,CAAA;CACrB;AAkCD;;;;GAIG;AACH,eAAO,MAAM,eAAe,oCAIzB;IACD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB,KAAG,OA+BH,CAAA;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,YAAY,cAAe,aAAa,KAAG,YAUhD,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { createHmac, timingSafeEqual } from "crypto";
2
+ import {
3
+ WebhookVerificationError,
4
+ VERIFICATION_ERROR_MESSAGE,
5
+ DEFAULT_WEBHOOK_SECRET
6
+ } from "./common.js";
7
+ function toNormalizedJsonString(payload) {
8
+ return JSON.stringify(payload).replace(/[^\\]\\u[\da-f]{4}/g, (s) => {
9
+ return s.substr(0, 3) + s.substr(3).toUpperCase();
10
+ });
11
+ }
12
+ const createSignature = ({
13
+ payload,
14
+ secret = DEFAULT_WEBHOOK_SECRET
15
+ }) => {
16
+ const algorithm = "sha1";
17
+ const hmac = createHmac(algorithm, secret);
18
+ payload = typeof payload === "string" ? payload : toNormalizedJsonString(payload);
19
+ const digest = Buffer.from(
20
+ algorithm + "=" + hmac.update(payload).digest("hex"),
21
+ "utf8"
22
+ );
23
+ return digest.toString();
24
+ };
25
+ const verifySignature = ({
26
+ payload,
27
+ secret = DEFAULT_WEBHOOK_SECRET,
28
+ signature
29
+ }) => {
30
+ try {
31
+ const algorithm = signature.split("=")[0];
32
+ const webhookSignature = Buffer.from(signature || "", "utf8");
33
+ const hmac = createHmac(algorithm, secret);
34
+ payload = typeof payload === "string" ? payload : toNormalizedJsonString(payload);
35
+ const digest = Buffer.from(
36
+ algorithm + "=" + hmac.update(payload).digest("hex"),
37
+ "utf8"
38
+ );
39
+ const verified = webhookSignature.length === digest.length && timingSafeEqual(digest, webhookSignature);
40
+ if (verified) {
41
+ return verified;
42
+ }
43
+ throw new WebhookVerificationError();
44
+ } catch (error) {
45
+ throw new WebhookVerificationError(
46
+ `${VERIFICATION_ERROR_MESSAGE}: ${error.message}`
47
+ );
48
+ }
49
+ };
50
+ const sha1Verifier = (_options) => {
51
+ return {
52
+ sign: ({ payload, secret }) => {
53
+ return createSignature({ payload, secret });
54
+ },
55
+ verify: ({ payload, secret, signature }) => {
56
+ return verifySignature({ payload, secret, signature });
57
+ },
58
+ type: "sha1Verifier"
59
+ };
60
+ };
61
+ var sha1Verifier_default = sha1Verifier;
62
+ export {
63
+ sha1Verifier_default as default,
64
+ verifySignature
65
+ };
@@ -0,0 +1,25 @@
1
+ import type { WebhookVerifier, VerifyOptions } from './common.js';
2
+ export interface Sha256Verifier extends WebhookVerifier {
3
+ type: 'sha256Verifier';
4
+ }
5
+ /**
6
+ *
7
+ * verifySignature
8
+ *
9
+ */
10
+ export declare const verifySignature: ({ payload, secret, signature, }: {
11
+ payload: string | Record<string, unknown>;
12
+ secret: string;
13
+ signature: string;
14
+ }) => boolean;
15
+ /**
16
+ *
17
+ * SHA256 HMAC Payload Verifier
18
+ *
19
+ * Based on GitHub's webhook payload verification
20
+ * @see https://docs.github.com/en/developers/webhooks-and-events/securing-your-webhooks
21
+ *
22
+ */
23
+ declare const sha256Verifier: (_options?: VerifyOptions) => Sha256Verifier;
24
+ export default sha256Verifier;
25
+ //# sourceMappingURL=sha256Verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha256Verifier.d.ts","sourceRoot":"","sources":["../../../src/auth/verifiers/sha256Verifier.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEjE,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,IAAI,EAAE,gBAAgB,CAAA;CACvB;AAkCD;;;;GAIG;AACH,eAAO,MAAM,eAAe,oCAIzB;IACD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB,KAAG,OA+BH,CAAA;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,cAAc,cAAe,aAAa,KAAG,cAUlD,CAAA;AAED,eAAe,cAAc,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { createHmac, timingSafeEqual } from "crypto";
2
+ import {
3
+ WebhookVerificationError,
4
+ VERIFICATION_ERROR_MESSAGE,
5
+ DEFAULT_WEBHOOK_SECRET
6
+ } from "./common.js";
7
+ function toNormalizedJsonString(payload) {
8
+ return JSON.stringify(payload).replace(/[^\\]\\u[\da-f]{4}/g, (s) => {
9
+ return s.substr(0, 3) + s.substr(3).toUpperCase();
10
+ });
11
+ }
12
+ const createSignature = ({
13
+ payload,
14
+ secret = DEFAULT_WEBHOOK_SECRET
15
+ }) => {
16
+ const algorithm = "sha256";
17
+ const hmac = createHmac(algorithm, secret);
18
+ payload = typeof payload === "string" ? payload : toNormalizedJsonString(payload);
19
+ const digest = Buffer.from(
20
+ algorithm + "=" + hmac.update(payload).digest("hex"),
21
+ "utf8"
22
+ );
23
+ return digest.toString();
24
+ };
25
+ const verifySignature = ({
26
+ payload,
27
+ secret = DEFAULT_WEBHOOK_SECRET,
28
+ signature
29
+ }) => {
30
+ try {
31
+ const algorithm = signature.split("=")[0];
32
+ const webhookSignature = Buffer.from(signature || "", "utf8");
33
+ const hmac = createHmac(algorithm, secret);
34
+ payload = typeof payload === "string" ? payload : toNormalizedJsonString(payload);
35
+ const digest = Buffer.from(
36
+ algorithm + "=" + hmac.update(payload).digest("hex"),
37
+ "utf8"
38
+ );
39
+ const verified = webhookSignature.length === digest.length && timingSafeEqual(digest, webhookSignature);
40
+ if (verified) {
41
+ return verified;
42
+ }
43
+ throw new WebhookVerificationError();
44
+ } catch (error) {
45
+ throw new WebhookVerificationError(
46
+ `${VERIFICATION_ERROR_MESSAGE}: ${error.message}`
47
+ );
48
+ }
49
+ };
50
+ const sha256Verifier = (_options) => {
51
+ return {
52
+ sign: ({ payload, secret }) => {
53
+ return createSignature({ payload, secret });
54
+ },
55
+ verify: ({ payload, secret, signature }) => {
56
+ return verifySignature({ payload, secret, signature });
57
+ },
58
+ type: "sha256Verifier"
59
+ };
60
+ };
61
+ var sha256Verifier_default = sha256Verifier;
62
+ export {
63
+ sha256Verifier_default as default,
64
+ verifySignature
65
+ };
@@ -0,0 +1,13 @@
1
+ import type { VerifyOptions, WebhookVerifier } from './common.js';
2
+ export interface SkipVerifier extends WebhookVerifier {
3
+ type: 'skipVerifier';
4
+ }
5
+ /**
6
+ * skipVerifier skips webhook signature verification.
7
+ * Use when there is no signature provided or the webhook is
8
+ * entirely public.
9
+ *
10
+ */
11
+ declare const skipVerifier: (_options?: VerifyOptions) => SkipVerifier;
12
+ export default skipVerifier;
13
+ //# sourceMappingURL=skipVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skipVerifier.d.ts","sourceRoot":"","sources":["../../../src/auth/verifiers/skipVerifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEjE,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,IAAI,EAAE,cAAc,CAAA;CACrB;AACD;;;;;GAKG;AACH,QAAA,MAAM,YAAY,cAAe,aAAa,KAAG,YAYhD,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -0,0 +1,17 @@
1
+ const skipVerifier = (_options) => {
2
+ return {
3
+ sign: () => {
4
+ console.warn(`No signature is created for the skipVerifier verifier`);
5
+ return "";
6
+ },
7
+ verify: () => {
8
+ console.warn(`The skipVerifier verifier considers all signatures valid`);
9
+ return true;
10
+ },
11
+ type: "skipVerifier"
12
+ };
13
+ };
14
+ var skipVerifier_default = skipVerifier;
15
+ export {
16
+ skipVerifier_default as default
17
+ };
@@ -0,0 +1,16 @@
1
+ import type { WebhookVerifier, VerifyOptions } from './common.js';
2
+ export interface TimestampSchemeVerifier extends WebhookVerifier {
3
+ type: 'timestampSchemeVerifier';
4
+ }
5
+ /**
6
+ *
7
+ * Timestamp & Scheme Verifier
8
+ *
9
+ * Based on Stripe's secure webhook implementation
10
+ *
11
+ * @see https://stripe.com/docs/webhooks/signatures
12
+ *
13
+ */
14
+ declare const timestampSchemeVerifier: (options?: VerifyOptions) => TimestampSchemeVerifier;
15
+ export default timestampSchemeVerifier;
16
+ //# sourceMappingURL=timestampSchemeVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestampSchemeVerifier.d.ts","sourceRoot":"","sources":["../../../src/auth/verifiers/timestampSchemeVerifier.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEjE,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,IAAI,EAAE,yBAAyB,CAAA;CAChC;AAwHD;;;;;;;;GAQG;AACH,QAAA,MAAM,uBAAuB,aACjB,aAAa,KACtB,uBAcF,CAAA;AAED,eAAe,uBAAuB,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { createHmac } from "crypto";
2
+ import {
3
+ WebhookVerificationError,
4
+ DEFAULT_WEBHOOK_SECRET,
5
+ DEFAULT_TOLERANCE
6
+ } from "./common.js";
7
+ const getHmac = ({ secret }) => {
8
+ if (typeof secret === "undefined" || secret === "") {
9
+ throw new WebhookVerificationError();
10
+ }
11
+ return createHmac("sha256", secret);
12
+ };
13
+ const createSignature = ({
14
+ payload,
15
+ secret = DEFAULT_WEBHOOK_SECRET,
16
+ timestamp = Date.now()
17
+ }) => {
18
+ const hmac = getHmac({ secret });
19
+ hmac.update(timestamp + "." + payload);
20
+ return `t=${timestamp},v1=${hmac.digest("hex")}`;
21
+ };
22
+ const verifySignature = ({
23
+ payload,
24
+ secret = DEFAULT_WEBHOOK_SECRET,
25
+ signature,
26
+ options
27
+ }) => {
28
+ const match = /t=(\d+),v1=([\da-f]+)/.exec(signature);
29
+ if (!match) {
30
+ throw new WebhookVerificationError();
31
+ }
32
+ const signedStamp = Number(match[1]);
33
+ const signedPayload = match[2];
34
+ const timestamp = options?.currentTimestampOverride ?? Date.now();
35
+ const tolerance = options?.tolerance ?? DEFAULT_TOLERANCE;
36
+ const difference = Math.abs(timestamp - signedStamp);
37
+ if (difference > tolerance) {
38
+ throw new WebhookVerificationError();
39
+ }
40
+ const hmac = getHmac({ secret });
41
+ hmac.update(signedStamp + "." + payload);
42
+ if (hmac.digest("hex") === signedPayload) {
43
+ return true;
44
+ }
45
+ throw new WebhookVerificationError();
46
+ };
47
+ const timestampSchemeVerifier = (options) => {
48
+ return {
49
+ sign: ({ payload, secret }) => {
50
+ return createSignature({
51
+ payload,
52
+ secret,
53
+ timestamp: options?.currentTimestampOverride
54
+ });
55
+ },
56
+ verify: ({ payload, secret, signature }) => {
57
+ return verifySignature({ payload, secret, signature, options });
58
+ },
59
+ type: "timestampSchemeVerifier"
60
+ };
61
+ };
62
+ var timestampSchemeVerifier_default = timestampSchemeVerifier;
63
+ export {
64
+ timestampSchemeVerifier_default as default
65
+ };
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * This file lets users run the Cedar CLI commands inside the /api directory
4
+ * in their projects.
5
+ * This works because of the "bin" field in the @cedarjs/api package.json file
6
+ * that points to this file.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=redwood.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redwood.d.ts","sourceRoot":"","sources":["../../src/bins/redwood.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=rwfw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rwfw.d.ts","sourceRoot":"","sources":["../../src/bins/rwfw.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=tsc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsc.d.ts","sourceRoot":"","sources":["../../src/bins/tsc.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ export default abstract class BaseClient {
2
+ constructor();
3
+ disconnect?(): void | Promise<void>;
4
+ abstract connect(): void | Promise<void>;
5
+ abstract get(key: string): any;
6
+ abstract set(key: string, value: unknown, options: {
7
+ expires?: number;
8
+ }): Promise<any> | any;
9
+ abstract del(key: string): Promise<boolean> | any;
10
+ }
11
+ //# sourceMappingURL=BaseClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseClient.d.ts","sourceRoot":"","sources":["../../../src/cache/clients/BaseClient.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,UAAU;;IAKtC,UAAU,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEnC,QAAQ,CAAC,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAGxC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAG9B,QAAQ,CAAC,GAAG,CACV,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG;IAGrB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG;CAClD"}
@@ -0,0 +1,7 @@
1
+ class BaseClient {
2
+ constructor() {
3
+ }
4
+ }
5
+ export {
6
+ BaseClient as default
7
+ };
@@ -0,0 +1,31 @@
1
+ import BaseClient from './BaseClient.js';
2
+ type CacheOptions = {
3
+ expires?: number;
4
+ };
5
+ export default class InMemoryClient extends BaseClient {
6
+ storage: Record<string, {
7
+ expires: number;
8
+ value: string;
9
+ }>;
10
+ constructor(data?: {});
11
+ /**
12
+ * Special function for testing, only available in InMemoryClient
13
+ *
14
+ * Returns deserialized content of cache as an array of values (without cache keys)
15
+ *
16
+ */
17
+ get contents(): any[];
18
+ disconnect(): Promise<void>;
19
+ connect(): Promise<void>;
20
+ get(key: string): Promise<any>;
21
+ set(key: string, value: unknown, options?: CacheOptions): Promise<boolean>;
22
+ del(key: string): Promise<boolean>;
23
+ /**
24
+ * Special functions for testing, only available in InMemoryClient
25
+ */
26
+ clear(): Promise<void>;
27
+ cacheKeyForValue(value: any): string | null;
28
+ isCached(value: any): boolean;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=InMemoryClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryClient.d.ts","sourceRoot":"","sources":["../../../src/cache/clients/InMemoryClient.ts"],"names":[],"mappings":"AAEA,OAAO,UAAU,MAAM,iBAAiB,CAAA;AAExC,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU;IACpD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;gBAG/C,IAAI,KAAK;IAKrB;;;;;OAKG;IACH,IAAI,QAAQ,UAIX;IAGK,UAAU;IACV,OAAO;IAEP,GAAG,CAAC,GAAG,EAAE,MAAM;IAWf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB;IAU3D,GAAG,CAAC,GAAG,EAAE,MAAM;IASrB;;OAEG;IACG,KAAK;IAIX,gBAAgB,CAAC,KAAK,EAAE,GAAG;IAU3B,QAAQ,CAAC,KAAK,EAAE,GAAG;CAGpB"}
@@ -0,0 +1,70 @@
1
+ import BaseClient from "./BaseClient.js";
2
+ class InMemoryClient extends BaseClient {
3
+ storage;
4
+ // initialize with pre-cached data if needed
5
+ constructor(data = {}) {
6
+ super();
7
+ this.storage = data;
8
+ }
9
+ /**
10
+ * Special function for testing, only available in InMemoryClient
11
+ *
12
+ * Returns deserialized content of cache as an array of values (without cache keys)
13
+ *
14
+ */
15
+ get contents() {
16
+ return Object.values(this.storage).map(
17
+ (cacheObj) => JSON.parse(cacheObj.value)
18
+ );
19
+ }
20
+ // Not needed for InMemoryClient
21
+ async disconnect() {
22
+ }
23
+ async connect() {
24
+ }
25
+ async get(key) {
26
+ const now = /* @__PURE__ */ new Date();
27
+ if (this.storage[key] && this.storage[key].expires > now.getTime()) {
28
+ return JSON.parse(this.storage[key].value);
29
+ } else {
30
+ delete this.storage[key];
31
+ return null;
32
+ }
33
+ }
34
+ // stores expiration dates as epoch
35
+ async set(key, value, options = {}) {
36
+ const now = /* @__PURE__ */ new Date();
37
+ now.setSeconds(now.getSeconds() + (options?.expires || 31536e4));
38
+ const data = { expires: now.getTime(), value: JSON.stringify(value) };
39
+ this.storage[key] = data;
40
+ return true;
41
+ }
42
+ async del(key) {
43
+ if (this.storage[key]) {
44
+ delete this.storage[key];
45
+ return true;
46
+ } else {
47
+ return false;
48
+ }
49
+ }
50
+ /**
51
+ * Special functions for testing, only available in InMemoryClient
52
+ */
53
+ async clear() {
54
+ this.storage = {};
55
+ }
56
+ cacheKeyForValue(value) {
57
+ for (const [cacheKey, cacheObj] of Object.entries(this.storage)) {
58
+ if (cacheObj.value === JSON.stringify(value)) {
59
+ return cacheKey;
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ isCached(value) {
65
+ return !!this.cacheKeyForValue(value);
66
+ }
67
+ }
68
+ export {
69
+ InMemoryClient as default
70
+ };
@@ -0,0 +1,16 @@
1
+ import type { Client as ClientType, ClientOptions, ServerOptions } from 'memjs';
2
+ import BaseClient from './BaseClient.js';
3
+ export default class MemcachedClient extends BaseClient {
4
+ client?: ClientType | null;
5
+ servers: string;
6
+ options: (ClientOptions<string | Buffer, Buffer | null> & ServerOptions) | undefined;
7
+ constructor(servers: string, options?: ClientOptions & ServerOptions);
8
+ connect(): Promise<void>;
9
+ disconnect(): Promise<void>;
10
+ get(key: string): Promise<any>;
11
+ set(key: string, value: unknown, options: {
12
+ expires?: number;
13
+ }): Promise<boolean | undefined>;
14
+ del(key: string): Promise<boolean | undefined>;
15
+ }
16
+ //# sourceMappingURL=MemcachedClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemcachedClient.d.ts","sourceRoot":"","sources":["../../../src/cache/clients/MemcachedClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE/E,OAAO,UAAU,MAAM,iBAAiB,CAAA;AAExC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU;IACrD,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,OAAO,SAAA;IACP,OAAO,8EAAA;gBAEK,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,aAAa;IAM9D,OAAO;IAKP,UAAU;IAKV,GAAG,CAAC,GAAG,EAAE,MAAM;IAcf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ9D,GAAG,CAAC,GAAG,EAAE,MAAM;CAQtB"}
@@ -0,0 +1,45 @@
1
+ import BaseClient from "./BaseClient.js";
2
+ class MemcachedClient extends BaseClient {
3
+ client;
4
+ servers;
5
+ options;
6
+ constructor(servers, options) {
7
+ super();
8
+ this.servers = servers;
9
+ this.options = options;
10
+ }
11
+ async connect() {
12
+ const { Client: MemCachedClient } = await import("memjs");
13
+ this.client = MemCachedClient.create(this.servers, this.options);
14
+ }
15
+ async disconnect() {
16
+ this.client?.close();
17
+ this.client = null;
18
+ }
19
+ async get(key) {
20
+ if (!this.client) {
21
+ await this.connect();
22
+ }
23
+ const result = await this.client?.get(key);
24
+ if (result?.value) {
25
+ return JSON.parse(result.value.toString());
26
+ } else {
27
+ return result?.value;
28
+ }
29
+ }
30
+ async set(key, value, options) {
31
+ if (!this.client) {
32
+ await this.connect();
33
+ }
34
+ return this.client?.set(key, JSON.stringify(value), options);
35
+ }
36
+ async del(key) {
37
+ if (!this.client) {
38
+ await this.connect();
39
+ }
40
+ return this.client?.delete(key);
41
+ }
42
+ }
43
+ export {
44
+ MemcachedClient as default
45
+ };
@@ -0,0 +1,20 @@
1
+ import type { RedisClientType, RedisClientOptions } from 'redis';
2
+ import type { Logger } from '../../logger/index.js';
3
+ import BaseClient from './BaseClient.js';
4
+ type LoggerOptions = {
5
+ logger?: Logger;
6
+ };
7
+ export default class RedisClient extends BaseClient {
8
+ client?: RedisClientType | null;
9
+ logger?: Logger;
10
+ redisOptions?: RedisClientOptions;
11
+ constructor(options: RedisClientOptions & LoggerOptions);
12
+ connect(): Promise<void>;
13
+ get(key: string): Promise<any>;
14
+ set(key: string, value: unknown, options: {
15
+ expires?: number;
16
+ }): Promise<string | null | undefined>;
17
+ del(key: string): Promise<boolean>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=RedisClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisClient.d.ts","sourceRoot":"","sources":["../../../src/cache/clients/RedisClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,UAAU,MAAM,iBAAiB,CAAA;AAMxC,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,UAAU;IACjD,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,kBAAkB,CAAA;gBAErB,OAAO,EAAE,kBAAkB,GAAG,aAAa;IAQjD,OAAO;IAiBP,GAAG,CAAC,GAAG,EAAE,MAAM;IAUf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAc9D,GAAG,CAAC,GAAG,EAAE,MAAM;CAQtB"}