glasswork 1.0.1 → 1.2.0

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 (247) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/README.md +37 -2
  3. package/dist/audit/audit-logger.d.ts +22 -0
  4. package/dist/audit/audit-logger.d.ts.map +1 -0
  5. package/dist/audit/audit-logger.js +44 -0
  6. package/dist/audit/audit-logger.js.map +1 -0
  7. package/dist/audit/context.d.ts +13 -0
  8. package/dist/audit/context.d.ts.map +1 -0
  9. package/dist/audit/context.js +66 -0
  10. package/dist/audit/context.js.map +1 -0
  11. package/dist/audit/index.d.ts +8 -0
  12. package/dist/audit/index.d.ts.map +1 -0
  13. package/dist/audit/index.js +7 -0
  14. package/dist/audit/index.js.map +1 -0
  15. package/dist/audit/types.d.ts +74 -0
  16. package/dist/audit/types.d.ts.map +1 -0
  17. package/dist/audit/types.js +2 -0
  18. package/dist/audit/types.js.map +1 -0
  19. package/dist/auth/abilities.d.ts +1 -1
  20. package/dist/auth/abilities.d.ts.map +1 -1
  21. package/dist/auth/abilities.js.map +1 -1
  22. package/dist/auth/better-auth-provider.d.ts +17 -6
  23. package/dist/auth/better-auth-provider.d.ts.map +1 -1
  24. package/dist/auth/better-auth-provider.js +16 -9
  25. package/dist/auth/better-auth-provider.js.map +1 -1
  26. package/dist/auth/index.d.ts +2 -2
  27. package/dist/auth/index.d.ts.map +1 -1
  28. package/dist/auth/index.js.map +1 -1
  29. package/dist/auth/middleware.d.ts +10 -8
  30. package/dist/auth/middleware.d.ts.map +1 -1
  31. package/dist/auth/middleware.js +27 -11
  32. package/dist/auth/middleware.js.map +1 -1
  33. package/dist/auth/types.d.ts +13 -2
  34. package/dist/auth/types.d.ts.map +1 -1
  35. package/dist/config/config-service.d.ts.map +1 -1
  36. package/dist/config/config-service.js.map +1 -1
  37. package/dist/config/providers.js.map +1 -1
  38. package/dist/core/bootstrap.d.ts.map +1 -1
  39. package/dist/core/bootstrap.js +16 -7
  40. package/dist/core/bootstrap.js.map +1 -1
  41. package/dist/core/module-graph.js +3 -0
  42. package/dist/core/module-graph.js.map +1 -1
  43. package/dist/core/request-scope.d.ts +12 -0
  44. package/dist/core/request-scope.d.ts.map +1 -0
  45. package/dist/core/request-scope.js +86 -0
  46. package/dist/core/request-scope.js.map +1 -0
  47. package/dist/core/route-factory.d.ts +1 -0
  48. package/dist/core/route-factory.d.ts.map +1 -1
  49. package/dist/core/types.d.ts +6 -1
  50. package/dist/core/types.d.ts.map +1 -1
  51. package/dist/email/compiler/compiler.d.ts.map +1 -1
  52. package/dist/email/compiler/compiler.js +72 -20
  53. package/dist/email/compiler/compiler.js.map +1 -1
  54. package/dist/email/compiler/tokenizer.js +4 -2
  55. package/dist/email/compiler/tokenizer.js.map +1 -1
  56. package/dist/email/compiler/types.d.ts +2 -0
  57. package/dist/email/compiler/types.d.ts.map +1 -1
  58. package/dist/email/email-service.d.ts.map +1 -1
  59. package/dist/email/template-registry.d.ts.map +1 -1
  60. package/dist/email/templated-email-service.d.ts.map +1 -1
  61. package/dist/email/transports/mock-transport.d.ts.map +1 -1
  62. package/dist/email/transports/ses-transport.d.ts +8 -0
  63. package/dist/email/transports/ses-transport.d.ts.map +1 -1
  64. package/dist/email/transports/ses-transport.js +132 -25
  65. package/dist/email/transports/ses-transport.js.map +1 -1
  66. package/dist/email/webhooks/handler-factory.d.ts +1 -0
  67. package/dist/email/webhooks/handler-factory.d.ts.map +1 -1
  68. package/dist/email/webhooks/handler-factory.js +40 -38
  69. package/dist/email/webhooks/handler-factory.js.map +1 -1
  70. package/dist/email/webhooks/notification-parser.d.ts +1 -1
  71. package/dist/email/webhooks/notification-parser.js +1 -1
  72. package/dist/email/webhooks/signature-verification.d.ts +4 -2
  73. package/dist/email/webhooks/signature-verification.d.ts.map +1 -1
  74. package/dist/email/webhooks/signature-verification.js +63 -8
  75. package/dist/email/webhooks/signature-verification.js.map +1 -1
  76. package/dist/email/webhooks/subscription-handler.d.ts +4 -2
  77. package/dist/email/webhooks/subscription-handler.d.ts.map +1 -1
  78. package/dist/email/webhooks/subscription-handler.js +42 -6
  79. package/dist/email/webhooks/subscription-handler.js.map +1 -1
  80. package/dist/email/webhooks/types.d.ts +17 -2
  81. package/dist/email/webhooks/types.d.ts.map +1 -1
  82. package/dist/hono-context.d.ts +1 -1
  83. package/dist/hono-context.d.ts.map +1 -1
  84. package/dist/http/error-handler.js.map +1 -1
  85. package/dist/http/errors.d.ts.map +1 -1
  86. package/dist/http/errors.js.map +1 -1
  87. package/dist/http/route-authorization.d.ts +1 -2
  88. package/dist/http/route-authorization.d.ts.map +1 -1
  89. package/dist/http/route-authorization.js.map +1 -1
  90. package/dist/http/route-context.d.ts +4 -2
  91. package/dist/http/route-context.d.ts.map +1 -1
  92. package/dist/http/route-context.js +7 -2
  93. package/dist/http/route-context.js.map +1 -1
  94. package/dist/http/route-helpers.d.ts +3 -3
  95. package/dist/http/route-helpers.d.ts.map +1 -1
  96. package/dist/http/route-helpers.js.map +1 -1
  97. package/dist/http/route-openapi.d.ts +1 -1
  98. package/dist/http/route-openapi.d.ts.map +1 -1
  99. package/dist/http/route-openapi.js.map +1 -1
  100. package/dist/http/route-types.d.ts +26 -23
  101. package/dist/http/route-types.d.ts.map +1 -1
  102. package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
  103. package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
  104. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  105. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  106. package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
  107. package/dist/jobs/drivers/sqs-driver.js.map +1 -1
  108. package/dist/jobs/errors.d.ts.map +1 -1
  109. package/dist/jobs/job-registry.d.ts.map +1 -1
  110. package/dist/jobs/job-registry.js.map +1 -1
  111. package/dist/jobs/job-service.d.ts.map +1 -1
  112. package/dist/jobs/job-service.js.map +1 -1
  113. package/dist/jobs/observability/client.d.ts +26 -0
  114. package/dist/jobs/observability/client.d.ts.map +1 -0
  115. package/dist/jobs/observability/client.js +286 -0
  116. package/dist/jobs/observability/client.js.map +1 -0
  117. package/dist/jobs/observability/dashboard.d.ts +19 -0
  118. package/dist/jobs/observability/dashboard.d.ts.map +1 -0
  119. package/dist/jobs/observability/dashboard.js +144 -0
  120. package/dist/jobs/observability/dashboard.js.map +1 -0
  121. package/dist/jobs/observability/emf.d.ts +24 -0
  122. package/dist/jobs/observability/emf.d.ts.map +1 -0
  123. package/dist/jobs/observability/emf.js +100 -0
  124. package/dist/jobs/observability/emf.js.map +1 -0
  125. package/dist/jobs/observability/index.d.ts +5 -0
  126. package/dist/jobs/observability/index.d.ts.map +1 -0
  127. package/dist/jobs/observability/index.js +4 -0
  128. package/dist/jobs/observability/index.js.map +1 -0
  129. package/dist/jobs/observability/types.d.ts +234 -0
  130. package/dist/jobs/observability/types.d.ts.map +1 -0
  131. package/dist/jobs/observability/types.js +2 -0
  132. package/dist/jobs/observability/types.js.map +1 -0
  133. package/dist/jobs/worker.d.ts +3 -1
  134. package/dist/jobs/worker.d.ts.map +1 -1
  135. package/dist/jobs/worker.js +2 -0
  136. package/dist/jobs/worker.js.map +1 -1
  137. package/dist/list-query/builder.d.ts +13 -3
  138. package/dist/list-query/builder.d.ts.map +1 -1
  139. package/dist/list-query/builder.js +45 -17
  140. package/dist/list-query/builder.js.map +1 -1
  141. package/dist/list-query/filter-mapping.d.ts +89 -0
  142. package/dist/list-query/filter-mapping.d.ts.map +1 -0
  143. package/dist/list-query/filter-mapping.js +254 -0
  144. package/dist/list-query/filter-mapping.js.map +1 -0
  145. package/dist/list-query/filter-value-schemas.d.ts +3 -3
  146. package/dist/list-query/filter-value-schemas.d.ts.map +1 -1
  147. package/dist/list-query/filter-value-schemas.js +13 -3
  148. package/dist/list-query/filter-value-schemas.js.map +1 -1
  149. package/dist/list-query/index.d.ts +4 -2
  150. package/dist/list-query/index.d.ts.map +1 -1
  151. package/dist/list-query/index.js +3 -1
  152. package/dist/list-query/index.js.map +1 -1
  153. package/dist/list-query/parse-filter-values.d.ts.map +1 -1
  154. package/dist/list-query/parse-filter-values.js +2 -2
  155. package/dist/list-query/parse-filter-values.js.map +1 -1
  156. package/dist/list-query/parser.d.ts +3 -2
  157. package/dist/list-query/parser.d.ts.map +1 -1
  158. package/dist/list-query/parser.js.map +1 -1
  159. package/dist/list-query/prisma-executor.d.ts +44 -29
  160. package/dist/list-query/prisma-executor.d.ts.map +1 -1
  161. package/dist/list-query/prisma-executor.js +48 -33
  162. package/dist/list-query/prisma-executor.js.map +1 -1
  163. package/dist/list-query/query-schema.d.ts +8 -13
  164. package/dist/list-query/query-schema.d.ts.map +1 -1
  165. package/dist/list-query/query-schema.js +11 -12
  166. package/dist/list-query/query-schema.js.map +1 -1
  167. package/dist/list-query/schema-helpers.d.ts +17 -17
  168. package/dist/list-query/schema-helpers.d.ts.map +1 -1
  169. package/dist/list-query/schema-helpers.js +11 -11
  170. package/dist/list-query/schema-helpers.js.map +1 -1
  171. package/dist/list-query/sort-mapping.d.ts +37 -0
  172. package/dist/list-query/sort-mapping.d.ts.map +1 -0
  173. package/dist/list-query/sort-mapping.js +88 -0
  174. package/dist/list-query/sort-mapping.js.map +1 -0
  175. package/dist/list-query/types.d.ts +3 -10
  176. package/dist/list-query/types.d.ts.map +1 -1
  177. package/dist/list-query/validator.d.ts.map +1 -1
  178. package/dist/list-query/validator.js +28 -10
  179. package/dist/list-query/validator.js.map +1 -1
  180. package/dist/middleware/rate-limit.d.ts.map +1 -1
  181. package/dist/middleware/rate-limit.js +60 -92
  182. package/dist/middleware/rate-limit.js.map +1 -1
  183. package/dist/observability/exception-tracking.d.ts.map +1 -1
  184. package/dist/observability/exception-tracking.js.map +1 -1
  185. package/dist/observability/index.d.ts +1 -1
  186. package/dist/observability/index.d.ts.map +1 -1
  187. package/dist/observability/index.js +1 -1
  188. package/dist/observability/index.js.map +1 -1
  189. package/dist/observability/pino-logger.d.ts +0 -28
  190. package/dist/observability/pino-logger.d.ts.map +1 -1
  191. package/dist/observability/pino-logger.js +21 -12
  192. package/dist/observability/pino-logger.js.map +1 -1
  193. package/dist/observability/request-context.d.ts +36 -1
  194. package/dist/observability/request-context.d.ts.map +1 -1
  195. package/dist/observability/request-context.js +43 -0
  196. package/dist/observability/request-context.js.map +1 -1
  197. package/dist/openapi/openapi.d.ts +1 -4
  198. package/dist/openapi/openapi.d.ts.map +1 -1
  199. package/dist/openapi/openapi.js +15 -35
  200. package/dist/openapi/openapi.js.map +1 -1
  201. package/dist/rls/configuration.d.ts +3 -0
  202. package/dist/rls/configuration.d.ts.map +1 -0
  203. package/dist/rls/configuration.js +13 -0
  204. package/dist/rls/configuration.js.map +1 -0
  205. package/dist/rls/context.d.ts +37 -0
  206. package/dist/rls/context.d.ts.map +1 -0
  207. package/dist/rls/context.js +56 -0
  208. package/dist/rls/context.js.map +1 -0
  209. package/dist/rls/extension.d.ts +7 -0
  210. package/dist/rls/extension.d.ts.map +1 -0
  211. package/dist/rls/extension.js +91 -0
  212. package/dist/rls/extension.js.map +1 -0
  213. package/dist/rls/generator.d.ts +17 -0
  214. package/dist/rls/generator.d.ts.map +1 -0
  215. package/dist/rls/generator.js +47 -0
  216. package/dist/rls/generator.js.map +1 -0
  217. package/dist/rls/index.d.ts +7 -0
  218. package/dist/rls/index.d.ts.map +1 -0
  219. package/dist/rls/index.js +7 -0
  220. package/dist/rls/index.js.map +1 -0
  221. package/dist/rls/middleware.d.ts +17 -0
  222. package/dist/rls/middleware.d.ts.map +1 -0
  223. package/dist/rls/middleware.js +51 -0
  224. package/dist/rls/middleware.js.map +1 -0
  225. package/dist/rls/testing.d.ts +24 -0
  226. package/dist/rls/testing.d.ts.map +1 -0
  227. package/dist/rls/testing.js +31 -0
  228. package/dist/rls/testing.js.map +1 -0
  229. package/dist/rls/types.d.ts +51 -0
  230. package/dist/rls/types.d.ts.map +1 -0
  231. package/dist/rls/types.js +16 -0
  232. package/dist/rls/types.js.map +1 -0
  233. package/dist/sse/index.d.ts +6 -0
  234. package/dist/sse/index.d.ts.map +1 -0
  235. package/dist/sse/index.js +18 -0
  236. package/dist/sse/index.js.map +1 -0
  237. package/dist/sse/sse-broadcaster.d.ts +38 -0
  238. package/dist/sse/sse-broadcaster.d.ts.map +1 -0
  239. package/dist/sse/sse-broadcaster.js +118 -0
  240. package/dist/sse/sse-broadcaster.js.map +1 -0
  241. package/dist/uploads/uploads.service.d.ts.map +1 -1
  242. package/dist/uploads/validators.d.ts.map +1 -1
  243. package/dist/utils/get-client-ip.d.ts.map +1 -1
  244. package/dist/utils/get-client-ip.js +22 -13
  245. package/dist/utils/get-client-ip.js.map +1 -1
  246. package/dist/utils/serialize-prisma-types.js.map +1 -1
  247. package/package.json +56 -35
