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,4 +1,6 @@
1
1
  import type { Readable } from 'node:stream';
2
+ import { type CopyObjectCommandInput, type DeleteObjectCommandInput, type GetObjectCommandInput, type HeadObjectCommandInput, type PutObjectCommandInput, S3Client } from '@aws-sdk/client-s3';
3
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
2
4
  export interface UploadFileConfig {
3
5
  /** Directory path for the file (e.g., 'uploads/avatars/user123/abc123') */
4
6
  readonly dir: string;
@@ -28,6 +30,8 @@ export interface StreamFileResult {
28
30
  readonly contentLength: number | undefined;
29
31
  }
30
32
  export interface UploadsServiceConfig {
33
+ /** Native S3 client for custom endpoints, credentials, and middleware. */
34
+ readonly client?: S3Client;
31
35
  /** AWS region (e.g., 'eu-west-1') */
32
36
  readonly region: string;
33
37
  /** S3 bucket name */
@@ -35,6 +39,14 @@ export interface UploadsServiceConfig {
35
39
  /** Presigned URL expiration in seconds (default: 3600) */
36
40
  readonly urlExpiration?: number;
37
41
  }
42
+ export interface FinalizeUploadOptions {
43
+ /** Copy this exact source version instead of the current object. */
44
+ readonly sourceVersionId?: string;
45
+ /** Delete the source after copying (default: true). Keep false for quarantine workflows. */
46
+ readonly deleteSource?: boolean;
47
+ /** Native copy options; the service controls the source, destination, and inspected ETag. */
48
+ readonly command?: Omit<CopyObjectCommandInput, 'Bucket' | 'Key' | 'CopySource' | 'CopySourceIfMatch'>;
49
+ }
38
50
  /**
39
51
  * Service for S3 file operations including presigned URL generation and streaming.
40
52
  * Framework-agnostic - can be used anywhere TypeScript runs.
@@ -61,7 +73,7 @@ export interface UploadsServiceConfig {
61
73
  * ```
62
74
  */
63
75
  export declare class UploadsService {
64
- private readonly client;
76
+ readonly client: S3Client;
65
77
  private readonly bucketName;
66
78
  private readonly urlExpiration;
67
79
  constructor(config: UploadsServiceConfig);
@@ -69,7 +81,12 @@ export declare class UploadsService {
69
81
  * Generate a presigned URL for uploading a file to S3.
70
82
  * The URL allows direct upload from the client without going through Lambda.
71
83
  */
72
- getSignedUploadUrl(fileConfig: UploadFileConfig): Promise<SignedUrlResponse>;
84
+ getSignedUploadUrl(fileConfig: UploadFileConfig, options?: {
85
+ expiresIn?: number;
86
+ command?: Omit<PutObjectCommandInput, 'Bucket' | 'Key'>;
87
+ /** Native AWS signing options; expiration is controlled by expiresIn above. */
88
+ presigner?: Omit<NonNullable<Parameters<typeof getSignedUrl>[2]>, 'expiresIn'>;
89
+ }): Promise<SignedUrlResponse>;
73
90
  /**
74
91
  * Stream a file from S3 for private file access.
75
92
  * Returns a readable stream that can be piped to the HTTP response.
@@ -85,14 +102,17 @@ export declare class UploadsService {
85
102
  * @param filePath - Relative path to the file (e.g., '/uploads/docs/file.pdf')
86
103
  * @param expiresIn - Optional expiration in seconds (default: service urlExpiration)
87
104
  */
88
- getSignedDownloadUrl(filePath: string, expiresIn?: number): Promise<SignedDownloadUrlResponse>;
105
+ getSignedDownloadUrl(filePath: string, expiresIn?: number, options?: Omit<GetObjectCommandInput, 'Bucket' | 'Key'>): Promise<SignedDownloadUrlResponse>;
89
106
  /**
90
107
  * Delete a file from S3 by path.
91
108
  */
92
- deleteFile(filePath: string): Promise<void>;
93
- /**
94
- * Normalize file path to S3 key format (strip leading slashes).
109
+ deleteFile(filePath: string, options?: Omit<DeleteObjectCommandInput, 'Bucket' | 'Key'>): Promise<void>;
110
+ /** Native object metadata; the application evaluates type, size, and completeness. */
111
+ inspectFile(filePath: string, options?: Omit<HeadObjectCommandInput, 'Bucket' | 'Key'>): Promise<import("@aws-sdk/client-s3").HeadObjectCommandOutput>;
112
+ /** Copies the inspected file and returns the native AWS result.
113
+ * AWS errors remain native. A failed copy never deletes the source.
114
+ * This is not a database transaction; the application owns compensation policy.
95
115
  */
96
- private normalizeKey;
116
+ finalizeUpload(sourcePath: string, targetPath: string, inspectedETag: string, options?: FinalizeUploadOptions): Promise<import("@aws-sdk/client-s3").CopyObjectCommandOutput>;
97
117
  }
98
118
  //# sourceMappingURL=uploads.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploads.service.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gCAAgC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YAAY,MAAM,EAAE,oBAAoB,EAIvC;IAED;;;OAGG;IACG,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcjF;IAED;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoB5D;IAED;;;;;;OAMG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,yBAAyB,CAAC,CAcpC;IAED;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhD;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"uploads.service.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import { DeleteObjectCommand, GetObjectCommand, PutObjectCommand, S3Client, S3ServiceException, } from '@aws-sdk/client-s3';
1
+ import { CopyObjectCommand, DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, S3ServiceException, } from '@aws-sdk/client-s3';
2
2
  import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
3
3
  import { NotFoundException } from '../http/errors.js';
4
+ import { normalizeS3Key } from './s3-key.js';
4
5
  // ============================================================================
5
6
  // Constants
6
7
  // ============================================================================
@@ -39,7 +40,7 @@ export class UploadsService {
39
40
  bucketName;
40
41
  urlExpiration;
41
42
  constructor(config) {
42
- this.client = new S3Client({ region: config.region });
43
+ this.client = config.client ?? new S3Client({ region: config.region });
43
44
  this.bucketName = config.bucketName;
44
45
  this.urlExpiration = config.urlExpiration ?? DEFAULT_URL_EXPIRATION;
45
46
  }
@@ -47,19 +48,22 @@ export class UploadsService {
47
48
  * Generate a presigned URL for uploading a file to S3.
48
49
  * The URL allows direct upload from the client without going through Lambda.
49
50
  */
50
- async getSignedUploadUrl(fileConfig) {
51
+ async getSignedUploadUrl(fileConfig, options = {}) {
51
52
  const filePath = `${fileConfig.dir}/${fileConfig.fileName}`;
53
+ const expiration = options.expiresIn ?? this.urlExpiration;
52
54
  const command = new PutObjectCommand({
55
+ ...options.command,
53
56
  Bucket: this.bucketName,
54
57
  Key: filePath,
55
58
  });
56
59
  const url = await getSignedUrl(this.client, command, {
57
- expiresIn: this.urlExpiration,
60
+ ...options.presigner,
61
+ expiresIn: expiration,
58
62
  });
59
63
  return {
60
64
  uploadUrl: url,
61
65
  path: `/${filePath}`,
62
- expiresAt: new Date(Date.now() + this.urlExpiration * MILLISECONDS_PER_SECOND),
66
+ expiresAt: new Date(Date.now() + expiration * MILLISECONDS_PER_SECOND),
63
67
  };
64
68
  }
65
69
  /**
@@ -71,7 +75,7 @@ export class UploadsService {
71
75
  */
72
76
  async streamFile(filePath) {
73
77
  try {
74
- const key = this.normalizeKey(filePath);
78
+ const key = normalizeS3Key(filePath);
75
79
  const command = new GetObjectCommand({
76
80
  Bucket: this.bucketName,
77
81
  Key: key,
@@ -98,10 +102,11 @@ export class UploadsService {
98
102
  * @param filePath - Relative path to the file (e.g., '/uploads/docs/file.pdf')
99
103
  * @param expiresIn - Optional expiration in seconds (default: service urlExpiration)
100
104
  */
101
- async getSignedDownloadUrl(filePath, expiresIn) {
102
- const key = this.normalizeKey(filePath);
105
+ async getSignedDownloadUrl(filePath, expiresIn, options) {
106
+ const key = normalizeS3Key(filePath);
103
107
  const expiration = expiresIn ?? this.urlExpiration;
104
108
  const command = new GetObjectCommand({
109
+ ...options,
105
110
  Bucket: this.bucketName,
106
111
  Key: key,
107
112
  });
@@ -116,19 +121,50 @@ export class UploadsService {
116
121
  /**
117
122
  * Delete a file from S3 by path.
118
123
  */
119
- async deleteFile(filePath) {
120
- const key = this.normalizeKey(filePath);
124
+ async deleteFile(filePath, options = {}) {
125
+ const key = normalizeS3Key(filePath);
121
126
  const command = new DeleteObjectCommand({
127
+ ...options,
122
128
  Bucket: this.bucketName,
123
129
  Key: key,
124
130
  });
125
131
  await this.client.send(command);
126
132
  }
127
- /**
128
- * Normalize file path to S3 key format (strip leading slashes).
133
+ /** Native object metadata; the application evaluates type, size, and completeness. */
134
+ async inspectFile(filePath, options = {}) {
135
+ return this.client.send(new HeadObjectCommand({
136
+ ...options,
137
+ Bucket: this.bucketName,
138
+ Key: normalizeS3Key(filePath),
139
+ }));
140
+ }
141
+ /** Copies the inspected file and returns the native AWS result.
142
+ * AWS errors remain native. A failed copy never deletes the source.
143
+ * This is not a database transaction; the application owns compensation policy.
129
144
  */
130
- normalizeKey(filePath) {
131
- return filePath.replace(/^\/+/, '').replace(/\/+/g, '/');
145
+ async finalizeUpload(sourcePath, targetPath, inspectedETag, options = {}) {
146
+ const source = normalizeS3Key(sourcePath);
147
+ const target = normalizeS3Key(targetPath);
148
+ if (!inspectedETag || source === target) {
149
+ throw new Error('Finalization requires an ETag and a distinct destination');
150
+ }
151
+ if (options.sourceVersionId === '') {
152
+ throw new Error('A source version ID cannot be empty');
153
+ }
154
+ const copySource = `${encodeURIComponent(this.bucketName)}/${source.split('/').map(encodeURIComponent).join('/')}`;
155
+ const copied = await this.client.send(new CopyObjectCommand({
156
+ ...options.command,
157
+ Bucket: this.bucketName,
158
+ Key: target,
159
+ CopySource: options.sourceVersionId === undefined
160
+ ? copySource
161
+ : `${copySource}?versionId=${encodeURIComponent(options.sourceVersionId)}`,
162
+ CopySourceIfMatch: inspectedETag,
163
+ }));
164
+ if (options.deleteSource !== false) {
165
+ await this.deleteFile(source, { VersionId: options.sourceVersionId });
166
+ }
167
+ return copied;
132
168
  }
133
169
  }
134
170
  //# sourceMappingURL=uploads.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploads.service.js","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uploads.service.js","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glasswork",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,6 +31,11 @@
31
31
  "import": "./dist/list-query/index.js",
32
32
  "default": "./dist/list-query/index.js"
33
33
  },
34
+ "./list-query/client": {
35
+ "types": "./dist/list-query/client.d.ts",
36
+ "import": "./dist/list-query/client.js",
37
+ "default": "./dist/list-query/client.js"
38
+ },
34
39
  "./jobs": {
35
40
  "types": "./dist/jobs/index.d.ts",
36
41
  "import": "./dist/jobs/index.js",
@@ -46,6 +51,11 @@
46
51
  "import": "./dist/uploads/index.js",
47
52
  "default": "./dist/uploads/index.js"
48
53
  },
54
+ "./uploads/guardduty": {
55
+ "types": "./dist/uploads/guardduty.d.ts",
56
+ "import": "./dist/uploads/guardduty.js",
57
+ "default": "./dist/uploads/guardduty.js"
58
+ },
49
59
  "./observability": {
50
60
  "types": "./dist/observability/index.d.ts",
51
61
  "import": "./dist/observability/index.js",
@@ -1,26 +0,0 @@
1
- import type { FailedJobDTO, GetFailedJobsOptions, GetJobSummaryOptions, JobStatsSummaryDTO, JobsObservabilityClientOptions, JobTypeStatsDTO } from './types.js';
2
- /**
3
- * Interface for the background jobs observability client.
4
- */
5
- export interface JobsObservabilityClient {
6
- /**
7
- * Fetch an aggregated summary of background jobs over a time window.
8
- */
9
- getSummary(options?: GetJobSummaryOptions): Promise<JobStatsSummaryDTO>;
10
- /**
11
- * Fetch recent failed and dead-letter jobs with their error details.
12
- */
13
- getFailedJobs(options?: GetFailedJobsOptions): Promise<FailedJobDTO[]>;
14
- /**
15
- * Fetch detailed statistics for a specific job name.
16
- */
17
- getJobTypeStats(jobName: string, options?: GetJobSummaryOptions): Promise<JobTypeStatsDTO>;
18
- }
19
- /**
20
- * Create an observability client for querying background job metrics and execution logs.
21
- *
22
- * @param options - Configuration options including namespace, logGroupName, and region.
23
- * @returns A JobsObservabilityClient instance.
24
- */
25
- export declare function createJobsObservabilityClient(options?: JobsObservabilityClientOptions): JobsObservabilityClient;
26
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/jobs/observability/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,8BAA8B,EAC9B,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAExE;;OAEG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEvE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5F;AAoND;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CA+JzB"}
@@ -1,286 +0,0 @@
1
- function createJobMetricStat(namespace, jobName, metricName, id, period, stat) {
2
- return {
3
- Id: id,
4
- MetricStat: {
5
- Metric: {
6
- Namespace: namespace,
7
- MetricName: metricName,
8
- Dimensions: [{ Name: 'JobName', Value: jobName }],
9
- },
10
- Period: period,
11
- Stat: stat,
12
- },
13
- ReturnData: true,
14
- };
15
- }
16
- function buildMetricDataQueries(namespace, periodSeconds, jobNames) {
17
- const queries = [
18
- {
19
- Id: 'm_total',
20
- MetricStat: {
21
- Metric: { Namespace: namespace, MetricName: 'JobCount' },
22
- Period: periodSeconds,
23
- Stat: 'Sum',
24
- },
25
- ReturnData: true,
26
- },
27
- {
28
- Id: 'm_errors',
29
- MetricStat: {
30
- Metric: { Namespace: namespace, MetricName: 'JobErrorCount' },
31
- Period: periodSeconds,
32
- Stat: 'Sum',
33
- },
34
- ReturnData: true,
35
- },
36
- {
37
- Id: 'm_retries',
38
- MetricStat: {
39
- Metric: { Namespace: namespace, MetricName: 'RetryCount' },
40
- Period: periodSeconds,
41
- Stat: 'Sum',
42
- },
43
- ReturnData: true,
44
- },
45
- {
46
- Id: 'm_duration_avg',
47
- MetricStat: {
48
- Metric: { Namespace: namespace, MetricName: 'JobDuration' },
49
- Period: periodSeconds,
50
- Stat: 'Average',
51
- },
52
- ReturnData: true,
53
- },
54
- {
55
- Id: 'm_duration_p95',
56
- MetricStat: {
57
- Metric: { Namespace: namespace, MetricName: 'JobDuration' },
58
- Period: periodSeconds,
59
- Stat: 'p95',
60
- },
61
- ReturnData: true,
62
- },
63
- ];
64
- for (let i = 0; i < jobNames.length; i++) {
65
- const name = jobNames[i];
66
- if (!name)
67
- continue;
68
- queries.push(createJobMetricStat(namespace, name, 'JobCount', `j_${i}_total`, periodSeconds, 'Sum'), createJobMetricStat(namespace, name, 'JobErrorCount', `j_${i}_errors`, periodSeconds, 'Sum'), createJobMetricStat(namespace, name, 'RetryCount', `j_${i}_retries`, periodSeconds, 'Sum'), createJobMetricStat(namespace, name, 'JobDuration', `j_${i}_duration_avg`, periodSeconds, 'Average'), createJobMetricStat(namespace, name, 'JobDuration', `j_${i}_duration_p95`, periodSeconds, 'p95'));
69
- }
70
- return queries;
71
- }
72
- function extractJobTypeStats(resultMap, jobNames) {
73
- const byJob = {};
74
- for (let i = 0; i < jobNames.length; i++) {
75
- const name = jobNames[i];
76
- if (!name)
77
- continue;
78
- const count = resultMap.get(`j_${i}_total`) ?? 0;
79
- const failedCount = resultMap.get(`j_${i}_errors`) ?? 0;
80
- byJob[name] = {
81
- jobName: name,
82
- count,
83
- succeededCount: Math.max(0, count - failedCount),
84
- failedCount,
85
- retryCount: resultMap.get(`j_${i}_retries`) ?? 0,
86
- avgDurationMs: Math.round(resultMap.get(`j_${i}_duration_avg`) ?? 0),
87
- p95DurationMs: Math.round(resultMap.get(`j_${i}_duration_p95`) ?? 0),
88
- };
89
- }
90
- return byJob;
91
- }
92
- function parseMetricResults(metricResults, jobNames) {
93
- const resultMap = new Map();
94
- for (const res of metricResults ?? []) {
95
- const val = res.Values && res.Values.length > 0 ? res.Values.reduce((a, b) => a + b, 0) : 0;
96
- resultMap.set(res.Id, val);
97
- }
98
- const totalExecuted = resultMap.get('m_total') ?? 0;
99
- const totalFailed = resultMap.get('m_errors') ?? 0;
100
- const totalRetried = resultMap.get('m_retries') ?? 0;
101
- const totalSucceeded = Math.max(0, totalExecuted - totalFailed);
102
- const avgDurationMs = Math.round(resultMap.get('m_duration_avg') ?? 0);
103
- const p95DurationMs = Math.round(resultMap.get('m_duration_p95') ?? 0);
104
- const successRate = totalExecuted > 0
105
- ? Math.round(((totalExecuted - totalFailed) / totalExecuted) * 10000) / 100
106
- : 100;
107
- return {
108
- totalExecuted,
109
- totalSucceeded,
110
- totalFailed,
111
- totalRetried,
112
- successRate,
113
- avgDurationMs,
114
- p95DurationMs,
115
- byJob: extractJobTypeStats(resultMap, jobNames),
116
- };
117
- }
118
- async function pollLogsQuery(client, queryId,
119
- // biome-ignore lint/suspicious/noExplicitAny: Dynamic command class constructor
120
- GetQueryResultsClass) {
121
- for (let i = 0; i < 10; i++) {
122
- const res = (await client.send(new GetQueryResultsClass({ queryId })));
123
- if (res.status === 'Complete') {
124
- return res.results ?? [];
125
- }
126
- if (res.status === 'Failed' || res.status === 'Cancelled') {
127
- break;
128
- }
129
- await new Promise((resolve) => setTimeout(resolve, 300));
130
- }
131
- return [];
132
- }
133
- function mapFailedJobRow(row) {
134
- const map = new Map();
135
- for (const cell of row) {
136
- if (cell.field && cell.value) {
137
- map.set(cell.field, cell.value);
138
- }
139
- }
140
- const timestampStr = map.get('@timestamp') ?? new Date().toISOString();
141
- const durationStr = map.get('JobDuration');
142
- const queueWaitStr = map.get('QueueWaitTime');
143
- return {
144
- jobId: map.get('JobId') ?? '',
145
- jobName: map.get('JobName') ?? '',
146
- attemptNumber: Number(map.get('AttemptNumber') ?? '1'),
147
- errorMessage: map.get('ErrorMessage') ?? '',
148
- errorName: map.get('ErrorName'),
149
- errorStack: map.get('ErrorStack'),
150
- failedAt: new Date(timestampStr),
151
- durationMs: durationStr ? Number(durationStr) : undefined,
152
- queueWaitTimeMs: queueWaitStr ? Number(queueWaitStr) : undefined,
153
- };
154
- }
155
- /**
156
- * Create an observability client for querying background job metrics and execution logs.
157
- *
158
- * @param options - Configuration options including namespace, logGroupName, and region.
159
- * @returns A JobsObservabilityClient instance.
160
- */
161
- export function createJobsObservabilityClient(options = {}) {
162
- const { namespace = 'Glasswork/Jobs', logGroupName, region = process.env.AWS_REGION || 'eu-west-1', } = options;
163
- let cwClient = options.cloudWatchClient ?? null;
164
- let cwLogsClient = options.cloudWatchLogsClient ?? null;
165
- async function getCloudWatchClient() {
166
- if (cwClient)
167
- return cwClient;
168
- try {
169
- const sdk = (await import('@aws-sdk/client-cloudwatch'));
170
- const CloudWatchClient = sdk.CloudWatchClient;
171
- cwClient = new CloudWatchClient({ region });
172
- return cwClient;
173
- }
174
- catch {
175
- throw new Error('Package "@aws-sdk/client-cloudwatch" is required to query metrics. Please install it or inject a cloudWatchClient.');
176
- }
177
- }
178
- async function getCloudWatchLogsClient() {
179
- if (cwLogsClient)
180
- return cwLogsClient;
181
- try {
182
- const sdk = (await import('@aws-sdk/client-cloudwatch-logs'));
183
- const CloudWatchLogsClient = sdk.CloudWatchLogsClient;
184
- cwLogsClient = new CloudWatchLogsClient({ region });
185
- return cwLogsClient;
186
- }
187
- catch {
188
- throw new Error('Package "@aws-sdk/client-cloudwatch-logs" is required to query logs. Please install it or inject a cloudWatchLogsClient.');
189
- }
190
- }
191
- return {
192
- async getSummary(queryOptions = {}) {
193
- const client = await getCloudWatchClient();
194
- const hours = queryOptions.hours ?? 24;
195
- const endTime = queryOptions.endTime ?? new Date();
196
- const startTime = queryOptions.startTime ?? new Date(endTime.getTime() - hours * 60 * 60 * 1000);
197
- const period = Math.max(60, Math.floor((endTime.getTime() - startTime.getTime()) / 1000));
198
- const jobNames = queryOptions.jobNames ?? [];
199
- const metricDataQueries = buildMetricDataQueries(namespace, period, jobNames);
200
- // biome-ignore lint/suspicious/noExplicitAny: Dynamic command invocation
201
- let CommandClass;
202
- try {
203
- const sdk = (await import('@aws-sdk/client-cloudwatch'));
204
- CommandClass = sdk.GetMetricDataCommand;
205
- }
206
- catch {
207
- CommandClass = class GetMetricDataCommand {
208
- input;
209
- constructor(input) {
210
- this.input = input;
211
- }
212
- };
213
- }
214
- const response = (await client.send(new CommandClass({
215
- StartTime: startTime,
216
- EndTime: endTime,
217
- MetricDataQueries: metricDataQueries,
218
- })));
219
- return parseMetricResults(response.MetricDataResults, jobNames);
220
- },
221
- async getJobTypeStats(jobName, queryOptions = {}) {
222
- const summary = await this.getSummary({
223
- ...queryOptions,
224
- jobNames: [jobName],
225
- });
226
- return (summary.byJob[jobName] ?? {
227
- jobName,
228
- count: 0,
229
- succeededCount: 0,
230
- failedCount: 0,
231
- retryCount: 0,
232
- avgDurationMs: 0,
233
- p95DurationMs: 0,
234
- });
235
- },
236
- async getFailedJobs(failedOptions = {}) {
237
- if (!logGroupName) {
238
- throw new Error('Option "logGroupName" is required to query failed jobs from CloudWatch Logs.');
239
- }
240
- const client = await getCloudWatchLogsClient();
241
- const limit = failedOptions.limit ?? 25;
242
- const endTime = failedOptions.endTime ?? new Date();
243
- const startTime = failedOptions.startTime ?? new Date(endTime.getTime() - 24 * 60 * 60 * 1000);
244
- const jobNameFilter = failedOptions.jobName ? `and JobName = "${failedOptions.jobName}"` : '';
245
- const queryString = `fields @timestamp, JobName, JobId, AttemptNumber, ErrorName, ErrorMessage, ErrorStack, JobDuration, QueueWaitTime
246
- | filter Status in ["failed", "dead_letter"] ${jobNameFilter}
247
- | sort @timestamp desc
248
- | limit ${limit}`;
249
- // biome-ignore lint/suspicious/noExplicitAny: Dynamic command invocation
250
- let StartQueryCommandClass;
251
- // biome-ignore lint/suspicious/noExplicitAny: Dynamic command invocation
252
- let GetQueryResultsCommandClass;
253
- try {
254
- const sdk = (await import('@aws-sdk/client-cloudwatch-logs'));
255
- StartQueryCommandClass = sdk.StartQueryCommand;
256
- GetQueryResultsCommandClass = sdk.GetQueryResultsCommand;
257
- }
258
- catch {
259
- StartQueryCommandClass = class StartQueryCommand {
260
- input;
261
- constructor(input) {
262
- this.input = input;
263
- }
264
- };
265
- GetQueryResultsCommandClass = class GetQueryResultsCommand {
266
- input;
267
- constructor(input) {
268
- this.input = input;
269
- }
270
- };
271
- }
272
- const startRes = (await client.send(new StartQueryCommandClass({
273
- logGroupName,
274
- startTime: Math.floor(startTime.getTime() / 1000),
275
- endTime: Math.floor(endTime.getTime() / 1000),
276
- queryString,
277
- })));
278
- if (!startRes.queryId) {
279
- return [];
280
- }
281
- const rows = await pollLogsQuery(client, startRes.queryId, GetQueryResultsCommandClass);
282
- return rows.map(mapFailedJobRow);
283
- },
284
- };
285
- }
286
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/jobs/observability/client.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import type { CloudWatchDashboardDefinition, GenerateJobsDashboardOptions, GetJobsInsightsQueriesOptions, JobsInsightsQueries } from './types.js';
2
- /**
3
- * Generate a production-ready AWS CloudWatch Dashboard JSON definition for background jobs.
4
- *
5
- * Can be deployed via AWS CLI (`aws cloudwatch put-dashboard`), AWS CDK (`CfnDashboard`),
6
- * or Terraform (`aws_cloudwatch_dashboard`).
7
- *
8
- * @param options - Dashboard configuration options (names, widgets, region).
9
- * @returns An object with dashboardName and serialized dashboardBody JSON.
10
- */
11
- export declare function generateJobsDashboard(options: GenerateJobsDashboardOptions): CloudWatchDashboardDefinition;
12
- /**
13
- * Returns a set of pre-canned CloudWatch Logs Insights queries for monitoring and troubleshooting jobs.
14
- *
15
- * @param options - Optional configuration for logGroupName and namespace filter.
16
- * @returns Queries for recent failures, slowest jobs, retries, and job tracing.
17
- */
18
- export declare function getJobsInsightsQueries(options?: GetJobsInsightsQueriesOptions): JobsInsightsQueries;
19
- //# sourceMappingURL=dashboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/jobs/observability/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,6BAA6B,CAqI/B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,6BAAkC,GAC1C,mBAAmB,CAerB"}