glasswork 1.2.0 → 1.4.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 (170) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/dist/core/bootstrap.d.ts.map +1 -1
  3. package/dist/core/bootstrap.js +110 -25
  4. package/dist/core/bootstrap.js.map +1 -1
  5. package/dist/core/contract.d.ts +37 -0
  6. package/dist/core/contract.d.ts.map +1 -0
  7. package/dist/core/contract.js +19 -0
  8. package/dist/core/contract.js.map +1 -0
  9. package/dist/core/index.d.ts +1 -0
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +1 -0
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/types.d.ts +12 -0
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/email/email-service.d.ts +5 -2
  16. package/dist/email/email-service.d.ts.map +1 -1
  17. package/dist/email/email-service.js +8 -4
  18. package/dist/email/email-service.js.map +1 -1
  19. package/dist/email/index.d.ts +1 -1
  20. package/dist/email/index.d.ts.map +1 -1
  21. package/dist/email/index.js.map +1 -1
  22. package/dist/email/templated-email-service.d.ts.map +1 -1
  23. package/dist/email/templated-email-service.js +2 -1
  24. package/dist/email/templated-email-service.js.map +1 -1
  25. package/dist/email/types.d.ts +9 -4
  26. package/dist/email/types.d.ts.map +1 -1
  27. package/dist/email/webhooks/handler-factory.d.ts.map +1 -1
  28. package/dist/email/webhooks/handler-factory.js +7 -3
  29. package/dist/email/webhooks/handler-factory.js.map +1 -1
  30. package/dist/email/webhooks/notification-parser.d.ts +2 -1
  31. package/dist/email/webhooks/notification-parser.d.ts.map +1 -1
  32. package/dist/email/webhooks/notification-parser.js +1 -2
  33. package/dist/email/webhooks/notification-parser.js.map +1 -1
  34. package/dist/email/webhooks/signature-verification.d.ts.map +1 -1
  35. package/dist/email/webhooks/signature-verification.js +3 -3
  36. package/dist/email/webhooks/signature-verification.js.map +1 -1
  37. package/dist/email/webhooks/subscription-handler.d.ts +2 -0
  38. package/dist/email/webhooks/subscription-handler.d.ts.map +1 -1
  39. package/dist/email/webhooks/subscription-handler.js +5 -5
  40. package/dist/email/webhooks/subscription-handler.js.map +1 -1
  41. package/dist/email/webhooks/types.d.ts +2 -0
  42. package/dist/email/webhooks/types.d.ts.map +1 -1
  43. package/dist/http/error-handler.d.ts +3 -1
  44. package/dist/http/error-handler.d.ts.map +1 -1
  45. package/dist/http/error-handler.js +3 -4
  46. package/dist/http/error-handler.js.map +1 -1
  47. package/dist/http/index.d.ts +1 -0
  48. package/dist/http/index.d.ts.map +1 -1
  49. package/dist/http/index.js +1 -0
  50. package/dist/http/index.js.map +1 -1
  51. package/dist/http/route-context.d.ts.map +1 -1
  52. package/dist/http/route-context.js +7 -2
  53. package/dist/http/route-context.js.map +1 -1
  54. package/dist/http/route-helpers.d.ts.map +1 -1
  55. package/dist/http/route-helpers.js +1 -1
  56. package/dist/http/route-helpers.js.map +1 -1
  57. package/dist/http/route-openapi-context.d.ts +2 -0
  58. package/dist/http/route-openapi-context.d.ts.map +1 -1
  59. package/dist/http/route-openapi-context.js.map +1 -1
  60. package/dist/http/route-response.d.ts +2 -1
  61. package/dist/http/route-response.d.ts.map +1 -1
  62. package/dist/http/route-response.js +3 -4
  63. package/dist/http/route-response.js.map +1 -1
  64. package/dist/jobs/define-job.d.ts +12 -8
  65. package/dist/jobs/define-job.d.ts.map +1 -1
  66. package/dist/jobs/define-job.js +2 -0
  67. package/dist/jobs/define-job.js.map +1 -1
  68. package/dist/jobs/drivers/mock-driver.d.ts +3 -1
  69. package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
  70. package/dist/jobs/drivers/mock-driver.js +15 -21
  71. package/dist/jobs/drivers/mock-driver.js.map +1 -1
  72. package/dist/jobs/index.d.ts +2 -2
  73. package/dist/jobs/index.d.ts.map +1 -1
  74. package/dist/jobs/index.js +1 -1
  75. package/dist/jobs/index.js.map +1 -1
  76. package/dist/jobs/job-runner.d.ts +7 -0
  77. package/dist/jobs/job-runner.d.ts.map +1 -0
  78. package/dist/jobs/job-runner.js +38 -0
  79. package/dist/jobs/job-runner.js.map +1 -0
  80. package/dist/jobs/job-service.d.ts +6 -6
  81. package/dist/jobs/job-service.d.ts.map +1 -1
  82. package/dist/jobs/job-service.js +8 -0
  83. package/dist/jobs/job-service.js.map +1 -1
  84. package/dist/jobs/observability/emf.d.ts +5 -15
  85. package/dist/jobs/observability/emf.d.ts.map +1 -1
  86. package/dist/jobs/observability/emf.js +87 -67
  87. package/dist/jobs/observability/emf.js.map +1 -1
  88. package/dist/jobs/observability/index.d.ts +2 -4
  89. package/dist/jobs/observability/index.d.ts.map +1 -1
  90. package/dist/jobs/observability/index.js +1 -3
  91. package/dist/jobs/observability/index.js.map +1 -1
  92. package/dist/jobs/observability/types.d.ts +16 -193
  93. package/dist/jobs/observability/types.d.ts.map +1 -1
  94. package/dist/jobs/types.d.ts +17 -7
  95. package/dist/jobs/types.d.ts.map +1 -1
  96. package/dist/jobs/worker.d.ts +3 -0
  97. package/dist/jobs/worker.d.ts.map +1 -1
  98. package/dist/jobs/worker.js +66 -13
  99. package/dist/jobs/worker.js.map +1 -1
  100. package/dist/list-query/client.d.ts +36 -0
  101. package/dist/list-query/client.d.ts.map +1 -0
  102. package/dist/list-query/client.js +74 -0
  103. package/dist/list-query/client.js.map +1 -0
  104. package/dist/list-query/parser.d.ts.map +1 -1
  105. package/dist/list-query/parser.js +8 -46
  106. package/dist/list-query/parser.js.map +1 -1
  107. package/dist/list-query/protocol.d.ts +14 -0
  108. package/dist/list-query/protocol.d.ts.map +1 -0
  109. package/dist/list-query/protocol.js +44 -0
  110. package/dist/list-query/protocol.js.map +1 -0
  111. package/dist/list-query/query-schema.d.ts.map +1 -1
  112. package/dist/list-query/query-schema.js +6 -5
  113. package/dist/list-query/query-schema.js.map +1 -1
  114. package/dist/list-query/types.d.ts +2 -5
  115. package/dist/list-query/types.d.ts.map +1 -1
  116. package/dist/middleware/rate-limit.d.ts.map +1 -1
  117. package/dist/middleware/rate-limit.js +1 -1
  118. package/dist/middleware/rate-limit.js.map +1 -1
  119. package/dist/observability/exception-tracking.d.ts +6 -1
  120. package/dist/observability/exception-tracking.d.ts.map +1 -1
  121. package/dist/observability/exception-tracking.js +29 -5
  122. package/dist/observability/exception-tracking.js.map +1 -1
  123. package/dist/observability/index.d.ts +1 -0
  124. package/dist/observability/index.d.ts.map +1 -1
  125. package/dist/observability/index.js +1 -0
  126. package/dist/observability/index.js.map +1 -1
  127. package/dist/observability/pino-logger.d.ts +3 -1
  128. package/dist/observability/pino-logger.d.ts.map +1 -1
  129. package/dist/observability/pino-logger.js +17 -11
  130. package/dist/observability/pino-logger.js.map +1 -1
  131. package/dist/observability/sanitizers.d.ts +14 -0
  132. package/dist/observability/sanitizers.d.ts.map +1 -0
  133. package/dist/observability/sanitizers.js +52 -0
  134. package/dist/observability/sanitizers.js.map +1 -0
  135. package/dist/openapi/drift.d.ts +6 -0
  136. package/dist/openapi/drift.d.ts.map +1 -0
  137. package/dist/openapi/drift.js +18 -0
  138. package/dist/openapi/drift.js.map +1 -0
  139. package/dist/openapi/openapi.d.ts +5 -0
  140. package/dist/openapi/openapi.d.ts.map +1 -1
  141. package/dist/openapi/openapi.js +5 -2
  142. package/dist/openapi/openapi.js.map +1 -1
  143. package/dist/uploads/guardduty.d.ts +20 -0
  144. package/dist/uploads/guardduty.d.ts.map +1 -0
  145. package/dist/uploads/guardduty.js +29 -0
  146. package/dist/uploads/guardduty.js.map +1 -0
  147. package/dist/uploads/index.d.ts +1 -1
  148. package/dist/uploads/index.d.ts.map +1 -1
  149. package/dist/uploads/index.js.map +1 -1
  150. package/dist/uploads/s3-key.d.ts +3 -0
  151. package/dist/uploads/s3-key.d.ts.map +1 -0
  152. package/dist/uploads/s3-key.js +5 -0
  153. package/dist/uploads/s3-key.js.map +1 -0
  154. package/dist/uploads/uploads.service.d.ts +27 -7
  155. package/dist/uploads/uploads.service.d.ts.map +1 -1
  156. package/dist/uploads/uploads.service.js +50 -14
  157. package/dist/uploads/uploads.service.js.map +1 -1
  158. package/package.json +11 -1
  159. package/dist/jobs/observability/client.d.ts +0 -26
  160. package/dist/jobs/observability/client.d.ts.map +0 -1
  161. package/dist/jobs/observability/client.js +0 -286
  162. package/dist/jobs/observability/client.js.map +0 -1
  163. package/dist/jobs/observability/dashboard.d.ts +0 -19
  164. package/dist/jobs/observability/dashboard.d.ts.map +0 -1
  165. package/dist/jobs/observability/dashboard.js +0 -144
  166. package/dist/jobs/observability/dashboard.js.map +0 -1
  167. package/dist/jobs/scheduler.d.ts +0 -17
  168. package/dist/jobs/scheduler.d.ts.map +0 -1
  169. package/dist/jobs/scheduler.js +0 -83
  170. package/dist/jobs/scheduler.js.map +0 -1