@@ -1 +1 @@
1
- {"version":3,"file":"ses-transport.js","sourceRoot":"","sources":["../../../src/email/transports/ses-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ses-transport.js","sourceRoot":"","sources":["../../../src/email/transports/ses-transport.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import type { CreateWebhookHandlerOptions } from './types.js';
13
13
  *
14
14
  * router.post('/webhooks/ses',
15
15
  * createSESWebhookHandler({
16
+ * allowedTopicArns: ['arn:aws:sns:eu-west-1:123456789012:email-events'],
16
17
  * onDelivered: async (event, c) => {
17
18
  * const logger = c.get('logger');
18
19
  * logger.info({ messageId: event.messageId }, 'Email delivered');
@@ -1 +1 @@
1
- {"version":3,"file":"handler-factory.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/handler-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAKvD,OAAO,KAAK,EAGV,2BAA2B,EAG5B,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,2BAAgC,GACxC,iBAAiB,CA8BnB"}
1
+ {"version":3,"file":"handler-factory.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/handler-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAKvD,OAAO,KAAK,EAGV,2BAA2B,EAG5B,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,2BAAgC,GACxC,iBAAiB,CA8CnB"}
@@ -16,6 +16,7 @@ const logger = createLogger('SES Webhook');
16
16
  *
17
17
  * router.post('/webhooks/ses',
18
18
  * createSESWebhookHandler({
19
+ * allowedTopicArns: ['arn:aws:sns:eu-west-1:123456789012:email-events'],
19
20
  * onDelivered: async (event, c) => {
20
21
  * const logger = c.get('logger');
21
22
  * logger.info({ messageId: event.messageId }, 'Email delivered');
@@ -41,14 +42,20 @@ const logger = createLogger('SES Webhook');
41
42
  * ```
42
43
  */
43
44
  export function createSESWebhookHandler(options = {}) {
44
- const { verifySignature = process.env.NODE_ENV === 'production', signatureOptions, onDelivered, onBounced, onComplaint, } = options;
45
+ const { verifySignature = true, allowedTopicArns, signatureOptions, subscriptionOptions, onDelivered, onBounced, onComplaint, } = options;
46
+ if (verifySignature && (!allowedTopicArns || allowedTopicArns.length === 0)) {
47
+ throw new Error('createSESWebhookHandler requires at least one allowed SNS topic ARN when signature verification is enabled');
48
+ }
45
49
  return async (c, _next) => {
46
- // Step 1: Verify signature (optional, enabled by default in production)
47
- const verifyResult = await handleSignatureVerification(c, verifySignature, signatureOptions);
50
+ // Step 1: Verify signature (enabled by default in every environment)
51
+ const verifyResult = await handleSignatureVerification(c, verifySignature, {
52
+ ...signatureOptions,
53
+ allowedTopicArns: allowedTopicArns ?? [],
54
+ });
48
55
  if (verifyResult)
49
56
  return verifyResult;
50
57
  // Step 2: Handle subscription confirmations
51
- const subscriptionResult = await handleSubscriptionConfirmation(c);
58
+ const subscriptionResult = await handleSubscriptionConfirmation(c, subscriptionOptions);
52
59
  if (subscriptionResult)
53
60
  return subscriptionResult;
54
61
  // Step 3: Parse the SES event
@@ -58,7 +65,13 @@ export function createSESWebhookHandler(options = {}) {
58
65
  return c.json({ received: true }, 200);
59
66
  }
60
67
  // Step 4: Route to the appropriate handler
61
- await routeSESEvent(event, c, { onDelivered, onBounced, onComplaint });
68
+ try {
69
+ await routeSESEvent(event, c, { onDelivered, onBounced, onComplaint });
70
+ }
71
+ catch (error) {
72
+ logger.error('SES event processing failed:', error);
73
+ return c.json({ error: 'Event processing failed' }, 503);
74
+ }
62
75
  return c.json({ received: true }, 200);
63
76
  };
64
77
  }
@@ -84,53 +97,42 @@ async function handleSignatureVerification(c, verifySignature, signatureOptions)
84
97
  /**
85
98
  * Handles subscription confirmation step
86
99
  */
87
- async function handleSubscriptionConfirmation(c) {
88
- const subscriptionMiddleware = handleSNSSubscription();
100
+ async function handleSubscriptionConfirmation(c, options) {
101
+ const subscriptionMiddleware = handleSNSSubscription(options);
89
102
  return await runMiddleware(subscriptionMiddleware, c);
90
103
  }
91
104
  /**
92
105
  * Routes SES events to appropriate handlers
93
106
  */
94
107
  async function routeSESEvent(event, c, handlers) {
95
- try {
96
- switch (event.type) {
97
- case 'delivered':
98
- if (handlers.onDelivered) {
99
- await handlers.onDelivered(event, c);
100
- }
101
- break;
102
- case 'bounced':
103
- if (handlers.onBounced) {
104
- await handlers.onBounced(event, c);
105
- }
106
- break;
107
- case 'complaint':
108
- if (handlers.onComplaint) {
109
- await handlers.onComplaint(event, c);
110
- }
111
- break;
112
- }
113
- }
114
- catch (error) {
115
- logger.error('Handler error:', error);
116
- // Don't fail the request - we don't want SNS to retry indefinitely
117
- // The error is logged and can be tracked
108
+ switch (event.type) {
109
+ case 'delivered':
110
+ if (handlers.onDelivered) {
111
+ await handlers.onDelivered(event, c);
112
+ }
113
+ break;
114
+ case 'bounced':
115
+ if (handlers.onBounced) {
116
+ await handlers.onBounced(event, c);
117
+ }
118
+ break;
119
+ case 'complaint':
120
+ if (handlers.onComplaint) {
121
+ await handlers.onComplaint(event, c);
122
+ }
123
+ break;
118
124
  }
119
125
  }
120
126
  /**
121
127
  * Helper to run middleware and capture early responses
122
128
  */
123
129
  async function runMiddleware(middleware, c) {
124
- let earlyResponse;
125
130
  let nextCalled = false;
126
- await middleware(c, async () => {
131
+ const response = await middleware(c, async () => {
127
132
  nextCalled = true;
128
133
  });
129
- // Check if middleware returned early (didn't call next)
130
- if (!nextCalled) {
131
- // The middleware returned a response
132
- earlyResponse = c.res;
133
- }
134
- return earlyResponse;
134
+ if (nextCalled)
135
+ return undefined;
136
+ return response instanceof Response ? response : c.res;
135
137
  }
136
138
  //# sourceMappingURL=handler-factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler-factory.js","sourceRoot":"","sources":["../../../src/email/webhooks/handler-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler-factory.js","sourceRoot":"","sources":["../../../src/email/webhooks/handler-factory.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import type { SESEvent, SNSMessage } from './types.js';
11
11
  * import { parseSESNotification, verifySNSSignature, handleSNSSubscription } from 'glasswork/email';
12
12
  *
13
13
  * router.post('/webhooks/ses',
14
- * verifySNSSignature(),
14
+ * verifySNSSignature({ allowedTopicArns: [process.env.SNS_TOPIC_ARN!] }),
15
15
  * handleSNSSubscription(),
16
16
  * async (c) => {
17
17
  * const event = await parseSESNotification(c);
@@ -11,7 +11,7 @@ const logger = createLogger('SES');
11
11
  * import { parseSESNotification, verifySNSSignature, handleSNSSubscription } from 'glasswork/email';
12
12
  *
13
13
  * router.post('/webhooks/ses',
14
- * verifySNSSignature(),
14
+ * verifySNSSignature({ allowedTopicArns: [process.env.SNS_TOPIC_ARN!] }),
15
15
  * handleSNSSubscription(),
16
16
  * async (c) => {
17
17
  * const event = await parseSESNotification(c);
@@ -21,7 +21,9 @@ export declare function buildStringToSign(message: SNSMessage): string;
21
21
  * import { verifySNSSignature } from 'glasswork/email';
22
22
  *
23
23
  * router.post('/webhooks/ses',
24
- * verifySNSSignature(),
24
+ * verifySNSSignature({
25
+ * allowedTopicArns: ['arn:aws:sns:eu-west-1:123456789012:email-events'],
26
+ * }),
25
27
  * async (c) => {
26
28
  * // Message is verified to be from AWS SNS
27
29
  * const body = await c.req.json();
@@ -30,7 +32,7 @@ export declare function buildStringToSign(message: SNSMessage): string;
30
32
  * );
31
33
  * ```
32
34
  */
33
- export declare function verifySNSSignature(options?: VerifySignatureOptions): MiddlewareHandler;
35
+ export declare function verifySNSSignature(options: VerifySignatureOptions): MiddlewareHandler;
34
36
  /**
35
37
  * Clears the certificate cache (useful for testing)
36
38
  */
@@ -1 +1 @@
1
- {"version":3,"file":"signature-verification.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/signature-verification.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAgErE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAmC7D;AAqBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CA6C1F;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
1
+ {"version":3,"file":"signature-verification.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/signature-verification.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAwGrE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAmC7D;AAqBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,iBAAiB,CAyDrF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -9,6 +9,9 @@ const certCache = new Map();
9
9
  * Default certificate cache TTL (1 hour)
10
10
  */
11
11
  const DEFAULT_CERT_CACHE_TTL = 60 * 60 * 1000;
12
+ const DEFAULT_FETCH_TIMEOUT_MS = 5_000;
13
+ const MAX_CERTIFICATE_LENGTH = 64 * 1024;
14
+ const MAX_CACHED_CERTIFICATES = 100;
12
15
  /**
13
16
  * AWS SNS certificate domain pattern
14
17
  */
@@ -21,7 +24,12 @@ function isValidCertUrl(url) {
21
24
  const parsed = new URL(url);
22
25
  return (parsed.protocol === 'https:' &&
23
26
  SNS_CERT_DOMAIN_PATTERN.test(parsed.hostname) &&
24
- parsed.pathname.endsWith('.pem'));
27
+ parsed.pathname.endsWith('.pem') &&
28
+ !parsed.username &&
29
+ !parsed.password &&
30
+ !parsed.search &&
31
+ !parsed.hash &&
32
+ (parsed.port === '' || parsed.port === '443'));
25
33
  }
26
34
  catch {
27
35
  return false;
@@ -32,23 +40,59 @@ function isValidCertUrl(url) {
32
40
  */
33
41
  async function fetchCertificate(certUrl, options) {
34
42
  const now = Date.now();
43
+ for (const [key, entry] of certCache) {
44
+ if (entry.expiresAt <= now)
45
+ certCache.delete(key);
46
+ }
35
47
  const cached = certCache.get(certUrl);
36
48
  if (cached && cached.expiresAt > now) {
37
49
  return cached.cert;
38
50
  }
39
51
  const fetchFn = options.fetchFn || fetch;
40
- const response = await fetchFn(certUrl);
52
+ const response = await fetchFn(certUrl, {
53
+ redirect: 'error',
54
+ signal: AbortSignal.timeout(options.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS),
55
+ });
41
56
  if (!response.ok) {
42
57
  throw new Error(`Failed to fetch SNS certificate: ${response.status}`);
43
58
  }
44
- const cert = await response.text();
59
+ const cert = await readCertificate(response);
45
60
  const ttl = options.certCacheTTL ?? DEFAULT_CERT_CACHE_TTL;
61
+ while (certCache.size >= MAX_CACHED_CERTIFICATES) {
62
+ const oldest = certCache.keys().next().value;
63
+ if (oldest !== undefined)
64
+ certCache.delete(oldest);
65
+ }
46
66
  certCache.set(certUrl, {
47
67
  cert,
48
68
  expiresAt: now + ttl,
49
69
  });
50
70
  return cert;
51
71
  }
72
+ async function readCertificate(response) {
73
+ const reader = response.body?.getReader();
74
+ if (!reader)
75
+ throw new Error('Empty SNS signing certificate response');
76
+ const chunks = [];
77
+ let length = 0;
78
+ try {
79
+ while (true) {
80
+ const chunk = await reader.read();
81
+ if (chunk.done)
82
+ break;
83
+ length += chunk.value.byteLength;
84
+ if (length > MAX_CERTIFICATE_LENGTH) {
85
+ await reader.cancel();
86
+ throw new Error('SNS signing certificate is too large');
87
+ }
88
+ chunks.push(chunk.value);
89
+ }
90
+ }
91
+ finally {
92
+ reader.releaseLock();
93
+ }
94
+ return Buffer.concat(chunks).toString('utf8');
95
+ }
52
96
  /**
53
97
  * Builds the canonical string to sign for SNS message verification
54
98
  *
@@ -99,8 +143,8 @@ function verifySignature(message, certificate) {
99
143
  const stringToSign = buildStringToSign(message);
100
144
  // Extract public key from X.509 certificate
101
145
  const publicKey = createPublicKey(certificate);
102
- // SNS uses SHA-1 for SignatureVersion 1
103
- const verify = createVerify('SHA1');
146
+ const algorithm = message.SignatureVersion === '2' ? 'SHA256' : 'SHA1';
147
+ const verify = createVerify(algorithm);
104
148
  verify.update(stringToSign);
105
149
  verify.end();
106
150
  return verify.verify(publicKey, message.Signature, 'base64');
@@ -121,7 +165,9 @@ function verifySignature(message, certificate) {
121
165
  * import { verifySNSSignature } from 'glasswork/email';
122
166
  *
123
167
  * router.post('/webhooks/ses',
124
- * verifySNSSignature(),
168
+ * verifySNSSignature({
169
+ * allowedTopicArns: ['arn:aws:sns:eu-west-1:123456789012:email-events'],
170
+ * }),
125
171
  * async (c) => {
126
172
  * // Message is verified to be from AWS SNS
127
173
  * const body = await c.req.json();
@@ -130,7 +176,11 @@ function verifySignature(message, certificate) {
130
176
  * );
131
177
  * ```
132
178
  */
133
- export function verifySNSSignature(options = {}) {
179
+ export function verifySNSSignature(options) {
180
+ if (options.allowedTopicArns.length === 0) {
181
+ throw new Error('verifySNSSignature requires at least one allowed SNS topic ARN');
182
+ }
183
+ const allowedTopicArns = new Set(options.allowedTopicArns);
134
184
  return async (c, next) => {
135
185
  // Clone the request to read the body without consuming it
136
186
  const body = await c.req.text();
@@ -142,9 +192,14 @@ export function verifySNSSignature(options = {}) {
142
192
  return c.json({ error: 'Invalid JSON body' }, 400);
143
193
  }
144
194
  // Validate signature version
145
- if (message.SignatureVersion !== '1') {
195
+ if (message.SignatureVersion !== '1' && message.SignatureVersion !== '2') {
146
196
  return c.json({ error: 'Unsupported signature version' }, 400);
147
197
  }
198
+ // A valid SNS signature only proves who signed the message. Restricting the
199
+ // topic prevents other AWS customers from sending valid messages here.
200
+ if (!allowedTopicArns.has(message.TopicArn)) {
201
+ return c.json({ error: 'Unexpected SNS topic' }, 403);
202
+ }
148
203
  // Validate certificate URL
149
204
  if (!isValidCertUrl(message.SigningCertURL)) {
150
205
  return c.json({ error: 'Invalid certificate URL' }, 400);
@@ -1 +1 @@
1
- {"version":3,"file":"signature-verification.js","sourceRoot":"","sources":["../../../src/email/webhooks/signature-verification.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signature-verification.js","sourceRoot":"","sources":["../../../src/email/webhooks/signature-verification.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export interface HandleSubscriptionOptions {
7
7
  fetchFn?: typeof fetch;
8
8
  /** Whether to auto-confirm subscriptions (default: true) */
9
9
  autoConfirm?: boolean;
10
+ /** Maximum time for the confirmation request (default: 5 seconds) */
11
+ confirmationTimeoutMs?: number;
10
12
  }
11
13
  /**
12
14
  * Middleware that automatically handles SNS subscription confirmations.
@@ -15,7 +17,7 @@ export interface HandleSubscriptionOptions {
15
17
  * SubscriptionConfirmation message that must be confirmed by visiting
16
18
  * the SubscribeURL. This middleware handles that automatically.
17
19
  *
18
- * Should be used after `verifySNSSignature()` to ensure the confirmation
20
+ * Should be used after `verifySNSSignature({ allowedTopicArns })` to ensure the confirmation
19
21
  * request is genuine.
20
22
  *
21
23
  * @example
@@ -23,7 +25,7 @@ export interface HandleSubscriptionOptions {
23
25
  * import { verifySNSSignature, handleSNSSubscription } from 'glasswork/email';
24
26
  *
25
27
  * router.post('/webhooks/ses',
26
- * verifySNSSignature(),
28
+ * verifySNSSignature({ allowedTopicArns: [process.env.SNS_TOPIC_ARN!] }),
27
29
  * handleSNSSubscription(),
28
30
  * async (c) => {
29
31
  * // This only runs for actual notifications, not subscription confirmations
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-handler.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/subscription-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,yBAA8B,GAAG,iBAAiB,CAuBhG"}
1
+ {"version":3,"file":"subscription-handler.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/subscription-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qEAAqE;IACrE,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAID;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,yBAA8B,GAAG,iBAAiB,CAiChG"}
@@ -1,5 +1,6 @@
1
1
  import { createLogger } from '../../utils/logger.js';
2
2
  const logger = createLogger('SNS');
3
+ const DEFAULT_CONFIRMATION_TIMEOUT_MS = 5_000;
3
4
  /**
4
5
  * Middleware that automatically handles SNS subscription confirmations.
5
6
  *
@@ -7,7 +8,7 @@ const logger = createLogger('SNS');
7
8
  * SubscriptionConfirmation message that must be confirmed by visiting
8
9
  * the SubscribeURL. This middleware handles that automatically.
9
10
  *
10
- * Should be used after `verifySNSSignature()` to ensure the confirmation
11
+ * Should be used after `verifySNSSignature({ allowedTopicArns })` to ensure the confirmation
11
12
  * request is genuine.
12
13
  *
13
14
  * @example
@@ -15,7 +16,7 @@ const logger = createLogger('SNS');
15
16
  * import { verifySNSSignature, handleSNSSubscription } from 'glasswork/email';
16
17
  *
17
18
  * router.post('/webhooks/ses',
18
- * verifySNSSignature(),
19
+ * verifySNSSignature({ allowedTopicArns: [process.env.SNS_TOPIC_ARN!] }),
19
20
  * handleSNSSubscription(),
20
21
  * async (c) => {
21
22
  * // This only runs for actual notifications, not subscription confirmations
@@ -26,7 +27,7 @@ const logger = createLogger('SNS');
26
27
  * ```
27
28
  */
28
29
  export function handleSNSSubscription(options = {}) {
29
- const { fetchFn = fetch, autoConfirm = true } = options;
30
+ const { fetchFn = fetch, autoConfirm = true, confirmationTimeoutMs = DEFAULT_CONFIRMATION_TIMEOUT_MS, } = options;
30
31
  return async (c, next) => {
31
32
  const message = await getSNSMessage(c);
32
33
  if (!message) {
@@ -34,7 +35,7 @@ export function handleSNSSubscription(options = {}) {
34
35
  }
35
36
  // Handle subscription confirmation
36
37
  if (message.Type === 'SubscriptionConfirmation') {
37
- const result = await handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn);
38
+ const result = await handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn, confirmationTimeoutMs);
38
39
  if (result)
39
40
  return result;
40
41
  }
@@ -65,7 +66,7 @@ async function getSNSMessage(c) {
65
66
  /**
66
67
  * Handles subscription confirmation
67
68
  */
68
- async function handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn) {
69
+ async function handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn, confirmationTimeoutMs) {
69
70
  if (!autoConfirm) {
70
71
  logger.info('Subscription confirmation received but auto-confirm disabled');
71
72
  return c.json({ message: 'Subscription confirmation received' }, 200);
@@ -74,9 +75,16 @@ async function handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn)
74
75
  logger.error('Subscription confirmation missing SubscribeURL');
75
76
  return c.json({ error: 'Missing SubscribeURL' }, 400);
76
77
  }
78
+ if (!isValidSubscribeUrl(message.SubscribeURL, message)) {
79
+ logger.error('Subscription confirmation has an invalid SubscribeURL');
80
+ return c.json({ error: 'Invalid SubscribeURL' }, 400);
81
+ }
77
82
  try {
78
83
  logger.info('Confirming subscription to:', message.TopicArn);
79
- const response = await fetchFn(message.SubscribeURL);
84
+ const response = await fetchFn(message.SubscribeURL, {
85
+ redirect: 'error',
86
+ signal: AbortSignal.timeout(confirmationTimeoutMs),
87
+ });
80
88
  if (!response.ok) {
81
89
  logger.error('Failed to confirm subscription:', response.status);
82
90
  return c.json({ error: 'Failed to confirm subscription' }, 500);
@@ -89,6 +97,34 @@ async function handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn)
89
97
  return c.json({ error: 'Failed to confirm subscription' }, 500);
90
98
  }
91
99
  }
100
+ function isValidSubscribeUrl(value, message) {
101
+ try {
102
+ const url = new URL(value);
103
+ const arn = message.TopicArn.split(':');
104
+ const partition = arn[1];
105
+ const service = arn[2];
106
+ const region = arn[3];
107
+ if (!partition || service !== 'sns' || !region)
108
+ return false;
109
+ const suffix = partition === 'aws-cn' ? 'amazonaws.com.cn' : 'amazonaws.com';
110
+ const expectedHostname = `sns.${region}.${suffix}`;
111
+ if (url.protocol !== 'https:' ||
112
+ url.hostname !== expectedHostname ||
113
+ (url.port !== '' && url.port !== '443') ||
114
+ url.username !== '' ||
115
+ url.password !== '' ||
116
+ url.pathname !== '/' ||
117
+ url.searchParams.get('Action') !== 'ConfirmSubscription') {
118
+ return false;
119
+ }
120
+ const token = url.searchParams.get('Token');
121
+ const topicArn = url.searchParams.get('TopicArn');
122
+ return (!token || token === message.Token) && (!topicArn || topicArn === message.TopicArn);
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
92
128
  /**
93
129
  * Handles unsubscribe confirmation
94
130
  */
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-handler.js","sourceRoot":"","sources":["../../../src/email/webhooks/subscription-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscription-handler.js","sourceRoot":"","sources":["../../../src/email/webhooks/subscription-handler.ts"],"names":[],"mappings":"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"}
@@ -157,8 +157,12 @@ export type SESNotification = SESDeliveryNotification | SESBounceNotification |
157
157
  * Options for SNS signature verification
158
158
  */
159
159
  export interface VerifySignatureOptions {
160
+ /** SNS topic ARNs that this endpoint accepts */
161
+ allowedTopicArns: readonly string[];
160
162
  /** Cache TTL for signing certificates in milliseconds (default: 1 hour) */
161
163
  certCacheTTL?: number;
164
+ /** Maximum time for fetching a signing certificate (default: 5 seconds) */
165
+ fetchTimeoutMs?: number;
162
166
  /** Custom fetch function for testing */
163
167
  fetchFn?: typeof fetch;
164
168
  }
@@ -178,10 +182,21 @@ export interface SESWebhookHandlers {
178
182
  * Options for the webhook handler factory
179
183
  */
180
184
  export interface CreateWebhookHandlerOptions extends SESWebhookHandlers {
181
- /** Whether to verify SNS signatures (default: true in production) */
185
+ /** Whether to verify SNS signatures (default: true in every environment) */
182
186
  verifySignature?: boolean;
187
+ /** SNS topic ARNs accepted when signature verification is enabled */
188
+ allowedTopicArns?: readonly string[];
183
189
  /** Options for signature verification */
184
- signatureOptions?: VerifySignatureOptions;
190
+ signatureOptions?: Omit<VerifySignatureOptions, 'allowedTopicArns'>;
191
+ /** Options for handling SNS subscription confirmations */
192
+ subscriptionOptions?: {
193
+ /** Whether to confirm subscriptions automatically (default: true) */
194
+ autoConfirm?: boolean;
195
+ /** Maximum time for the confirmation request (default: 5 seconds) */
196
+ confirmationTimeoutMs?: number;
197
+ /** Custom fetch function for testing */
198
+ fetchFn?: typeof fetch;
199
+ };
185
200
  }
186
201
  export {};
187
202
  //# sourceMappingURL=types.d.ts.map