@@ -1,144 +0,0 @@
1
- /**
2
- * Generate a production-ready AWS CloudWatch Dashboard JSON definition for background jobs.
3
- *
4
- * Can be deployed via AWS CLI (`aws cloudwatch put-dashboard`), AWS CDK (`CfnDashboard`),
5
- * or Terraform (`aws_cloudwatch_dashboard`).
6
- *
7
- * @param options - Dashboard configuration options (names, widgets, region).
8
- * @returns An object with dashboardName and serialized dashboardBody JSON.
9
- */
10
- export function generateJobsDashboard(options) {
11
- const { dashboardName, namespace = 'Glasswork/Jobs', jobNames = [], periodSeconds = 300, region = 'eu-west-1', logGroupName, } = options;
12
- // Widget 1: Throughput (JobCount)
13
- const throughputMetrics = jobNames.length > 0
14
- ? jobNames.map((name) => [namespace, 'JobCount', 'JobName', name, { stat: 'Sum' }])
15
- : [[namespace, 'JobCount', { stat: 'Sum' }]];
16
- // Widget 2: Errors (JobErrorCount)
17
- const errorMetrics = jobNames.length > 0
18
- ? jobNames.map((name) => [
19
- namespace,
20
- 'JobErrorCount',
21
- 'JobName',
22
- name,
23
- { stat: 'Sum', color: '#d62728' },
24
- ])
25
- : [[namespace, 'JobErrorCount', { stat: 'Sum', color: '#d62728' }]];
26
- // Widget 3: Duration Percentiles
27
- const durationMetrics = [
28
- [namespace, 'JobDuration', { stat: 'p50', label: 'Duration p50' }],
29
- [namespace, 'JobDuration', { stat: 'p90', label: 'Duration p90' }],
30
- [namespace, 'JobDuration', { stat: 'p99', label: 'Duration p99' }],
31
- ];
32
- // Widget 4: Queue Wait Time
33
- const queueWaitMetrics = [
34
- [namespace, 'QueueWaitTime', { stat: 'Average', label: 'Avg Queue Wait' }],
35
- [namespace, 'QueueWaitTime', { stat: 'Maximum', label: 'Max Queue Wait' }],
36
- ];
37
- // biome-ignore lint/suspicious/noExplicitAny: CloudWatch Dashboard JSON specification uses dynamic property arrays
38
- const widgets = [
39
- {
40
- type: 'metric',
41
- x: 0,
42
- y: 0,
43
- width: 12,
44
- height: 6,
45
- properties: {
46
- metrics: throughputMetrics,
47
- view: 'timeSeries',
48
- stacked: true,
49
- region,
50
- title: 'Background Jobs - Throughput (JobCount)',
51
- period: periodSeconds,
52
- },
53
- },
54
- {
55
- type: 'metric',
56
- x: 12,
57
- y: 0,
58
- width: 12,
59
- height: 6,
60
- properties: {
61
- metrics: errorMetrics,
62
- view: 'timeSeries',
63
- stacked: true,
64
- region,
65
- title: 'Background Jobs - Errors & Failures',
66
- period: periodSeconds,
67
- },
68
- },
69
- {
70
- type: 'metric',
71
- x: 0,
72
- y: 6,
73
- width: 12,
74
- height: 6,
75
- properties: {
76
- metrics: durationMetrics,
77
- view: 'timeSeries',
78
- region,
79
- title: 'Execution Duration (p50 / p90 / p99)',
80
- period: periodSeconds,
81
- yAxis: {
82
- left: {
83
- label: 'Milliseconds',
84
- },
85
- },
86
- },
87
- },
88
- {
89
- type: 'metric',
90
- x: 12,
91
- y: 6,
92
- width: 12,
93
- height: 6,
94
- properties: {
95
- metrics: queueWaitMetrics,
96
- view: 'timeSeries',
97
- region,
98
- title: 'Queue Wait Time (Enqueued to Execution)',
99
- period: periodSeconds,
100
- yAxis: {
101
- left: {
102
- label: 'Milliseconds',
103
- },
104
- },
105
- },
106
- },
107
- ];
108
- if (logGroupName) {
109
- widgets.push({
110
- type: 'log',
111
- x: 0,
112
- y: 12,
113
- width: 24,
114
- height: 6,
115
- properties: {
116
- query: `SOURCE '${logGroupName}' | fields @timestamp, JobName, JobId, AttemptNumber, ErrorName, ErrorMessage\n| filter Status in ["failed", "dead_letter"]\n| sort @timestamp desc\n| limit 25`,
117
- region,
118
- title: 'Recent Job Failures & Dead Letters',
119
- view: 'table',
120
- },
121
- });
122
- }
123
- return {
124
- dashboardName,
125
- dashboardBody: JSON.stringify({ widgets }),
126
- };
127
- }
128
- /**
129
- * Returns a set of pre-canned CloudWatch Logs Insights queries for monitoring and troubleshooting jobs.
130
- *
131
- * @param options - Optional configuration for logGroupName and namespace filter.
132
- * @returns Queries for recent failures, slowest jobs, retries, and job tracing.
133
- */
134
- export function getJobsInsightsQueries(options = {}) {
135
- const sourcePrefix = options.logGroupName ? `SOURCE '${options.logGroupName}' | ` : '';
136
- return {
137
- recentFailures: `${sourcePrefix}fields @timestamp, JobName, JobId, AttemptNumber, ErrorName, ErrorMessage\n| filter Status in ["failed", "dead_letter"]\n| sort @timestamp desc\n| limit 50`,
138
- slowestJobs: `${sourcePrefix}fields @timestamp, JobName, JobId, JobDuration, QueueWaitTime\n| filter Status = "success"\n| sort JobDuration desc\n| limit 25`,
139
- retriedJobs: `${sourcePrefix}fields @timestamp, JobName, JobId, AttemptNumber, Status, ErrorMessage\n| filter AttemptNumber > 1\n| sort @timestamp desc\n| limit 50`,
140
- throughputHourly: `${sourcePrefix}filter ispresent(JobName)\n| stats count(*) as Total, sum(JobErrorCount) as Errors, avg(JobDuration) as AvgDurationMs by bin(1h), JobName`,
141
- traceJob: (jobId) => `${sourcePrefix}fields @timestamp, JobName, Status, AttemptNumber, @message\n| filter JobId = "${jobId}"\n| sort @timestamp asc`,
142
- };
143
- }
144
- //# sourceMappingURL=dashboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/jobs/observability/dashboard.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import type { Logger } from '../utils/logger.js';
2
- import type { QueueDriver } from './types.js';
3
- export interface SchedulerConfig {
4
- tableName: string;
5
- driver: QueueDriver;
6
- region: string;
7
- endpoint?: string;
8
- logger?: Logger;
9
- }
10
- /**
11
- * Create a scheduler handler that reads due jobs from DynamoDB and enqueues them.
12
- * Intended to be triggered periodically (e.g., every minute via EventBridge).
13
- */
14
- export declare function createSchedulerHandler(config: SchedulerConfig): () => Promise<{
15
- dispatched: number;
16
- }>;
17
- //# sourceMappingURL=scheduler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe;;GA4D7D"}
@@ -1,83 +0,0 @@
1
- import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
- import { DeleteCommand, DynamoDBDocumentClient, QueryCommand } from '@aws-sdk/lib-dynamodb';
3
- import { createLogger } from '../utils/logger.js';
4
- /**
5
- * Parse a scheduled item from DynamoDB into a job dispatch payload.
6
- * Returns null if the item is invalid or malformed.
7
- */
8
- function parseScheduledItem(item, logger) {
9
- const jobName = item.jobName;
10
- const jobId = item.sk;
11
- if (!jobName || !jobId) {
12
- logger.warn('Skipping scheduled item with missing required fields', {
13
- hasJobName: !!jobName,
14
- hasJobId: !!jobId,
15
- });
16
- return null;
17
- }
18
- let payload;
19
- try {
20
- payload = item.payload ? JSON.parse(item.payload) : undefined;
21
- }
22
- catch (error) {
23
- logger.error('Failed to parse scheduled job payload', { jobName, jobId, error });
24
- return null;
25
- }
26
- return {
27
- jobName,
28
- jobId,
29
- payload,
30
- queue: item.queue ?? 'default',
31
- };
32
- }
33
- /**
34
- * Create a scheduler handler that reads due jobs from DynamoDB and enqueues them.
35
- * Intended to be triggered periodically (e.g., every minute via EventBridge).
36
- */
37
- export function createSchedulerHandler(config) {
38
- const logger = config.logger ?? createLogger('JobScheduler');
39
- const ddbClient = new DynamoDBClient({
40
- region: config.region,
41
- ...(config.endpoint && { endpoint: config.endpoint }),
42
- });
43
- const docClient = DynamoDBDocumentClient.from(ddbClient);
44
- return async () => {
45
- const partition = `SCHEDULED#${new Date().toISOString().slice(0, 16)}`;
46
- const result = await docClient.send(new QueryCommand({
47
- TableName: config.tableName,
48
- KeyConditionExpression: 'pk = :pk',
49
- ExpressionAttributeValues: { ':pk': partition },
50
- }));
51
- if (!result.Items || result.Items.length === 0) {
52
- return { dispatched: 0 };
53
- }
54
- let dispatched = 0;
55
- for (const item of result.Items) {
56
- const parsed = parseScheduledItem(item, logger);
57
- if (!parsed) {
58
- // Delete malformed items to prevent infinite retries
59
- if (item.sk) {
60
- await docClient.send(new DeleteCommand({
61
- TableName: config.tableName,
62
- Key: { pk: partition, sk: item.sk },
63
- }));
64
- }
65
- continue;
66
- }
67
- await config.driver.enqueue({
68
- jobName: parsed.jobName,
69
- payload: parsed.payload,
70
- queue: parsed.queue,
71
- jobId: parsed.jobId,
72
- });
73
- await docClient.send(new DeleteCommand({
74
- TableName: config.tableName,
75
- Key: { pk: partition, sk: parsed.jobId },
76
- }));
77
- dispatched += 1;
78
- }
79
- logger.info('Dispatched scheduled jobs', { dispatched });
80
- return { dispatched };
81
- };
82
- }
83
- //# sourceMappingURL=scheduler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"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"}